Почему разница в производительности между двумя запросами? - PullRequest
0 голосов
/ 31 июля 2010

Я использую SQL Server 2008, и у меня есть две таблицы

Table1

содержит 3,5 миллиона записей

+----+-------------+
| pk | dim1        |
+----+-------------+
indexing applied on column **pk**

Table2

содержит 15 миллионов записей

+----+-------------+
| fk | fact1       |
+----+-------------+
indexing applied on column **fk**

Я выполнил 2 запроса к этой таблице, чтобы получить t2.fact1

Query1

SELECT t2.fact1 
FROM Table1 AS t1, Table2 AS t2 
WHERE t2.fk = t1.pk

Query2

SELECT t2.fact1 
FROM Table1 
WHERE t2.fk IN (SELECT t1.pk FROM Table1 AS t1)

Результат, который получил Query1, занял 7 secs, тогда как Query2 занял 6 secs

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

Вопрос № 1: Кто-нибудь может подсказать, почему Query2 был быстрее?

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

Вопрос № 2: Кто-нибудь может подсказать, почему Query2 был быстрее?

1 Ответ

4 голосов
/ 31 июля 2010

6 против 7 секунд могут легко быть ошибками измерения

  • Запустите оба и посмотрите фактический план выполнения
  • Запустите несколько раз и сравните время
  • Второй запрос может выполняться с данными в кеше, первый - нет. Использовать DBCC DROPCLEANBUFFERS

Замечание: Вы должны использовать эту конструкцию

Select t2.fact1 from
    Table1 as t1 JOIN table2 as t2 on t2.fk=t1.pk

Edit:

  • DBCC DROPCLEANBUFFERS очистит кеш данных
  • Синтаксис JOIN лучше и понятнее

Конечно, теперь я понимаю, что разница будет вызвана тем, что запрос 1 даст разные результаты из-за умножения строк. То есть у вас есть несколько дочерних строк на родительскую строку. In не будет этого делать.

Обычно я продолжаю в том же духе, но раньше не замечал этого.

Теперь я хочу узнать, сколько строк возвращается каждым запросом ...

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