Зачем оператору параллелизма (потоки перераспределения) уменьшать оценки строк до 1?


12

Я использую SQL Server 2012 Enterprise. Я столкнулся с планом SQL, демонстрирующим некоторое поведение, которое я не нахожу полностью интуитивным. После тяжелой операции параллельного сканирования индекса происходит операция параллелизма (потоки перераспределения), но она убивает оценки строк, возвращаемые сканированием индекса (Object10.Index2), уменьшая оценку до 1. Я провел некоторый поиск, но не встречал ничего, что объясняет такое поведение. Запрос довольно прост, хотя каждая из таблиц содержит записи в миллионы. Это является частью процесса загрузки DWH, и этот промежуточный набор данных затрагивается несколько раз, но у меня есть вопрос, в частности, связанный с оценками строк. Может ли кто-нибудь объяснить, почему точные оценки строк переходят в 1 в операторе параллелизма (перестановки)? Также,

Я опубликовал полный план « Вставить план» .

Вот операция, о которой идет речь:

введите описание изображения здесь

Включение дерева планов в случае добавления контекста:

введите описание изображения здесь

Могу ли я столкнуться с некоторым вариантом этого элемента Connect, поданным Полом Уайтом (более подробное объяснение в его блоге здесь )? По крайней мере, это единственное, что я обнаружил, что, кажется, даже отдаленно близко к тому, с чем я сталкиваюсь, хотя в игре нет оператора TOP.

Ответы:


9

Планы запросов с фильтрами растровых изображений иногда сложно прочитать. Из статьи BOL о перераспределении потоков (выделено мое):

Оператор Repartition Streams использует несколько потоков и создает несколько потоков записей. Содержание и формат записи не изменяются. Если оптимизатор запросов использует фильтр растровых изображений, количество строк в выходном потоке уменьшается.

Кроме того, полезна статья о растровых фильтрах:

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

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

create table outer_tbl (ID BIGINT NOT NULL);

INSERT INTO outer_tbl WITH (TABLOCK)
SELECT TOP (1000) ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM master..spt_values;

create table inner_tbl_1 (ID BIGINT NULL);
create table inner_tbl_2 (ID BIGINT NULL);

INSERT INTO inner_tbl_1 WITH (TABLOCK)
SELECT (ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) / 2000000 - 2) NUM
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;

INSERT INTO inner_tbl_2 WITH (TABLOCK)
SELECT (ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) / 2000000 - 2) NUM
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;

Вот запрос, который вы не должны запускать:

SELECT *
FROM outer_tbl o
INNER JOIN inner_tbl_1 i ON o.ID = i.ID
INNER JOIN inner_tbl_2 i2 ON o.ID = i2.ID
OPTION (HASH JOIN, QUERYTRACEON 9481, QUERYTRACEON 8649);

Я загрузил план . Посмотрите на оператора рядом с inner_tbl_2:

передел потерял ряды

Также вам может пригодиться второй тест Поля Уайта в « Хеш-соединениях на обнуляемых столбцах ».

Существуют некоторые несоответствия в том, как применяется сокращение строк. Я мог видеть это только в плане, по крайней мере, с тремя таблицами. Однако сокращение ожидаемых строк кажется разумным при правильном распределении данных. Предположим, что объединенный столбец в таблице фактов имеет много повторяющихся значений, которых нет в таблице измерений. Фильтр растровых изображений может удалить эти строки до того, как они достигнут соединения. Для вашего запроса оценка уменьшена до 1. Как строки распределяются по хеш-функции, дает хороший совет:

рядный дистрибутив

Исходя из этого, я подозреваю, что у вас есть много повторяющихся значений для Object1.Column21столбца. Если повторяющиеся столбцы Object4.Column19не попадают в гистограмму статистики, тогда SQL Server может получить оценку количества элементов очень неправильно.

Я думаю, что вы должны быть обеспокоены тем, что возможно улучшить производительность запроса. Конечно, если запрос соответствует времени отклика или требованиям SLA, дальнейшее изучение может не стоить. Однако, если вы хотите продолжить исследование, есть несколько вещей, которые вы можете сделать (кроме обновления статистики), чтобы получить представление о том, выберет ли оптимизатор запросов лучший план, если у него будет больше информации. Вы можете поместить результаты объединения между Database1.Schema1.Object10и Database1.Schema1.Object11во временную таблицу и посмотреть, продолжите ли вы получать соединения с вложенными циклами. Вы можете изменить это объединение на LEFT OUTER JOINтак, чтобы оптимизатор запросов не уменьшил количество строк на этом шаге. Вы можете добавить MAXDOP 1подсказку к вашему запросу, чтобы увидеть, что происходит. Вы могли бы использоватьTOPвместе с производной таблицей, чтобы соединение было последним, или вы можете даже закомментировать соединение из запроса. Надеюсь, этих предложений достаточно, чтобы вы начали.

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


6

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

В последнем случае FIX: низкая производительность при запуске запроса, который содержит коррелированные предикаты AND в SQL Server 2008, SQL Server 2008 R2 или SQL Server 2012, может иметь значение с использованием поддерживаемого флага трассировки 4137. Вы также можете попробовать выполнить запрос с флаг трассировки 4199 для включения исправлений оптимизатора и / или 2301 для включения расширений моделирования. Это трудно узнать на основе анонимного плана.

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

Если вам интересно, в тестовой системе вы можете отключить растровые изображения для запроса с флагом трассировки 7498. Вы также можете отключить оптимизированные растровые изображения (учитываемые оптимизатором и влияющие на оценки количества элементов), заменив их растровыми изображениями после оптимизации (не учитываются). оптимизатором, не влияющим на количество элементов) с комбинацией флагов трассировки 7497 и 7498. Ни то, ни другое не задокументировано и не поддерживается для использования в производственной системе, но они действительно вырабатывают планы, которые оптимизатор мог бы рассмотреть в обычном порядке, и поэтому могут быть вызваны с помощью План руководства.

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

Далее читаем о растровых изображениях и хэш-соединениях:


0

ответил вам в твиттере. Я посмотрел на прилагаемый XML и вижу несбалансированный параллелизм. 1 поток имеет почти все фактические строки, тогда как у большинства других нет. Это крики несбалансированного параллелизма происходит. Поэтому я бы посмотрел на значение ключа / соединения и его соответствующую статистику и количество элементов.

В соответствии с вашей другой идеей, я не настолько уверен, что элемент Connect применяется, так как ваш вставленный план не содержит TOP нигде, который я видел.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.