SomewhereSomehow's Notes


Columnstore Batch Execution и Compute Scalar

На прошедшей конференции 24HOP Russia я рассказывал о Columnstore индексах и оптимизаторе запросов. К сожалению, мне не хватило времени поделиться всеми интересными примерами, и в этой заметке я расскажу об одном любопытном случае, который влияет на производительность запроса и Columnstore индекса.
Читать дальше
добавлено: 12 апр 13 просмотры: 166, комментарии: 0



Оптимизатор без границ (ч.2)

Продолжаем отключать внутренние пороги оптимизатора.

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


Осталось несколько других механизмов управляющих тем, когда происходит оптимизация и какие учитываются альтернативы:
  • Timeout
  • Cost Based Pruning Factor
  • Discarding
    Читать дальше
  • добавлено: 11 дек 12 просмотры: 710, комментарии: 3



    Оптимизатор без границ (ч.1)

    На недавнем мероприятии SQL Saturday 178, мне задали вопрос, можно ли сделать так, чтобы оптимизатор не прекращал оптимизацию, когда посчитает, что уже нашел хороший план или наступил таймаут, а исследовал все альтернативы. Я ответил, что документированных средств нет, либо я о таких не знаю. И это действительно так, однако, возможно есть какие-то недокументированные флаги трассировки, которыми можно влиять на этот процесс. Я решил провести небольшое исследование, и в этой заметке расскажу о его результатах.

    Забегая вперед, сразу сообщу об итогах исследования, для тех кому не важны технические подробности, а важны выводы. Оказывается, действительно можно сделать так, чтобы оптимизатор продолжал поиски «до упора», но вероятность, что он действительно найдет гораздо более удачный план невелика. Это логично, иначе, если бы оптимизатор очень часто «недооптимизировал» запросы, прекращая поиски раньше положенного, то следовало бы поменять механизм определения того самого момента, когда считается, что искать план дальше не имеет смысла.

    Между тем, оптимизатор довольно неплохо справляется со своей задачей, а когда не справляется, причина очень часто кроется не в самом оптимизаторе, а в том, с чем ему приходится работать (неактуальная статистика, плохо написанный код и т.д.). Хотя, ради справедливости, стоит сказать, что бывают случаи, когда причина в самом оптимизаторе.

    Далее, я расскажу о том, как заставить оптимизатор отбросить ограничения и продолжать оптимизацию до конца.
    Читать дальше
    добавлено: 06 дек 12 просмотры: 820, комментарии: 0



    Ошибка вычисления селективности для предикатов с isnumeric

    Недавно на одном из форумов был задан вопрос о том, почему при добавлении в запрос условия isnumeric(column)=0, запрос начинает выполняться очень медленно. Изучение этой ситуации привело к интересным результатам.
    Читать дальше…
    добавлено: 23 окт 12 просмотры: 450, комментарии: 0



    RowGoal и неравномерное распределенных данных

    На написание этой заметки меня подвиг доклад Алексея Эксаревского на 24 hours of PASS про наиболее частые причины ошибок в оценке кардинальности. Те, кто не видел этот доклад могут ознакомиться с ним на techdays.

    Алексей рассказывает о возможных причинах неправильных оценок кардинальности (или количества строк), из-за чего оптимизатор выбирает неудачный план запроса. Наиболее интересным и нетривиальным мне показался один из последних рассмотренных случаев, когда на эти оценки влияет механизм RowGoal.

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

    RowGoal – это механизм оптимизатора, который позволяет основываясь на заранее известном числе строк, которые необходимо получить (например в запросе есть предложение Top N), ограничить число строк для обработки в более ранних операторах. Казалось бы, если мы заранее знаем число строк, то это позволит выбрать лучший план. И, как правило, это так, однако, при некотором особенном распределении данных, этот механизм может мешать.

    Рассмотрим механику более подробно.
    Читать дальше…
    добавлено: 03 июл 12 просмотры: 643, комментарии: 0



    Оптимизатор (недокументированное): Отключить правила преобразования в отдельном запросе

    Многие, кто интересуется внутренним устройством оптимизатора, уже наверняка знают, что такое правила преобразования и то, что их можно отключить в сессии при помощи dbcc ruleoff/ruleon. В этой короткой заметке мы посмотрим на недокументированный хинт, который позволяет отключать правила преобразования в отдельно взятом запросе.
    читать дальше...
    добавлено: 29 май 12 просмотры: 1436, комментарии: 4



    Оптимизатор (ч.4): Optimization: Full Optimization: Search 1

    Optimization: Full Optimization: Search 1

    В данном разделе:
    - update statistics with row_count, page_count;
    - преобразования memo;
    - параллельный план;

    читать дальше...
    добавлено: 27 мар 12 просмотры: 1565, комментарии: 11



    Оптимизатор (ч.3): Optimization: Full Optimization: Search 0

    Optimization: Full Optimization: Search 0

    В этом разделе:
    - определение стадий оптимизации, которые проходит запрос;
    - структура для поиска альтенатив memo;
    - оператор Apply lookup в nested loops join;
    - оценки и вычисления селективности запроса с несколькими предикатами;
    - стоимость операторов;
    - Rebind, Rewind, RowGoal;
    - просмотр начального и конечного memo;
    - выходное дерево физических операторов;

    читать дальше...
    добавлено: 27 мар 12 просмотры: 1222, комментарии: 3



    Оптимизатор (ч.2): Optimization: Trivial Plan Optimization

    Optimization: Trivial Plan Optimization

    В этом разделе:
    - применение правил преобразования;
    - особенности стадии trivial plan;
    - почему загружается статистика;
    - как пропустить фазу поиска тривиального плана (upd)


    Итак, мы получили наше упрощенное дерево. Но как оптимизатор догадался его упростить, что именно сделал. Разберемся. Для начала, немного теории.
    читать дальше...
    добавлено: 27 мар 12 просмотры: 1246, комментарии: 0



    Оптимизатор (ч.1): Введение, Optimization: Simplification

    Введение

    В этом разделе:
    - обзор;
    - упрощение, исключение противоречий и лишних соединений;
    - просмотр дерева логических операций;


    В данной заметке рассматриваются некоторые механизмы работы оптимизатора. Она будет интересна тем, кто хочет больше узнать о процессе преобразования запроса в план запроса, который и будет передан серверу на выполнение.
    Многие средства, используемые в заметке - недокументированны, по этому, ни в коем случае не рекомендуется применять их на «боевых» серверах. Также, если вы хотите выполнять приведенные в заметке запросы, то рекомендуется версия сервера для экспериментов «Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600», иначе результат может отличаться.
    Итак, приступим.
    читать дальше...
    добавлено: 27 мар 12 просмотры: 1816, комментарии: 0