Похоже, что SQL Server не использует автоматически КОНТРОЛЬНУЮ СУММУ/хеш-индекс, если столбец КОНТРОЛЬНАЯ СУММА явно не включен в аргументы поиска для запроса. Это проблема, потому что я не контролирую приложения, которые запрашивают таблицу, и я не могу нарушить их работу.
Есть ли способ заставить SQL Server использовать новый индекс CHECKSUM/хэш безизменения запросов для включения нового столбца CHECKSUM/хэш?
CREATE TABLE big_table
(
id BIGINT IDENTITY CONSTRAINT pk_big_table PRIMARY KEY,
wide_col VARCHAR(50),
wide_col_checksum AS CHECKSUM(wide_col),
other_col INT
)
CREATE INDEX ix_checksum ON big_table (wide_col_checksum)
Вставка некоторых тестовых данных:
SET NOCOUNT ON
DECLARE @count INT = 0
BEGIN TRANSACTION
WHILE @count < 10000
BEGIN
SET @count = @count + 1
INSERT INTO big_table (wide_col, other_col)
VALUES (SUBSTRING(master.dbo.fn_varbintohexstr(CRYPT_GEN_RANDOM(25)), 3, 50), @count)
IF @count % 1000 = 0
BEGIN
COMMIT TRANSACTION
BEGIN TRANSACTION
END
END
COMMIT TRANSACTION
INSERT INTO big_table (wide_col, other_col)
VALUES ('ABCDEFGHIJKLMNOPQRSTUVWXYZ', 9999999)
Устаревший запрос. Причины Clustered Index Scan (BAD):
SELECT * FROM big_table
WHERE wide_col = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
Обновленный запрос. Причины NonClustered Index Seek (хорошо):
SELECT * FROM big_table
WHERE wide_col = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
AND wide_col_checksum = CHECKSUM('ABCDEFGHIJKLMNOPQRSTUVWXYZ')
Моя таблица очень большая (много сотен миллионов строк), имеет несколько индексов (~ 20), все из которых обязательны. Некоторые проиндексированные столбцы имеют небольшую ширину (~ 50 байт) и содержат несколько повторяющихся значений. Столбцы ищутся только на равенство. Таблица вставляется постоянно.
Вот таблица, в которой сравниваются «обычные» индексы и индексы CHECKSUM/хэш в таблице выше, как сжатые, так и несжатые. Данные из недавно перестроенных индексов для таблиц с 1 миллионом строк:
Сжатие страниц само по себе довольно неэффективно для выборочных данных (реальные данные должны сжиматься немного лучше). Хэш-индекс позволяет уменьшить размер индекса в 4 раза.Сжатие страницы по хеш-индексу позволяет уменьшить размер индекса в 6 раз.
Мои цели при использовании хеш-индексов: