Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как оптимизатор считает?  [new]
Ольга Кравцова
Guest
Если в статистике Rows = Sampled Rows, то в случае когда значение переменной не известно, видно что он умножает Rows * All Density, а как он рассчитывает, когда статистика выполнена не методом WITH FULLSCAN Rows <> Sampled Rows? Посчитала как Rows * All Density, не сошлось.
8 апр 15, 15:47    [17489369]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизатор считает?  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Ольга Кравцова,

1. Проверьте, что используете для расчета ту же статистику, что и оптимизатор.
2. Перепроверьте расчет
Если не поможет, то покажите (желательно с репро), как вы считали, в простых случаях такого быть не должно. Если только у вас нет всяких нюансов, типа многоколоночных предикатов, optimize for, etc.
8 апр 15, 16:12    [17489548]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизатор считает?  [new]
Ольга Кравцова
Guest
SomewhereSomehow
Ольга Кравцова,

1. Проверьте, что используете для расчета ту же статистику, что и оптимизатор.
2. Перепроверьте расчет
Если не поможет, то покажите (желательно с репро), как вы считали, в простых случаях такого быть не должно. Если только у вас нет всяких нюансов, типа многоколоночных предикатов, optimize for, etc.


Пересчитала, помогло. Получается, даже в случае статистики НЕ WITH FULLSCAN, оптимизатор считает, что распределение одинаковое и просто умножает Rows * All Density? А я думала как-то так считать должен Rows * 1 / ((Rows / SampledRows) * (1 / AllDensity)). А как узнать, какую статистику использует оптимизатор, вероятно какие-то трассировочное номера надо использовать, в документации не нашла?
8 апр 15, 16:50    [17489858]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизатор считает?  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Ольга Кравцова
Пересчитала, помогло. Получается, даже в случае статистики НЕ WITH FULLSCAN, оптимизатор считает, что распределение одинаковое и просто умножает Rows * All Density? А я думала как-то так считать должен Rows * 1 / ((Rows / SampledRows) * (1 / AllDensity)).

В основе формул расчета селективности/кардинальности лежат формулы из теории вероятности и допущения.

Представьте, что у вас есть коробка, в которой есть три шарика: красный, синий, зеленый. Какова вероятность достать красный? Очевидно 1/3. Это All Density. Теперь, добавили в коробку много шаров из тех же трех цветов. Сколько шариков будет красного цвета, если мы достанем из коробки все шарики? Очевидно, что если мы не знаем сколько в коробку было добавлено шариков каждого из цветов (нет гистограммы), то предполагаем равномерное распределение. Т.е. Число красных шаров = (Число шариков)* (вероятность достать красный шар). Это кардинальность. На деле, гистограмма есть, но ее нельзя использовать, т.к. мы не знаем, шар какого цвета мы хотим достать (во время компиляции нам неизвестно значение переменной).

Теперь вы говорите, ок, я возьму для вычисления распределения не всю коробку а ее часть, но распределение равномерное и там опять должно быть всего три цвета шаров, т.е. 1/3. Далее в формуле вы зачем-то берете ту часть шариков, что брали для определения вероятности и делите на общее число шариков - что это такое - непонятно, видимо какой процент...

Вы чисто математически попробуйте вашу формулу упростить:
Rows * 1 / ((Rows / SampledRows) * (1 / AllDensity)) = Rows/ [(Rows / SampledRows) * (1 / AllDensity)] = Rows/ [Rows / (SampledRows * AllDensity)] = 1/1/(SampledRows * AllDensity) = SampledRows * AllDensity. Т.е. вы узнали, сколько у вас шариков определенного цвета в той выборке, что вы использовали для генерации статистики.

Ольга Кравцова
А как узнать, какую статистику использует оптимизатор, вероятно какие-то трассировочное номера надо использовать, в документации не нашла?

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

И известных мне способов посмотреть какая статистика была использована для компиляции:
Для 2014 TF 2363
Для версий ниже TF 9292, TF 9204 или TF 8666.

Ну и конечно, все это не документировано, но полезно для ознакомления.
8 апр 15, 18:47    [17490533]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизатор считает?  [new]
Ольга Кравцова
Guest
SomewhereSomehow,

Спасибо за сайт, убежала читать.
8 апр 15, 20:19    [17490743]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить