2009-11-05 3 views
2

У меня проблема с производительностью с выражением select, которое я выполняю.Производительность выписки

Здесь:

SELECT  Material.* 
FROM  Material 
INNER JOIN LineInfo ON Material.LineInfoCtr = LineInfo.ctr 
INNER JOIN Order_Header ON LineInfo.Order_HeaderCtr = Order_Header.ctr 
WHERE (Order_Header.jobNum = 'ttest') 
    AND (Order_Header.revision_number = 0) 
    AND (LineInfo.lineNum = 46) 

Оператор принимает 5-10 секунд, чтобы выполнить в зависимости от нагрузки на сервер.

Немного статистики стола:

- Material has 2,030,xxx records. 
- Lineinfo has 190,xxx records 
- Order_Header has 2,5xx records. 

Мое заявление возвращается в общей сложности 18 строк, содержащий около 20-25 полей данных. Возврат одного поля или все из них не имеет значения. Является ли эта характеристика типичной? Я могу что-то сделать, чтобы улучшить его?

Я пробовал использовать вспомогательный выбор для извлечения внешнего ключа, предложение IN, и я нашел одно сообщение, в котором помог парень, используя левое внешнее соединение. Для меня все они дают то же самое 5-10 секунд времени выполнения.

Это MS SQL Server 2005, доступ к которому осуществляется через студию управления MS SQL. Время - это прошедшее время в анализаторе запросов.

Любые идеи?

+0

Каковы индексы? Вы знаете, как отображать и анализировать план запроса? – gerleim

ответ

2

Первое, что вам нужно сделать, это analyze the query plan, чтобы узнать, какие индексы (если они есть) используется SQL Server.

Вы, вероятно, может извлечь выгоду из некоторого covering indexes в этом запросе, так как вы используете только столбцы в Lineinfo и Order_Header для присоединения и ограничения запроса (где положение).

1

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

У вас есть индексы в таблице, участвующие в запросе, и вы пытались использовать параметр «План выполнения отображения» в Query Analyzer. В основном вам нужно запустить запрос, зациклиться на плане выполнения и добавить индексы, чтобы вы не увидели никакой операции полного сканирования таблицы.

Если вы запускаете студию управления SQL, то у вас есть возможность автоматически настраивать запрос, добавляя индексы, но я бы предложил попробовать оптимизировать самостоятельно, чтобы лучше понять, что вы делаете.

С уважением Massimo

1

Это не повлияет на производительность, но не написать запрос, такой как "SELECT * FROM X". Отметьте звездную нотацию и укажите отдельные столбцы. Код, который вызывает это, по-прежнему будет работать таким же образом, даже если схема будет изменена путем добавления столбца.

Индексы являются ключевыми здесь, как уже говорили другие.

Порядок предложений WHERE может помочь. Выполните тот, который сначала исключает наибольшее количество строк.

1

Принимая все предложения и сворачивая их вместе, мне удалось установить некоторые индексы, и теперь это занимает менее секунды для выполнения. Честно говоря, это почти сразу.

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

Спасибо за помощь и извините за такой вопрос newb.

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