Извлечение данных из 2 таблиц, которые имеют отношение 1 ко многим - более эффективно с 1 запросом или 2? - PullRequest
0 голосов
/ 13 марта 2012

Мне нужно выборочно получать данные из двух таблиц, которые имеют отношение 1 ко многим. Ниже приведен упрощенный пример.

Таблица A представляет собой список событий:

Id  |  TimeStamp  |  EventTypeId
--------------------------------
1   |  10:26...   |  12
2   |  11:31...   |  13
3   |  14:56...   |  12

Таблица B - это список свойств для событий. Различные типы событий имеют разное количество свойств. Некоторые типы событий вообще не имеют свойств:

EventId | Property | Value
------------------------------
1       | 1        | dog
1       | 2        | cat
3       | 1        | mazda
3       | 2        | honda
3       | 3        | toyota

Существует ряд условий, которые я буду применять при извлечении данных, однако все они вращаются вокруг таблицы A. Например, мне могут потребоваться только события определенного дня или только события определенного типа.

Мне кажется, у меня есть два варианта получения данных:

Вариант 1
Выполните два запроса: сначала запросите таблицу A (с предложением WHERE) и сохраните где-нибудь данные, затем запросите таблицу B (объединение с таблицей A, чтобы использовать то же предложение WHERE) и «заполните пробелы» в данных, которые я извлек из таблица А.

Для этого параметра требуется, чтобы SQL Server выполнил 2 поиска в таблице A. Однако полученные 2 набора данных не содержат повторяющихся данных.

Вариант 2
Выполните один запрос, соединив таблицу A с таблицей B с помощью LEFT JOIN.

Эта опция требует только одного поиска в таблице A, но результирующий набор данных будет содержать много дублированных значений.

Заключение
Есть ли «правильный» способ сделать это, или мне нужно попробовать оба способа и посмотреть, какой из них быстрее?

1 Ответ

0 голосов
/ 13 марта 2012

Пример

Select E.Id,E.Name from Employee E join Dept D on E.DeptId=D.Id 

и подзапрос что-то вроде этого -

Select E.Id,E.Name from Employee Where DeptId in (Select Id from Dept) 

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

ОЖИДАЕТ, что первый запрос будет быстрее, в основном потому, что у вас есть эквивалентность и явное JOIN.По моему опыту IN является очень медленным оператором, так как SQL обычно оценивает его как последовательность предложений WHERE, разделенных «ИЛИ» (ГДЕ x = Y OR x = Z OR ...).

Как и для ALLВещи SQL, однако, ваш пробег может отличаться.Скорость будет во многом зависеть от индексов (у вас есть индексы для обоих столбцов идентификаторов? Это очень поможет ...).

Единственный РЕАЛЬНЫЙ способ сказать со 100% уверенностью, что быстрееэто включить отслеживание производительности (особенно полезна статистика ввода-вывода) и запустить их оба.Обязательно очищайте кэш между запусками!

Подробнее REF

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