Заменить ВНУТРЕННИЕ СОЕДИНЕНИЯ с несколькими выборами? - PullRequest
1 голос
/ 01 ноября 2019

У меня есть таблица 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).

Итак, очевидно, что второй способ постился, но мне было интересно, если это действительно хорошая идея, или, может быть, есть другие решения для быстрого выполнения этого простого запроса?

1 Ответ

2 голосов
/ 01 ноября 2019

Вы объединяете разные измерения, в результате чего получается декартово произведение для одного пользователя.

Очевидно, что INNER JOIN не возвращает разумный набор результатов, потому что вы получаете гораздо больше строк, чемвам нужно.

Если отдельные запросы удовлетворяют вашим потребностям, то это, безусловно, реальная альтернатива. Вы не можете легко объединить их в один запрос, используя UNION ALL, потому что столбцы (по всей вероятности) совершенно разные.

В противном случае вам нужно определиться с набором результатов, который вам действительно нужен. Затем вы можете спросить, как именно это вернуть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...