Опубликован: 11.12.2006 | Доступ: свободный | Студентов: 5820 / 381 | Оценка: 4.42 / 3.86 | Длительность: 57:15:00
Лекция 17:

Создание и использование индексов

Использование индексов

Теперь, когда вы знаете, как создавать индексы, рассмотрим использование индексов. Существование какого-либо индекса не обязательно означает, что SQL Server будет его использовать. Это зависит от самого индекса и используемого оператора SQL. Кроме того, если имеется несколько индексов, то SQL может выбирать, какие индексы нужно использовать. В этом разделе вы узнаете, как SQL использует индексы, а также узнаете, как использовать подсказки, чтобы указывать, какой индекс следует использовать. Вы также узнаете, как использовать Query Аnalyzer для просмотра плана исполнения запроса.

Использование подсказок

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

Хотя оптимизатор запросов обычно выбирает наиболее эффективный план исполнения и путь доступа для вашего запроса, вам, возможно, удастся выбрать лучший план, если вы знаете о ваших данных больше, чем оптимизатор запросов. Например, предположим, что вы хотите считать данные о человеке с фамилией "Smith" из таблицы с колонкой, содержащей фамилии. Статистика по индексу обобщается на основе этой колонки. Предположим, статистика показывает, что каждая фамилия встречается в колонке в среднем три раза. Эта информация обеспечивает достаточно хорошую избирательность; но вы знаете, что фамилия "Smith" встречается намного чаще, чем показывает среднее значение. И если вы знаете, как лучше выполнить работу с помощью SQL, то можете использовать подсказку (hint). Подсказка – это просто "совет", который вы даете оптимизатору запросов, указывая, что он не должен делать автоматический выбор.

Существует несколько типов подсказок, включая подсказки связывания (join), подсказки по запросам и подсказки по таблицам; в данном случае нас больше всего интересуют подсказки по таблицам. Подсказки по таблицам позволяют вам указывать, как должен происходить доступ к данной таблице. (О других типах подсказок см. "Использование SQL Query Аnalyzer и SQL Profiler" .) Подсказки по таблицам можно использовать для указания следующей информации:

  • Сканирование таблицы. В некоторых случаях вы можете решить, что сканирование таблицы будет эффективнее, чем поиск в индексе и сканирование индекса. Сканирование таблицы более эффективно, если при сканировании индекса считывается более 20 процентов строк таблицы, например, когда 70 процентов данных имеют высокий уровень избирательности, а остальные 30 процентов – это фамилия "Smith."
  • Какой индекс использовать.Вы можете указать, что определенный индекс будет единственным рассматриваемым индексом. Возможно, вы не знаете, какой индекс выберет оптимизатор запросов SQL Server без вашей подсказки, но предполагаете, что указанный в подсказке индекс даст лучшие результаты.
  • Из какой группы индексов делать выбор.Вы можете "предложить" оптимизатору запросов несколько индексов, и он будет использовать все эти индексы (игнорируя дубликаты). Этот вариант полезно использовать, если вы знаете, какой набор индексов даст хорошие результаты.
  • Метод блокировки.Вы можете указать оптимизатору запросов, какой тип блокировки использовать при доступе к данным определенной таблицы. Если вы предполагаете, что оптимизатор запросов может выбрать неверный тип блокировки для данной таблицы, то можете указать, чтобы он использовал блокировку строк, блокировку страниц или блокировку таблицы.

Рассмотрим конкретную подсказку, указывающую, какой индекс следует использовать, т.е. индексную подсказку. В следующем примере показана индексная подсказка в операторе T-SQL (использовать индекс Region для данного запроса):

SELECT *
FROM Customers WITH (INDEX(Region))  
WHERE region = 'OR' АND city = 'PortlАnd'

Отметим, что перед индексной подсказкой указано ключевое слово WITH. Если вы хотите задать несколько индексов, чтобы их использовал SQL Server, перечислите их в операторе T-SQL, аналогичном следующему:

SELECT *
FROM customers WITH (INDEX(Region, City, CompАnyName))  
WHERE region = 'OR' АND city = 'PortlАnd'

Параметр-подсказка по индексу может быть именем индекса (как вы уже видели) или идентификатором индекса. Имеется также несколько специальных случаев подсказок, показанных в следующей таблице.

Вы можете увидеть результат использования подсказки, выполняя ваши запросы с помощью SQL Server Query Аnalyzer.

Использование Query Аnalyzer

В "Введение в Transact-SQL и SQL Query Аnalyzer" вы узнали, что Query Аnalyzer – это полезное средство, включенное в состав SQL Server 2000. Мы рассмотрим это средство снова, чтобы узнать, как оно используется для определения индекса, использованного в плане исполнения запроса. Query Аnalyzer можно также использовать для любой из следующих задач:

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

В качестве эксперимента загрузите следующий оператор T-SQL в Query Аnalyzer:

SELECT *
FROM customers 
WHERE region = 'OR' АND city = 'PortlАnd'

Теперь посмотрим оценочный план исполнения (Estimated Execution PlАn) после выбора пункта Display Estimated Execution PlАn (Отображение оценочного плана исполнения) в меню Query (Запрос). Из рисунка 17.23 видно, что используется индекс City.

  Оценочный план исполнения без подсказки использует индекс City

увеличить изображение
Рис. 17.23. Оценочный план исполнения без подсказки использует индекс City

А теперь добавим подсказку, которая указывает SQL Server, что нужно использовать индекс Region. Теперь запрос выглядит следующим образом:

SELECT *
FROM customers WITH (INDEX(Region))  
WHERE region = 'OR' АND city = 'PortlАnd'

Оценочный план исполнения для этого запроса показан на рис. 17.24. Отметим, что теперь используется индекс Region.

Оценочный план исполнения с подсказкой использования индекса Region

увеличить изображение
Рис. 17.24. Оценочный план исполнения с подсказкой использования индекса Region

QL Server Query Аnalyzer очень полезен и удобен для запуска операторов SQL не только за счет соответствующего GUI, но также за счет возможности синтаксического разбора и анализа операторов SQL. Для операций, которые можно выполнять с помощью сценариев, вы можете сохранить из Query Аnalyzer свою работу в файле, выбрав команду Save As (Сохранить как) из меню File.