Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Есть ли разница производительности на разных версиях SQL для одинаковых запросов?  [new]
abrashka
Member

Откуда:
Сообщений: 521
День добрый!
Интересует такой вот вроде простой вопрос, на который я к сожалению не нашел ответ.
На сервере с SQL 2008R2 SP1 имеется база с Compatibility Level=100, гипотетически, будут ли изменения производительности если проапгрейдить сервер на SQL2012 или 2014, но оставить Compatibility Level=100?
Или до тех по пока Compatibility останется прежней- никаких вкусностей новых версий ожидать не стоит?
Речь идет только о производительности конкретных запросов, в моем случае это отчеты.

Спасибо!
16 ноя 15, 14:58    [18424132]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли разница производительности на разных версиях SQL для одинаковых запросов?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Вы под разной производительностью понимаете разные планы выполнения для одного и того же запроса ?
16 ноя 15, 15:08    [18424182]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли разница производительности на разных версиях SQL для одинаковых запросов?  [new]
abrashka
Member

Откуда:
Сообщений: 521
Glory,

да, разные планы, разное распределение ресурсов...
16 ноя 15, 15:14    [18424225]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли разница производительности на разных версиях SQL для одинаковых запросов?  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
abrashka,

Добрый день.

Изменения внутри оптимизатора могут быть при смене версии, при этом, не только главной версии, но и в рамках SP, и даже CU. Могут изменяться внутренние правила трансформации, внутренние пороги и коэффициенты стоимости, и другие недокументированные вещи. Это может приводить к разным планам и к разной производительности независимо от уровня совместимости.

Например:
+
create database db100;
alter database db100 set compatibility_level = 100;
go
use db100;
go
create table t1(a int, b int, c int);
insert t1 values (1,1,1),(2,2,2),(3,3,3);
go
select count(distinct a), sum(b) from t1 group by c;
go
use master;
go
drop database db100;
go

Имеют разные планы в 2008R2 и 2014 (Compat.lev = 100)
Картинка с другого сайта.

Если вы хоть раз переезжали на новую версию сервера, вы сами знаете, как это бывает.

Немного отдельный разговор про 2014 версию, там уровень совместимости также управляет фундаментальным изменением – сменой версии компонента оценивающего количество строк от которого очень много что зависит. Включение новой логики может сказаться как позитивно, так и негативно.

Если говорить проще:
- после переезда на 2012/2014 сервер – ожидайте того к чему привыкли при переездах. =)
- после переезда на 2014 сервер с 120 уровнем совместимости – ожидайте смены логики выбора планов.
16 ноя 15, 15:54    [18424504]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли разница производительности на разных версиях SQL для одинаковых запросов?  [new]
o-o
Guest
abrashka
оставить Compatibility Level=100?

Joseph Sack
SQL Server 2014 introduces the first major redesign of the SQL Server Query Optimizer cardinality estimation process since version 7.0.
The goal for the redesign was to improve accuracy, consistency and supportability of key areas within the cardinality estimation process,
ultimately affecting average query execution plan quality and associated workload performance.
...
If the new CE functionality is negatively influencing critical workloads, you can disable the use of the new CE.
You disable the new CE by reverting to a database compatibility level below 120.
The database context of the session will determine the CE version.
Therefore, connecting to the legacy database compatibility level means that workloads will revert to the legacy CE behavior.

т.е. они переписали Cardinality Estimator именно в 2014 (не в 2012)
разумеется, новые оценки --> новые планы.
для каких именно случаев поменялись оценки, расписано по ссылке
Optimizing Your Query Plans with the SQL Server 2014 Cardinality Estimator

ну и выставить базе compatibility level ниже 12-ого -- это один из способов заставить использовать прежний CE
16 ноя 15, 16:00    [18424545]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли разница производительности на разных версиях SQL для одинаковых запросов?  [new]
abrashka
Member

Откуда:
Сообщений: 521
SomewhereSomehow,o-o
Большое спасибо!
16 ноя 15, 16:08    [18424600]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли разница производительности на разных версиях SQL для одинаковых запросов?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
o-o
abrashka
оставить Compatibility Level=100?

Joseph Sack
SQL Server 2014 introduces the first major redesign of the SQL Server Query Optimizer cardinality estimation process since version 7.0.
The goal for the redesign was to improve accuracy, consistency and supportability of key areas within the cardinality estimation process,
ultimately affecting average query execution plan quality and associated workload performance.
...
If the new CE functionality is negatively influencing critical workloads, you can disable the use of the new CE.
You disable the new CE by reverting to a database compatibility level below 120.
The database context of the session will determine the CE version.
Therefore, connecting to the legacy database compatibility level means that workloads will revert to the legacy CE behavior.

