У меня есть таблица с примерно 115k строк. Примерно так:
Table: People
Column: ID PRIMARY KEY INT IDENTITY NOT NULL
Column: SpecialCode NVARCHAR(255) NULL
Column: IsActive BIT NOT NULL
Первоначально у меня был индекс, определенный так:
PK_IDX (clustered) -- clustered index on primary key
IDX_SpecialCode (non clustered, non-unique) -- index on the SpecialCode column
И я делаю обновление примерно так:
Update People set IsActive = 0
Where SpecialCode not in ('...enormous list of special codes....')
Этот огромный список, по сути, составляет 99% пользователей в таблице.
Это обновление занимает навсегда на моем сервере. В качестве теста я урезал список специальных кодов в предложении «не в» примерно до 1% пользователей в таблице, и мой план выполнения заканчивается использованием INDEX SCAN для индекса PK_IDX вместо индекса IDX_SpecialCode, который я думал, что будет использовать.
Итак, я подумал, что, возможно, мне нужно изменить IDX_SpecialCode, чтобы он включал в себя столбец «IsActive». Я так и сделал, и я все еще вижу план выполнения по умолчанию при сканировании индекса PK_IDX, и мой запрос все еще занимает очень много времени.
Итак, что является более правильным способом сделать обновление такого рода? У меня есть список пользователей, которых я хочу исключить из обновления, но пытался не загружать специальные коды всех сотрудников из базы данных, отфильтровывать те, которых нет в моем списке на стороне приложения, а затем запускать мой запрос с предложением in , которое будет гораздо меньшим списком при моем фактическом использовании.
Спасибо