sql >> Base de Datos >  >> RDS >> Sqlserver

SQL Server:¿índice en una columna calculada?

Suponiendo que tiene sus campos en este formato:

00Data0007
000000Data0011
0000Data0015

, puede hacer lo siguiente:

  • Cree una columna calculada:ndata AS RIGHT(REVERSE(data), LEN(data) - 4)

    Esto transformará sus columnas en lo siguiente:

    ataD00
    ataD000000
    ataD0000
    
  • Crea un índice en esa columna

  • Emita esta consulta para buscar la cadena Data :

    SELECT  *
    FROM    mytable
    WHERE   ndata LIKE N'ataD%'
            AND SUBSTRING(ndata, LEN(N'ataD') + 1, LEN(ndata)) = REPLICATE('0', LEN(ndata) - LEN('ataD'))
    

    La primera condición usará un índice para el filtrado grueso.

    El segundo se asegurará de que todos los caracteres iniciales (que se convirtieron en los caracteres finales en la columna calculada) no sean más que ceros.

Consulte esta entrada en mi blog para obtener detalles sobre el rendimiento:

Actualizar

Si solo desea un índice en SUBSTRING sin cambiar su esquema, crear una vista es una opción.

CREATE VIEW v_substring75
WITH SCHEMABINDING
AS
SELECT  s.id, s.data, SUBSTRING(data, 7, 5) AS substring75
FROM    mytable

CREATE UNIQUE CLUSTERED INDEX UX_substring75_substring_id ON (substring75, id)

SELECT  id, data
FROM    v_substring75
WHERE   substring75 = '12345'