т.е. они переписали Cardinality Estimator именно в 2014 (не в 2012)
разумеется, новые оценки --> новые планы.
для каких именно случаев поменялись оценки, расписано по ссылке
Optimizing Your Query Plans with the SQL Server 2014 Cardinality Estimator

ну и выставить базе compatibility level ниже 12-ого -- это один из способов заставить использовать прежний CE


надо понимать та же фигня и в 2016?
16 ноя 15, 19:32    [18425993]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли разница производительности на разных версиях SQL для одинаковых запросов?  [new]
o-o
Guest
Winnipuh,

Какая именно фигня?
Уровень ниже 120 да, заставит оценивать по-старому, а что планы и без того другие может строить, то SomewhereSomehow на примере показал, никакое compatibility level не спасет
16 ноя 15, 20:09    [18426146]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли разница производительности на разных версиях SQL для одинаковых запросов?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
o-o
Winnipuh,

Какая именно фигня?
Уровень ниже 120 да, заставит оценивать по-старому, а что планы и без того другие может строить, то SomewhereSomehow на примере показал, никакое compatibility level не спасет


да
16 ноя 15, 20:19    [18426178]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли разница производительности на разных версиях SQL для одинаковых запросов?  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Winnipuh,

В 2016 есть еще одна интересная особенность, касающаяся Trace Flag-ов оптимизатора, которые раньше не были выключены по умолчанию и включались отдельно при помощи TF 4199.

Дело в том, что один из "вызовов" (или как правильно в этом контексте перевести challenge - сложная задача/проблема, что ли) команды оптимизатора состоит в том, что даже если кто-то из пользователей нашел ошибку - не критичную, но влияющую на производительность, например, не оптимальный план в определенном случае - и это признано ошибкой - нельзя ее просто поправить, т.к. могут пострадать другие приложения. Те, которые, либо знают про эту "особенность" и используют подсказки и другие уловки для ее обхода, либо те, для которых это поведение не проблема, и устранение ошибки приведет к регрессу в другом месте.

Поэтому, некоторые исправления включались отдельным флагом (4199) или комбинацией флагов (4199 + ...) .

Начиная с 2016 эта ситуация меняется. Все исправления сделанные до 2016 версии и включаемые ранее Tf 4199 - теперь будут включены по умолчанию (при условии compatibility level 130). А TF остается регулировать те, что будут добавлены уже в самом 2016.

Вот статья более подробная: SQL Server query optimizer hotfix trace flag 4199 servicing model

Вот табличка оттуда, как это будет выглядеть:
Картинка с другого сайта.

Но в 2016 будет проще, там будет механизм Query Store (QS), при помощи которого будет осуществляться контроль и мониторинг планов.

Одна из идей использования примерно такая:
- обновились до 2016 оставили уровень совместимости предыдущего или пред-предыдущего сервера, в зависимости от... (да, есть момент, что уже после обновления планы могу отличаться, но не так драматично)
- включили QS
- включили новый уровень совместимости (130)
- мониторите, и если выявлена регрессия - смотрите новый план и старый план (который записал QS)
- дальше по желанию, например, можете форсировать старый план пока разбираетесь с проблемой, как только разберетесь оставите новый, либо по старинке при помощи TF, либо как угодно

Вопросов, как это будет работать в RTM много, и не исключены нюансы, но тем не менее, это дает больше свободы чем управление поведением планов в 2014 (compatibility level или TF для форсирования старого/нового механизма). На мой субъективный взгляд, им стоило выпускать новый CE вместе с этим механизмом.
16 ноя 15, 20:40    [18426218]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли разница производительности на разных версиях SQL для одинаковых запросов?  [new]
o-o
Guest
Winnipuh,

С оценками проще, можно задавать trace flag на уровне запроса. Т.е. просить оценить по-старому или по-новому. Например, option(querytraceom 9481) в конце запроса заставить применить старообрядные оценки на базе с совместимостью 120.
Они сменили оценку for unknown inputs, для between/like и для равенства в предикате в случае неуникального столбца. Еще новая формула для оценки предикатов с or, and
и еще интерполирует, если обнаруживает, что запрос по значениям, не попавшим в статистику, за верхней границей, и шла вставка возрастающих значений.
Это все есть по ссылке выше(сжато), ну или подробнее в твоей же книге. Спасибо за нее снова, кстати, огромное :)
16 ноя 15, 20:40    [18426219]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли разница производительности на разных версиях SQL для одинаковых запросов?  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
SomewhereSomehow,

* Trace Flag-ов оптимизатора, которые раньше не были выключены по умолчанию
16 ноя 15, 20:44    [18426228]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить