Предыстория У меня есть таблица, в которой хранится кэшированное время, и в настоящее время около 1 млн строк И когда я обновляю таблицу новыми версиями кэшированных элементов, мне нужно удалить старые кэшированные элементы (около 3 тысяч элементов). Не критично, что эти элементы обнаруживаются сразу, но я бы предпочел, чтобы, когда клиенты извлекали кэшированные элементы, я хотел, чтобы они получили новейшую версию.
Но удаление все еще идет медленно, что занимает несколько секунд, заставляя конечного пользователя ждать, есть ли способ сделать это быстрее? Атм я делаю простой sql
DELETE FROM cache where cache_event_id = X
Мой вопрос становится:
Могу ли я сделать запрос быстрее (я ожидаю, что таблица кеша только увеличится в размерах, поэтому эта проблема усугубится)?
Должен ли я сделать удаление sql запустить свой собственный поток, и жить с фактом, что пользователи могут на некоторое время старые элементы?
Pr запрашивает остальную информацию для таблицы.
CREATE TABLE [dbo].[cache](
[cache_id] [int] IDENTITY(1,1) NOT NULL,
[cache_name] [nchar](128) NOT NULL,
[cache_event_id] [int] NOT NULL,
[cache_encounter_id] [int] NOT NULL,
[cache_type_id] [tinyint] NOT NULL,
[cache_creation_date] [datetime] NOT NULL,
[cache_data] [varbinary](max) NOT NULL
) ON [PRIMARY]
Все индексы создаются профайлером сервера SQL, похоже, мне нужно вручную удалить старый индекс
Индекс 1:
CREATE NONCLUSTERED INDEX [_dta_index_cache_6_366624349__K2_K3_K5_K4_7] ON [dbo]. [cache]
(
[cache_name] ASC,
[cache_event_id] ASC,
[cache_type_id] ASC,
[cache_encounter_id] ASC
)
INCLUDE ( [cache_data]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
Индекс 2: // Возможно, он не используется
CREATE NONCLUSTERED INDEX [_dta_index_cache_6_366624349__K5_1_2_3_4_6_7] ON [dbo].[cache]
(
[cache_type_id] ASC
)
INCLUDE ( [cache_id],
[cache_name],
[cache_event_id],
[cache_encounter_id],
[cache_creation_date],
[cache_data]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
Индекс 3 (я полагаю, это одно удаление)
CREATE NONCLUSTERED INDEX [_dta_index_cache_6_366624349__K3] ON [dbo].[cache]
(
[cache_event_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
Данные вставляются в таблицу с помощью класса BulkCopy
Данные извлекаются (это самая важная часть)
SqlCommand cmd = new SqlCommand("GetPageCache", connection);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@event_id", EventID); // int
cmd.Parameters.AddWithValue("@encounter_id", EncounterID); // int
cmd.Parameters.AddWithValue("@type_id", (int)CacheType); //int
cmd.Parameters.AddWithValue("@cachename", CacheName); // Required in some cases, but 90% this is just a fallback