Симптоми
Да предположим, че имате таблица, която използва ограничението за външни ключове, което е зададено на каскадно изтриване, и статистическите данни за колоната за външни ключове не покриват целия диапазон от ключовите стойности в таблицата (например: тъй като статистическите данни не са актуализирани след промени в таблицата). При този сценарий, когато се опитате да изтриете ред, съответстващ на ключова стойност, която не е представена в хистограмата на статистиката, и оптимизаторът на заявки използва по подразбиране кардиналност, операцията за изтриване е по-ниска от очакваното. Може да забележите, че се използва операция за сканиране на индекс, за да намерите Съвпадащите редове в таблицата за съотнасяне.
Състоянието
Microsoft потвърди, че това е проблем в продуктите на Microsoft, които са посочени в секцията "важи за".
Решение
Този проблем е коригиран в следните сборни актуализации за SQL Server:
Забележка: Тази корекция е разрешена само когато включите в (или чрез опцията за конфигуриране на базата данни опция за конфигурация на заявката или флаг за проследяване 4199).
За сборните актуализации за SQL Server:
Всяка нова сборна актуализация за SQL Server съдържа всички поправки и всички корекции на защитата, които са били включени в предишната сборна актуализация. Вижте последните сборни актуализации за SQL Server:
Заобиколно решение
За да решите проблема по заобиколен начин, използвайте един от следните методи:
-
Използвайте оценка на наследени кардинали. За повече информация вижте оценка на кардиналност (SQL Server).
-
Отстранете каскадното изтриване от дефиницията за чужд ключ и извършете операцията за изтриване, като използвате съединение между таблиците родител и наследник, за да постигнете еквивалента на каскадно изтриване.
-
Актуализиране на статистиката в родителската таблица с FULLSCAN преди изтриването на данни.
Препратки
Научете повече за терминологията , която Microsoft използва, за да опише софтуерни актуализации.