Qual é a melhor maneira de indexar uma coluna para uma pesquisa eficiente com base em uma comparação bit a bit na cláusula WHERE, por exemplo
SELECT ID, FLAGS, NAME FROM TABLE WHERE FLAGS & 4 = 4
Estou em um ambiente SQL Server 2012.
Entendo que um índice na coluna FLAGS não será usado neste tipo de consulta.
Sei que a outra opção é dividir a coluna FLAGS em colunas individuais, mas queria evitar isso porque, em alguns casos, isso significaria mais de 25 novas colunas, cada uma das quais precisaria de uma combinação de índices para dar suporte às consultas comuns.
Existem maneiras de indexar a coluna única para que as consultas bit a bit sejam mais eficientes?
Tentei usar uma coluna computada com um índice conforme sugerido pelo dudu abaixo, mas quando usei em uma tabela que possui um índice clusterizado e comecei a selecionar colunas (ao invés de apenas selecionar count(*) ele não usa mais o índice naquela nova coluna calculada.
SELECT
*
INTO
MYTABLE
FROM
(
SELECT 'A' COL_A, 'A' COL_B, CAST(129 AS INT) FLAGS UNION
SELECT 'B' COL_A, 'D' COL_B, CAST(129 AS INT) FLAGS UNION
SELECT 'C' COL_A, 'S' COL_B, CAST(129 AS INT) FLAGS UNION
SELECT 'D' COL_A, 'F' COL_B, CAST(129 AS INT) FLAGS UNION
SELECT 'E' COL_A, 'T' COL_B, CAST(128 AS INT) FLAGS UNION
SELECT 'F' COL_A, 'D' COL_B, CAST(128 AS INT) FLAGS UNION
SELECT 'G' COL_A, 'D' COL_B, CAST(128 AS INT) FLAGS UNION
SELECT 'H' COL_A, 'X' COL_B, CAST(128 AS INT) FLAGS
) SRC
CREATE CLUSTERED INDEX IX_CLU_A ON MYTABLE(COL_A)
ALTER TABLE MYTABLE ADD FLAG_BIT_1 AS (CAST ((FLAGS & 1) AS BIT))
CREATE INDEX MYTABLE_IX_FLAG_BIT_1 ON MYTABLE (FLAG_BIT_1)
SELECT * FROM MYTABLE WHERE FLAGS & 1 = 1
SELECT * FROM MYTABLE WHERE FLAG_BIT_1 = 1
SELECT COUNT(*) FROM MYTABLE WHERE FLAGS & 1 = 1
SELECT COUNT(*) FROM MYTABLE WHERE FLAG_BIT_1 = 1
Índice na coluna computada (AKA virtual)
Demonstração