Оценка кратности (CE) отзывы

Область применения: SQL Server 2022 (16.x) и более поздних версий.

Начиная с SQL Server 2022 (16.x), обратная связь оценки кратности (CE) является частью интеллектуального семейства функций обработки запросов и устраняет неоптимальные планы выполнения запросов для повторяющихся запросов, когда эти проблемы возникают из неправильных предположений модели CE. Этот сценарий помогает снизить риски регрессии, связанные с оценкой кратности по умолчанию при обновлении предыдущих версий ядра СУБД.

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

Сведения о других функциях обратной связи о запросах см. в разделе отзывов о предоставлении памяти и степень параллелизма (DOP).

Общие сведения об оценке карта инальности (CE)

Оценка кратности (CE) заключается в том, как оптимизатор запросов может оценить общее количество строк, обработанных на каждом уровне плана запроса. Оценка кратности в SQL Server главным образом определяется на основе гистограмм, которые создаются автоматически или вручную после создания индексов или статистик. Иногда SQL Server также использует сведения об ограничениях и логические перезаписи запросов для определения карта inality.

В разных версиях ядра СУБД используются разные предположения модели CE в зависимости от того, как распределяются и запрашиваются данные. Дополнительные сведения см. в статье о версиях CE.

Реализация оценки кратности (CE) отзывов

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

  1. Обратная связь CE определяет предположения, связанные с моделью, и оценивает, точны ли они для повторяющихся запросов.

  2. Если предположение выглядит неверным, последующее выполнение того же запроса проверяется с помощью плана запроса, который корректирует важное предположение модели CE и проверяет, помогает ли оно. Мы определяем неправильность, просматривая фактические и предполагаемые строки из операторов плана. Не все ошибки могут быть исправлены вариантами модели, доступными в отзыве CE.

  3. Если это улучшает качество плана, старый план запроса заменяется планом запроса, который использует соответствующее указание запроса USE HINT, корректирующее модель оценки, реализованную с помощью механизма Указание хранилища запросов.

Сохраняется только проверенный отзыв. Обратная связь CE не используется для этого запроса, если скорректированное предположение модели приводит к снижению производительности. В этом контексте отмененный пользователем запрос также воспринимается как регрессия.

Сценарии оценки кратности (CE) обратной связи

Оценка кратности (CE) устраняет предполагаемые проблемы регрессии, вызванные неправильными предположениями модели CE при использовании CE по умолчанию (CE120 или более поздней) и могут выборочно использовать различные предположения модели. К сценариям относятся корреляция, присоединение и цель строки оптимизатора.

Корреляция обратной связи оценки кратности (CE)

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

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

  • Частично коррелированный (по умолчанию для CE120 и выше), где кратность вычисляется с помощью варианта экспоненциальной задержки, с упорядочением избирательности от самого избирательного до наименее избирательного предиката.

  • Полностью коррелированный, где кратность вычисляется с помощью минимальной избирательности для всех предикатов.

В следующем примере используется частичная корреляция, когда для совместимости базы данных задано значение 120 или выше:

USE AdventureWorks2016_EXT;
GO
SELECT AddressID, AddressLine1, AddressLine2
FROM Person.Address
WHERE StateProvinceID = 79 AND City = N'Redmond';
GO

Если для совместимости базы данных задано значение 160, а корреляция по умолчанию используется, ce обратная связь пытается переместить корреляцию в правильное направление на один шаг за раз на основе того, недооценивается ли предполагаемое карта inality по сравнению с фактическим числом строк. Используйте полную корреляцию, если фактическое число строк больше предполагаемой кратности. Используйте полную независимость, если фактическое количество строк меньше предполагаемой кратности.

Дополнительные сведения см. в статье о версиях CE.

Оценка кратности (CE) соединения отзывов

Когда оптимизатор запросов оценивает избирательность предикатов соединения и применимых предикатов фильтров, он использует предположения модели автономности. К предположениям относятся:

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

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

В следующем примере используется базовая автономность, когда для совместимости базы данных задано значение 120 или выше:

USE AdventureWorksDW2016_EXT;
GO
SELECT *
FROM dbo.FactCurrencyRate AS f
INNER JOIN dbo.DimDate AS d ON f.DateKey = d.DateKey
WHERE d.MonthNumberOfYear = 7 AND f.CurrencyKey = 3 AND f.AverageRate > 1;
GO

