KB4577933 – КОРЕКЦИЯ: Каскадно изтриване на ключови стойности извън границите на хистограмата на водещата таблица причинява сканиране на индекса през SQL Server 2017 г. и 2019 г.

Отнася се за
SQL Server 2017 Developer on Windows SQL Server 2017 Enterprise Core on Windows SQL Server 2017 Enterprise on Windows SQL Server 2017 Standard on Windows SQL Server 2019 on Windows

Симптоми

Да предположим, че таблица използва ограничение на външен ключ, зададено за каскадно изтриване, а статистиката в колоната с външен ключ не покрива целия диапазон от стойности на ключ в таблицата (например: защото статистиката не е актуализирана след промени в разпределението на данните в таблицата). В този сценарий, когато се опитате да изтриете ред, съответстващ на ключова стойност, която не е представена в хистограмата на статистиката, а оптимизаторът на заявките използва оценката по подразбиране за брой обекти, операцията по изтриване е по-бавна от очакваното. Може също да забележите, че се използва операция за сканиране на индекса за намиране на съответстващите редове в препращащата таблица.

Състояние

Microsoft потвърждава, че това е проблем в продуктите на Microsoft, които са изброени в раздела „Важи за“.

Решение

Този проблем е решен в следните кумулативни актуализации за SQL Server:

Забележка: Тази корекция е активирана само когато включите оптимизиращите горещи поправки (или чрез опцията за конфигуриране в обхвата на базата данни, чрез подсказване за заявка, или чрез флаг за проследяване 4199).

За кумулативните актуализации за SQL Server:

Всяка нова кумулативна актуализация за SQL Server съдържа всички актуални поправки и корекции на защитата, които са били включени в предишната кумулативна актуализация. Прегледайте последните кумулативни актуализации за SQL Server:

Заобиколно решение

За да решите проблема по заобиколен начин, използвайте един от следните методи:

  • Използвайте наследена оценка на брой обекти. За повече информация вж. "Оценка на брой обекти" (SQL Server).
  • Премахнете каскадно изтриване от дефиницията на външен ключ и изпълнете операцията по изтриване, като използвате JOIN между родителска и дъщерна таблица, за да постигнете еквивалента на каскадно изтриване.
  • Актуализирайте статистиката за родителската таблица с FULLSCAN, преди да изтриете данните.

Справки

Научете повече относно терминологията, която Microsoft използва за описване на актуализациите на софтуера.