|
|
|||||||||||||||||||||||||||||
|
Недокументированные возможности Microsoft SQL Server: STATISTICS_ONLY, DBCC AUTOPILOT и SET AUTOPILOTИсточник: habrahabr unfilled
Как известно, оптимизатор запросов SQL Server, для построения оптимального плана выполнения запроса, использует оценку стоимости. SQL Server строит и оценивает множество планов и выбирает среди них план с минимальной стоимостью. Одна из проблем, с которой мы периодически сталкиваемся, заключается в том, что для того чтобы понять как новый индекс повлияет на выполнение конкретного запроса, нам необходимо создать этот индекс. Иногда, особенно когда таблица очень велика, процесс создания индекса настолько затягивается, что превращается в настоящий кошмар. Более того, после 20 минут ожидания, мы вполне можем обнаружить, что только что созданный индекс, при выполнении запроса, вообще не используется. Собственно, вопрос заключается в том как создать "гипотетический" индекс? Просто для того, чтобы проверить действительно ли такой индекс будет полезен при выполнении запроса. WITH STATISTICS_ONLYДля создания гипотетического индекса, мы можем использовать недокументированную возможность команды CREATE INDEX. Например:
В результате будет создана статистика по этому индексу (построена гистограмма и рассчитана плотность) и появится запись в sys.indexes. Вы можете проверить это с помощью sp_helpindex и DBCC SHOWSTATISTICS:
P.S. Если вы создадите индекс используя WITH STATISTICS_ONLY = 0, SQL Server не будет создавать статистику. Только гипотетический индекс.
DBCC AUTOPILOT и SET AUTOPILOTТеперь у нас есть гипотетический индекс, как нам его использовать? Можно попробовать указать его явно, с помощью хинта:
и получить ошибку: А если указать Index ID?
Тоже самое: Так каким же образом мы можем создать план запроса, учитывающий этот индекс? Вот здесь-то и начинается вся забава. DBCC AUTOPILOT используется для того, чтобы сказать оптимизатору, что при составлении плана нужно учитывать существование определённого индекса. Эта DBCC, совместно с флагом SET AUTOPILOT ON позволяют нам использовать этот индекс. Посмотрим на синтаксис этой команды:
ТестируемИтак, посмотрим как это всё работает.
прим. переводчика: Что из себя представляет параметр TypeID, естественно, неизвестно, в другой своей статье, ссылка на которую есть ниже, тот же самый автор, пишет, что для использования определённого индекса в режиме "автопилота", нужно указывать 0
ВыводыВ описании этих возможностей остаётся достаточно "белых пятен", но я уверен, что что этот пост будет хорошей отправной точкой для ваших собственных тестов. Я до сих пор играюсь с этой штукой, так что вы можете спокойно задавать мне вопросы, или делиться своими открытиями. И вам ведь не нужно говорить, что вы не должны использовать всё это на рабочих серверах? Это недокументированная возможность, так что никто не может вам точно сказать что и как она делает, до тех пор пока парни из Microsoft не сделают её официально публичной и документированной. Ссылки по теме
|
|