Дополнительные сведения см. в статье о версиях CE.

Оценка кратности (CE) и цель строки оптимизатора запросов

Когда оптимизатор запросов оценивает кратность плана выполнения, он обычно предполагает, что должны быть обработаны все подходящие строки из всех таблиц. Однако из-за наличия некоторых шаблонов запросов оптимизатор запросов выполняет поиск плана, который будет возвращать меньшее количество строк для сокращения операций ввода-вывода. Если запрос задает целевое число строк (цель строки), которые могут ожидаться во время выполнения с помощью TOPIN или EXISTS ключевое слово, FAST указания запроса или SET ROWCOUNT инструкции, цель строки используется в процессе оптимизации запросов, например в следующем примере:

USE AdventureWorks2016_EXT;
GO
SELECT TOP 1 soh.*
FROM Sales.SalesOrderHeader AS soh
INNER JOIN Sales.SalesOrderDetail AS sod ON soh.SalesOrderID = sod.SalesOrderID;
GO

Когда применяется план цели строки, расчетное количество строк в плане запроса уменьшается, так как оптимизатор запросов предполагает, что для достижения цели строки необходимо обработать меньшее количество строк.

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

В плане выполнения нет атрибутов, относящихся к отзыву CE, но для указания хранилище запросов будет указан атрибут. Найдите, QueryStoreStatementHintSource чтобы быть CE feedback.

Рекомендации по оценке карта inality (CE)

  • Чтобы включить обратную связь карта inality (CE), включите уровень совместимости базы данных 160 для базы данных, к к ней подключенной при выполнении запроса. Хранилище запросов необходимо включить и в режиме READ_WRITE для каждой базы данных, в которой используется обратная связь CE.

  • Чтобы отключить обратную связь CE на уровне базы данных, используйте CE_FEEDBACKконфигурацию область базы данных. Например, в пользовательской базе данных:

    ALTER DATABASE SCOPED CONFIGURATION SET CE_FEEDBACK = OFF;
    
  • Чтобы отключить обратную связь CE на уровне запроса, используйте указание запроса DISABLE_CE_FEEDBACK.

Действия обратной связи CE отображаются с помощью XEvents query_feedback_analysis и query_feedback_validation.

Подсказки, установленные обратной связью CE, можно отслеживать с помощью представления каталога sys.query_store_query_hints.

Сведения о отзыве можно отслеживать с помощью представления каталога sys.query_store_plan_feedback .

Если у запроса есть план запроса, принудительно выполненный через хранилище запросов, обратная связь CE не будет использоваться для этого запроса.

Если запрос использует жестко закодированные указания запроса или использует указания хранилища запросов, установленные пользователем, обратная связь CE не будет использоваться для этого запроса. Дополнительные сведения см. в разделах Указания (Transact-SQL) — Запрос и Указание хранилища запросов.

Начиная с SQL Server 2022 (16.x), если включена хранилище запросов для дополнительных реплика, обратная связь CE реплика не учитывается для дополнительных реплика в группах доступности. Отзывы CE в настоящее время являются преимуществами только основных реплика. При отработки отказа обратная связь, примененная к основным или вторичным реплика, теряется. Дополнительные сведения см. в хранилище запросов дополнительных реплика.

Сохраняемость для оценки карта inality (CE)

Область применения: SQL Server (начиная с SQL Server 2022 (16.x))

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

Эта функция появилась в SQL Server 2022 (16.x), однако это повышение производительности доступно для запросов, работающих на уровне совместимости базы данных 160 или выше, или QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_n указание 160 и выше, а также при включении хранилище запросов для базы данных и находится в состоянии "чтение записи".

Известные проблемы, связанные с оценкой карта inality (CE)

Проблема Дата обнаружения Состояние Дата разрешения
Низкая производительность SQL Server после применения накопительного обновления 8 для SQL Server 2022 (16.x) в определенных условиях. Вы можете столкнуться с резким использованием памяти кэша планов, а также непредвиденным увеличением использования ЦП при включенной обратной связи CE. Декабрь 2023 г. Решение

