Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Тоу Д. -> "Настройка SQL. Для профессионалов" -> 64

Настройка SQL. Для профессионалов - Тоу Д.

Тоу Д. Настройка SQL. Для профессионалов — СПб.: Питер, 2004. — 333 c.
ISBN 5-94723-959-0
Скачать (прямая ссылка): nastroykasqldlyaprof2004.djvu
Предыдущая << 1 .. 58 59 60 61 62 63 < 64 > 65 66 67 68 69 70 .. 161 >> Следующая


Управление планами в SQL Server

Процесс настройки в SQL Server состоит из трех основных шагов.

1. Предоставление оптимизатору хорошей статистики по таблицам и индексам, чтобы он мог точно подсчитать стоимость различных вариантов.

2. Изменение запроса, чтобы запретить нежелательные планы выполнения, используя, в основном, методы, характерные для SQL Server.

3. Если необходимо, принудительный выбор простого плана выполнения при помощи инструкции FORCEPLAN.

Подготовка к оптимизации в SQL Server

В очередной раз доказывая, что недостаток знания опасен, стоимостные оптимизаторы часто выдают плохие результаты, если им не предоставлена статистика по всем таблицам и индексам, участвующим в запросе. Таким образом, вам обязательно нужно поддерживать достоверную статистику по таблицам и индексам, и помимо этого, заново генерировать статистику в случае, если объем таблицы существенно изменяется или перестраиваются таблицы или индексы. Самый безопасный способ — периодически заново генерировать статистику, используя для этого отрезки времени, когда нагрузка невелика, например, зто может быть ночь или выходные. В Query Analyzer выполните следующую команду, затем скопируйте и вставьте полученные команды UPDATE STATISTICS в окно запроса и снова выполните их:

-- file called updatealI.sql -- update your whole database SELECT 'UPDATE STATISTICS '. name FROM sysobjects WHERE type = 1U'
126

4. Управление планами выполнения

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

Иногда бывает полезно помочь SQL Server определить селективность условия с асимметричным распределением, даже если это распределение относится к не индексированному столбцу. В таком случае вам необходимо особым образом запросить данные из этого столбца. Например, чтобы получить статистическую группу с именем Efl ад по не индексированному столбцу Exempt_Fl ад таблицы Empl oyees, выполните:

CREATE STATISTICS EFlag on Employees(Exempt_Flад)

В качестве примера случая асимметричного распределения возьмем таблицу Orders, в поле Status Code которой может быть три значения: 'CL' для закрытых (например, выполненных) заказов, 'CA' для отмененных заказов и 'OP' для открытых заказов. Таким образом, большинство заказов будет выполнено, то есть если приложение проработало несколько месяцев, количество значений ' CL' стабильно растет. Значительная часть заказов будет в итоге отменена, поэтому значение ' CA ’ в итоге также будет встречаться в большом списке заказов. Однако если бизнес идет хорошо и заказы продолжают поступать, то количество открытых заказов будет оставаться умеренным и стабильным, даже если данные будут накапливаться годами. Скоро условие Status_Code='OP' станет достаточно селективным, чтобы предпочесть соединение соответствующих таблиц, даже если столбец Status_Code не индексирован, и важно, чтобы оптимизатор мог понять этот факт, лучше — без ручной настройки. Для этого в SQL в условии нужно явно указать необходимое значение, а не использовать общую хранимую процедуру, которая просто выдает константу после разбора, во время выполнения.

Изменение запроса

Чаще всего следует настраивать SQL Server, используя подсказки. Подсказки обычно указываются в разделе FROM, где воздействуют на доступ к определенной таблице, или в операторе SQL Server OPTION () в самом конце запроса. Далее перечислены наиболее распространенные подсказки.

¦ WITH (INDEX (<Имя_инрекса>)). Эта подсказка должна находиться сразу же за псевдонимом таблицы в разделе FROM. Она заставляет SQL Server использовать для доступа к этому псевдониму таблицы указанный индекс. Поддерживается также старый синтаксис, 1ШЕК=<Имя_индекса>, но в будущем от него могут отказаться, поэтому я не рекомендую использовать его. Еще более устаревшим и опасным является пока что поддерживаемый метод указания внутреннего идентификатора объекта, соответствующего желаемому индексу. Указание индекса при помоши идентификатора очень ненадежно, поскольку индекс получит новый идентификатор, если кто-нибудь удалит и заново создаст его или если приложение будет перенесено в новую базу данных SQL Server.
Управление планами в SQL Server

127

¦ WITH (INDEX (О)). Эта подсказка должна находиться сразу же за псевдонимом таблицы в разделе FROM. Она заставляет SQL Server обращаться к этому псевдониму таблицы при помощи полного сканирования.

¦ WITH (NOLOCK). Эта подсказка должна находиться сразу же за псевдонимом таблицы в разделе FROM. Она заставляет SQL Server считывать данные из таблицы с указанным псевдонимом, не применяя блокировок или каких-либо других мер для обеспечения непротиворечивости. Блокировки считывания в SQL Server могут создать «узкое место», если их применять во время активного обновления таблицы. Эта подсказка предотвращает появление такой проблемы, возможно, за счет стоимости непротиворечивого представления данных на какой-то конкретный момент времени.
Предыдущая << 1 .. 58 59 60 61 62 63 < 64 > 65 66 67 68 69 70 .. 161 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100