Можете ли вы объяснить оптимизацию запроса? Почему это быстрее, и как я могу извлечь уроки из этого примера? - PullRequest
2 голосов
/ 01 марта 2011

Мой друг оптимизировал мой запрос из

Мой запрос:

select * from A a
inner join B b
on a.A_ID = b.B_ID
where a.event_ID = ( select event_ID from C where Cval = 1234)

Его версия:

select * from A a
inner join B b on a.A_ID = b.B_ID
where exists (
    select TOP 1 event_ID
    from C where Cval = 1234 and event_ID = a.event_ID
)

Он говорит, что он должен быть более эффективным.Почему это будет более эффективно, и в будущем, как бы я обнаружил ту же / аналогичную проблему и какие шаги и анализ я бы сделал, чтобы провести аналогичную оптимизацию?Будет ли это просто один из тех приемов оптимизации, которые распознает каждый опытный разработчик баз данных?

Я пытаюсь понять черную магию, с которой он здесь столкнулся.Любые советы приветствуются.Я использую SQL Server 2008.

Ответы [ 2 ]

1 голос
/ 01 марта 2011

Запросы различны, в частности второй указывает, что:

C.event_ID = a.event_ID

Где первый нет.

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

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

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

1 голос
/ 01 марта 2011

Цель настройки производительности базы данных - минимизировать время ответа на ваши запросы и максимально эффективно использовать ресурсы вашего сервера, сводя к минимуму сетевой трафик, дисковый ввод-вывод и время ЦП. Эта цель может быть достигнута только путем понимания логической и физической структуры ваших данных, понимания приложений, используемых на вашем сервере, и понимания того, как много противоречивых вариантов использования вашей базы данных могут повлиять на производительность базы данных.

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

Также эта ссылка может вам помочь http://beginner -sql-tutorial.com / SQL-запрос-tuning.htm

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