У меня есть таблица Screening
, которая содержит несколько проверок, первичный ключ - int. У меня также есть 6 других таблиц (LengthMeasurement
, WeightMeasurement
и т. Д.), Которые связаны с ограничением внешнего ключа для таблицы Screening
.
Для того, чтобы получить проверку и всю связанную с ней информациюЯ впервые использовал INNER соединение как:
SELECT *
FROM [user].[Screening] scr
INNER JOIN [user].[LengthMeasurement] lm ON scr.Id = lm.ScreeningId
INNER JOIN [user].[WeightMeasurement] wm ON scr.Id = wm.ScreeningId
INNER JOIN [user].[Note] n ON scr.Id = n.ScreeningId
INNER JOIN [user].[IntakeRegistration] ir ON scr.Id = ir.ScreeningId
INNER JOIN [user].[RiskProfile] rfr ON scr.Id = rfr.ScreeningId
INNER JOIN [user].[OncologyTasteAnamnesis] ota ON scr.Id = ota.ScreeningId
WHERE scr.UserId = 2
Однако даже при небольшом объеме данных это уже занимает около 2 секунд и получает более 30 000 строк (декартово произведение).
Если я делаю то же самое, но на этот раз только с простыми SELECTS, например:
SELECT * FROM [user].[Screening] scr WHERE UserId = 2
SELECT * FROM [user].[LengthMeasurement] WHERE [ScreeningId] IN
(
SELECT Id FROM [user].[Screening]
WHERE UserId = 2
)
SELECT * FROM [user].[WeightMeasurement] WHERE [ScreeningId] IN
(
SELECT Id FROM [user].[Screening]
WHERE UserId = 2
)
SELECT * FROM [user].[Note] WHERE [ScreeningId] IN
(
SELECT Id FROM [user].[Screening]
WHERE UserId = 2
)
SELECT * FROM [user].[IntakeRegistration] WHERE [ScreeningId] IN
(
SELECT Id FROM [user].[Screening]
WHERE UserId = 2
)
SELECT * FROM [user].[RiskProfile] WHERE [ScreeningId] IN
(
SELECT Id FROM [user].[Screening]
WHERE UserId = 2
)
SELECT * FROM [user].[OncologyTasteAnamnesis] WHERE [ScreeningId] IN
(
SELECT Id FROM [user].[Screening]
WHERE UserId = 2
)
Как это, это несколько миллисекунд, и я получаю только необходимые строки (35).
Итак, очевидно, что второй способ постился, но мне было интересно, если это действительно хорошая идея, или, может быть, есть другие решения для быстрого выполнения этого простого запроса?