SQL Server: Indexar columnas usadas en like?


¿Es una buena idea indexar columnas varchar solo usadas en opertaciones SIMILARES? De lo que puedo leer de query analytics obtengo de la siguiente consulta:

SELECT * FROM ClientUsers WHERE Email LIKE '%niels@bosmainter%'

Obtengo un "Costo estimado del subárbol" de 0.38 sin ningún índice y 0.14 con un índice. ¿Es esta una buena métrica para usar para anlayzing si una consulta ha sido optimizada con un índice?

Author: marc_s, 2009-09-07

3 answers

Dados los datos'abcdefg'

WHERE Column1 LIKE '%cde%'  --can't use an index

WHERE Column1 LIKE 'abc%' --can use an index

WHERE Column1 Like '%defg' --can't use an index, but see note below

Nota: Si tiene consultas importantes que requieren '%defg', puede usar una columna calculada persistente donde INVIERTE() la columna y luego la indexa. A continuación, puede consultar:

WHERE Column1Reverse Like REVERSE('defg')+'%' --can use the persistent computed column's index
 60
Author: KM.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-21 16:11:45

En mi experiencia, el primer signo %hará que cualquier índice sea inútil, pero uno al final usará el índice.

 8
Author: idstam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-07 07:47:46

Para responder a la parte de métricas de su pregunta: El tipo de índice/exploración de tabla/búsqueda que se está realizando es un buen indicador para saber si un índice se está utilizando (correctamente). Por lo general, se muestra en la parte superior del analizador de plan de consulta.

Los siguientes tipos de exploración/búsqueda se ordenan de peor (superior) a mejor (inferior):

  • Exploración de la tabla
  • Análisis de índice agrupado
  • Index Scan
  • Búsqueda de Índice agrupado
  • Index Seek

Como regla de pulgar, normalmente trataría de obtener busca sobre escaneos siempre que sea posible. Como siempre, hay excepciones dependiendo del tamaño de la tabla, columnas consultadas, etc. Recomiendo hacer una búsqueda en StackOverflow para "scan seek index", y obtendrá mucha información buena sobre este tema.

 3
Author: MicSim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-18 08:13:04