2009-09-10 3 views
0

Я присоединился к двум таблицам, каждый из которых содержит более 5000 записей. Я использовал два метода для присоединения. В первом запросе я использовал ключевое слово JOIN и дал условие в состоянии ON. Во втором запросе я просто использовал оператор запятой между таблицами и дал условие соединения в предложении WHERE.Выполнение SQL SERVER?

Какой из них будет эффективен в отношении времени и стоимости ....?

Когда я смотрю в план выполнения Первый запрос взял 61% от стоимости для сканирования таблицы и 38% для HASH MATCH (INNER JOIN)

Второй запрос занял 69% от стоимости для сканирования таблицы и 31% для HASH MATCH (INNER JOIN).

Можете ли вы объяснить мне эту разницу?

Iam, предположив, что первый из них эффективен, потому что стоимость сканирования стола меньше. Это правильно...?

+0

Этот вопрос не имеет смысла с указанием того, проиндексированы ли поля в одной или обеих таблицах и характер индекса – AnthonyWJones

+0

. Первый запрос выполняет сканирование таблицы - если возможно, вы должны установить внешний ключ в таблице, -кластеризованный индекс. Затем запрос должен привести к сканированию индекса - значительно быстрее. – Paul

ответ

1

Это звучит для меня, как план запроса был таким же в обоих случаях ... так как у вас было сканирование стола и хеш-совпадение как раз ...

Прежде чем вы попытаетесь сравнить эти проценты ...Позвольте мне проиллюстрировать опасность с этим вопросом:

который больше

61% of 465 

или

69% of 234 

??

В этом случае вы можете увидеть, что 69% из 234 будут «быстрее», чем 61% для 465. Его все относительно общей стоимости запроса.

Будьте осторожны, просто сравнивая проценты, потому что вы не знаете, какое фактическое значение соответствует 100% в обоих случаях ... например. стоимость выполнения TOTAL, возможно, была ниже во втором случае.

0

Определите «эффективный». Если скорость является вашей целью, выберите «показать статистику клиента», запустите оба запроса не менее десятка раз (в разных окнах запросов, конечно) и оцените результаты.

0

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

  1. Какой вариант производит план запроса, который лучше оптимизирован.

  2. Что более удобно обслуживать, если код необходимо будет установить позже , чтобы включить более объединенные (INNER или OUTER) таблицы.

INNER JOIN vs WHERE clause

1

TABLE SCAN означает, что он должен прочитать каждую строку в таблице. Обычно с планами исполнения вы пытаетесь избавиться от сканирования таблицы, используя, по возможности, индексы и т. Д. Сканирование таблицы обычно является основной причиной медленных запросов. (По моему опыту)

Процентное снижение только улучшение, если общее время SQL требуется, чтобы запустить это уменьшает по сравнению с тем, что было ранее

Например, если первый запрос с несколько уменьшенной ТАБЛИЦЫ СКАН взял 20 секунд вместо 10, то это не так эффективно.

Конечно, если вы хотите оптимизировать свой запрос, существует целый ряд методов, которые вы можете применить, чтобы попытаться его улучшить. (Мастер настройки индексов, создание индексов (кластерный/Non кластеризованного) Просмотр плана выполнения - Выявление потенциальных узких мест и т.д ...)

SQL Оптимизации св Artform в себе

Смежные вопросы