Я выполняю довольно простой запрос оператора удаления. У меня есть 50 файловых ключей, и я хочу их удалить. Схема нашей базы данных выглядит так:
File - UID
(int) столбец является первичным ключом (с уникальным кластеризованным индексом)
Версия - File
столбец является внешним ключом для File.UID
, DataLockerToken
столбец является внешним ключом для Cache.UID
Cache - UID
(uniqueidentifier) столбец является первичным ключом ( с уникальным некластеризованным индексом)
Версия должна была проиндексировать предложения из SQL, которые я применил:
CREATE NONCLUSTERED INDEX [nc_VersionFile_DataLockerToken]
ON [dbo].[Version] ([File] ASC) INCLUDE([DataLockerToken])
CREATE NONCLUSTERED INDEX [nc_VersionFile_UID]
ON [dbo].[Version] ([File] ASC) INCLUDE([UID])
Взаимосвязи: Файл 1: M к версии 1: 1 в кэш
Вот запрос, который я пытаюсь выполнить:
DELETE [Cache]
FROM [Cache] c
INNER JOIN Version v ON c.UID = v.DataLockerToken
WHERE v.[File] IN ( 241647, ... 50 ids in total ..., 244038 );
DELETE Version
WHERE [File] IN ( 241647, ... 50 ids in total ..., 244038 );
DELETE [File]
WHERE UID IN ( 241647, ... 50 ids in total ..., 244038 );
Это занимает почти 1 минуту, и я ожидаю, что это будет практически мгновенно. Таблицы File
и Version
являются просто метаданными, тогда как таблица Cache
фактически содержит двоичную информацию для файла.
Вот снимок экрана с планом выполнения:
ОБНОВЛЕНИЕ : это должно быть что-то с таблицей кэша или двоичной информацией внутри, потому что если я запускаю запрос в SQL Server Management Studio , как я уже сказал, это занимает ~ 1 минуту. Затем, если я снова запустил тот же самый запрос (те же ключи, поэтому, очевидно, их там нет) снова в Management Studio или даже в консольном приложении C#, запрос выполняется немедленно, поэтому, если нет какого-либо `` кеширования запросов '', которое я не думаю, что есть, это указывает на тот факт, что удаляемые данные - это проблема, а не проблема с запросом?
Имея эту минимальную информацию, кто-нибудь увидит явные проблемы в плане выполнения? Обычно я полагаюсь на SQL, чтобы дать мне подсказку по индексу, если это необходимо (и я знаю, что вы не всегда можете доверять SQL), но это не похоже на то, что эта схема db такая сложная.
Пусть я знаю, есть ли лучшая платформа, чтобы задать этот вопрос, если это неправильное место.