У меня есть база данных хранилища данных, и я столкнулся с проблемами с новой оценкой мощности SQL Server 2014.
После обновления сервера базы данных до SQL Server 2014 я наблюдал большую разницу в производительности запросов. Некоторые запросы выполняются намного медленнее (30 секунд в SQL 2012 по сравнению с 5 минутами в SQL 2014). После изучения планов выполнения я видел, что оценки мощности на SQL Server 2014 уходят, и я не могу найти причину для этого.
Вот пример плана выполнения запроса (оператор верхнего левого угла) в SQL 2012 и SQL 2014:
Некоторые сведения:
-
Мои запросы - это типичные запросы загрузки таблицы фактов в хранилище данных. Я запрашиваю транзакционную таблицу и присоединяюсь к множеству (15-20) таблиц измерений (всегда есть 0 или 1 запись, которая соединена с таблицей размеров).
-
Я обновил статистику всех таблиц (с помощью FULLSCAN), чтобы убедиться, что статистика обновлена.
-
Бизнес-ключи таблиц измерений индексируются (уникальный индекс без кластеров). Мне кажется, что из-за уникальности этого индекса старая оценка мощности (SQL 2012) правильно предполагает, что там макс. 1, которая объединяется (оценочное количество записей не изменяется в плане выполнения).
Я попытался сузить проблему до простейшего примера - SELECT с двумя соединениями:
Здесь оценка мощности для операторов 1 и 2 в SQL 2012 по сравнению с SQL 2014:
| Est.rows - SQL2012 | Est.rows - SQL2014
Operator 1 | 7653 | 7653
Operator 2 | 7653 | 10000
Как вы можете видеть, SQL Server 2014 пропускает оценку более чем на 30% (10000 против 7653). Потому что у меня есть. 15-20 присоединяется к типичному запросу, окончательная оценка уходит.
Я могу поместить базу данных в более низкий режим совместимости (110), и он отлично работает (аналогично SQL Server 2012), но мне бы очень хотелось узнать, в чем причина такого поведения. Почему результат оценки мощности SQL Server 2014 неверен?