Известные проблемы

Низкая производительность SQL Server после применения накопительного обновления 8 для SQL Server 2022 в определенных условиях

Начиная с sql Server 2022 (16.x) накопительного обновления 8 SQL Server может привести к неожиданному увеличению использования ЦП и памяти. Кроме того, может наблюдаться увеличение RESOURCE_SEMAPHORE_QUERY_COMPILE ожиданий. Вы также можете заметить устойчивый рост числа объектов кэша планов, используемых при подходе к ограничениям кэша планов и ручному очистке кэша планов с такими методами, как ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE, DBCC FREESYSTEMCACHEили DBCC FREEPROCCACHE не предоставлять помощь. Это поведение наблюдалось только небольшим количеством клиентов.

Эта проблема не влияет на все рабочие нагрузки и зависит от количества различных планов, созданных, а также количества планов, которые были разрешены для использования функции обратной связи CE. В течение периода времени, когда отзыв CE анализирует операторы планов, где произошли значительные неправильные оценки модели, существует сценарий, в котором во время этого этапа анализа план, на который ссылается ссылка, может стать разыменовыванием в памяти, не позволяя плану впоследствии быть удален из памяти путем обычного алгоритма наименее недавно использованных (LRU). Механизм LRU один из способов применения sql Server политик вытеснения планов. SQL Server также удаляет планы из памяти, если система находится под давлением памяти. Когда SQL Server пытается удалить планы, которые были удалены неправильно, не удается удалить эти планы из кэша планов, что приводит к продолжению роста кэша. Растущий кэш может начать вызывать дополнительные компиляции, которые в конечном итоге будут использовать больше ЦП и памяти. Дополнительные сведения см. в разделе "Внутренние кэши планов".

Симптом: количество используемых записей кэша планов и помечается как грязное из планов SQL или планов объектов со временем увеличивается до 50 000 или более. Если вы наблюдаете записи кэша планов, которые начинают приближаться к этому уровню вместе с непредвиденным увеличением использования ЦП, ваша система может столкнуться с этой проблемой. Связанное исправление было предоставлено в SQL Server 2022 (16.x) с накопительным обновлением 9. См. КБ5030731. Исправление пыталось устранить проблему, из-за которой записи кэша планов вытеснимы при попытке обратной связи оценки кратности (CE) получить связанный профиль, что приводит к повреждению памяти. Дополнительные исправления этой проблемы будут доступны в предстоящем накопительном обновлении.

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

SELECT
  CASE
    WHEN mce.[name] LIKE 'SQL Plan%' THEN 'SQL Plans'
    WHEN mce.[name] LIKE 'Object Plan%' THEN 'Object Plans'
    ELSE '[All other cache stores]'
  END AS PlanType,
  COUNT(*) AS [Number of plans marked to be removed]
FROM sys.dm_os_memory_cache_entries AS mce
LEFT OUTER JOIN sys.dm_exec_cached_plans AS ecp 
  ON mce.memory_object_address = ecp.memory_object_address
WHERE mce.is_dirty = 1
AND ecp.bucketid is NULL
GROUP BY
  CASE
    WHEN mce.[name] LIKE 'SQL Plan%' THEN 'SQL Plans'
    WHEN mce.[name] LIKE 'Object Plan%' THEN 'Object Plans'
    ELSE '[All other cache stores]'
  END;

Другой набор запросов, который также предоставит те же сведения, что и предыдущий пример, а также позволяет наблюдать дополнительные метрики производительности. Коэффициенты попаданий кэша планов будут уменьшаться, а также количество компиляций в отношении количества пакетных запросов в секунду. Следующие запросы можно использовать для мониторинга системы с течением времени. Сохраняя внимание на коэффициенте попадания кэша (непреднамеренный спад), используемых объектов кэша (увеличивается число до уровней, приближающихся к 50 000 без уменьшения) и ниже ожидаемого коэффициента пакетных запросов/с по сравнению с ростом компиляций/с.

