Как заставить MS SQL Server прозрачно использовать индекс CHECKSUM/хэш?

Похоже, что 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'

Clustered Index Scan (BAD)


Обновленный запрос. Причины NonClustered Index Seek (хорошо):

SELECT * FROM big_table 
WHERE wide_col = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
AND wide_col_checksum = CHECKSUM('ABCDEFGHIJKLMNOPQRSTUVWXYZ')

NonClustered Index Seek (good)

Исходная информация

Моя таблица очень большая (много сотен миллионов строк), имеет несколько индексов (~ 20), все из которых обязательны. Некоторые проиндексированные столбцы имеют небольшую ширину (~ 50 байт) и содержат несколько повторяющихся значений. Столбцы ищутся только на равенство. Таблица вставляется постоянно.

Вот таблица, в которой сравниваются «обычные» индексы и индексы CHECKSUM/хэш в таблице выше, как сжатые, так и несжатые. Данные из недавно перестроенных индексов для таблиц с 1 миллионом строк:

Hash indexes and compression

Сжатие страниц само по себе довольно неэффективно для выборочных данных (реальные данные должны сжиматься немного лучше). Хэш-индекс позволяет уменьшить размер индекса в 4 раза.Сжатие страницы по хеш-индексу позволяет уменьшить размер индекса в 6 раз.

Мои цели при использовании хеш-индексов:

  1. Уменьшить размер этих индексов в памяти, тем самым позволяя SQL Server кэшировать большую часть в ОЗУ, тем самым избегая физического чтения.
  2. Уменьшите размер хранилища индексов.
  3. Уменьшите ввод-вывод индекса для операций INSERT.
8
задан deleto 18 June 2012 в 15:51
поделиться