TSQL: оставлено соединение на просмотре очень медленно - PullRequest
0 голосов
/ 26 октября 2011

в некоторой сложной хранимой процедуре мы используем представление и оставляем соединение в этом представлении.Выполнение занимает 40 секунд.

Теперь, если мы создадим переменную TABLE и сохраним в ней результат просмотра, то сделаем левое соединение для этой переменной, а не для представления, это займет 3 секунды ...

Чем можно объяснить это поведение?

Ответы [ 2 ]

3 голосов
/ 26 октября 2011

Представление расширяется в основной запрос. S

Так что если у вас есть 5 таблиц в представлении, они расширяются с дополнительной таблицей в один большой план запроса с 6 таблицами. Разница в производительности, скорее всего, будет вызвана дополнительной сложностью и перестановками дополнительной таблицы, к которой вы присоединились.

Еще одна потенциальная проблема: оставляете ли вы соединение в столбце, в котором есть некоторая обработка? Это еще больше убьет производительность.

0 голосов
/ 16 июля 2013

Предоставлено Alden W. Этот ответ на один из моих вопросов, подобных вашему, был задан Alden W.

Вы можете добиться лучшей производительности, указав Алгоритм ПРОСМОТРА как MERGE.С помощью MERGE MySQL объединит представление с вашим внешним оператором SELECT WHERE, а затем разработает оптимизированный план выполнения.

Для этого, однако, вам придется удалить оператор GROUP BY из вашего VIEW.Таким образом, если в ваше представление включен оператор GROUP BY, MySQL выберет алгоритм TEMPLATE.Сначала создается временная таблица для всего представления, прежде чем она будет отфильтрована оператором WHERE.

Если алгоритм MERGE не может быть использован, вместо него должна использоваться временная таблица.MERGE нельзя использовать, если представление содержит одну из следующих конструкций:

Агрегированные функции (SUM (), MIN (), MAX (), COUNT () и т. Д.)

DISTINCT

GROUP BY

HAVING

LIMIT

UNION или UNION ALL

Подзапрос в списке выбора

Относитсятолько для литеральных значений (в данном случае нет базовой таблицы)

Вот ссылка с дополнительной информацией.http://dev.mysql.com/doc/refman/5.0/en/view-algorithms.html

Если вы можете изменить представление, чтобы оно не включало оператор GROUP BY, для указания алгоритма представления используется следующий синтаксис:

CREATE ALGORITHM = MERGE VIEW ...

...