--SQL Plan (Adhoc and Prepared plans)
SELECT
    CASE 
        WHEN [counter_name] = 'Cache Hit Ratio' THEN 'Cache Hit Ratio'
        WHEN [counter_name] = 'Cache Object Counts' THEN 'Cache Object Counts'
        WHEN [counter_name] = 'Cache Objects in use' THEN 'Cache Objects in use'
        WHEN [counter_name] = 'Cache Pages' THEN 'Cache Pages'
    END AS [SQLServer:Plan Cache (SQL Plans)],
    CASE
        WHEN [counter_name] = 'Cache Hit Ratio' THEN NULL
        ELSE FORMAT(cntr_value, '#,###')
    END AS [Counter Value],
    CASE
        WHEN [counter_name] = 'Cache Hit Ratio' THEN
            FORMAT(TRY_CONVERT(DECIMAL(5, 2), (cntr_value * 1.0 / NULLIF((SELECT cntr_value 
        FROM sys.dm_os_performance_counters WHERE 
        [object_name] LIKE '%:Plan Cache%' AND [counter_name] = 'Cache Hit Ratio Base'
        AND instance_name LIKE 'SQL Plan%'), 0))), '0.00%')
    END AS [SQL Plan Cache Hit Ratio]
FROM sys.dm_os_performance_counters
WHERE [object_name] LIKE '%:Plan Cache%'
    AND [counter_name] IN ('Cache Hit Ratio', 'Cache Object Counts', 'Cache Objects in use', 'Cache Pages')
    AND instance_name LIKE 'SQL Plan%'
ORDER BY [counter_name];

--Module/Stored procedure based plans
SELECT
    CASE 
        WHEN [counter_name] = 'Cache Hit Ratio' THEN 'Cache Hit Ratio'
        WHEN [counter_name] = 'Cache Object Counts' THEN 'Cache Object Counts'
        WHEN [counter_name] = 'Cache Objects in use' THEN 'Cache Objects in use'
        WHEN [counter_name] = 'Cache Pages' THEN 'Cache Pages'
    END AS [SQLServer:Plan Cache (Object Plans)],
    CASE
        WHEN [counter_name] = 'Cache Hit Ratio' THEN NULL
        ELSE FORMAT(cntr_value, '#,###')
    END AS [Counter Value],
    CASE
        WHEN [counter_name] = 'Cache Hit Ratio' THEN
            FORMAT(TRY_CONVERT(DECIMAL(5, 2), (cntr_value * 1.0 / NULLIF((SELECT cntr_value 
        FROM sys.dm_os_performance_counters WHERE 
        [object_name] LIKE '%:Plan Cache%' AND [counter_name] = 'Cache Hit Ratio Base'
        AND instance_name LIKE 'Object Plan%'), 0))), '0.00%')
    END AS [SQL Plan Cache Hit Ratio]
FROM sys.dm_os_performance_counters
WHERE [object_name] LIKE '%:Plan Cache%'
    AND [counter_name] IN ('Cache Hit Ratio', 'Cache Object Counts', 'Cache Objects in use', 'Cache Pages')
    AND instance_name LIKE 'Object Plan%'
ORDER BY [counter_name];

SELECT
    CASE
        WHEN [counter_name] = 'Batch Requests/sec' THEN 'Batch Requests/sec'
        WHEN [counter_name] = 'SQL Compilations/sec' THEN 'SQL Compilations/sec'
    END AS [SQLServer:SQL Statistics],
    FORMAT(cntr_value, '#,###') AS [Counter Value]
FROM sys.dm_os_performance_counters
WHERE [object_name] LIKE '%:SQL Statistics%'
AND counter_name IN ('Batch Requests/sec', 'SQL Compilations/sec' 
);

Обходной путь. Функция обратной связи CE может быть отключена на уровне базы данных до тех пор, пока дополнительные исправления не становятся доступными, если система испытывает симптомы, описанные ранее. Чтобы освободить память кэша плана, занятую этой проблемой, требуется перезапуск экземпляра SQL Server. Это действие перезапуска можно предпринять после отключения функции обратной связи CE. Чтобы отключить обратную связь CE на уровне базы данных, используйте CE_FEEDBACKконфигурацию область базы данных. Например, в пользовательской базе данных:

ALTER DATABASE SCOPED CONFIGURATION SET CE_FEEDBACK = OFF;

Проблемы с отзывами и отчетами

Отзывы или вопросы, электронная почта CEFfeedback@microsoft.com