sql - una - indices en base de datos
Vista indexada vs índices en la tabla (5)
"Las columnas fuente y descripción deben buscarse en subcadenas".
Cuando busca subcadenas en las columnas varchar (), SQL Server no usará ningún índice (incluso si replica la tabla y crea índices) los índices no se usan, si se usa un carácter salvaje al comienzo de su búsqueda cuerda .
Supongo que es mejor crear un índice de texto completo en ''Fuente'' y ''Descripción'', si necesita buscar subcadenas en ellas.
Así que mi sugerencia sería crear un Índice de texto completo en las columnas varchar () y hacer el Seguimiento de cambios como Manual y ejecutarlo cada hora aproximadamente cuando no haya DML ... lo que disminuiría las Cargas en las declaraciones INSERT
Tengo la siguiente tabla
EVENT_LOG
:
EVENT_ID: pk, int, not null
TYPEID: fk, int, not null
CATEGORYID: fk, int, null
SOURCE: varchar(255), null
DESCRIPTION: varchar(4000), null
CREATED: datetime, null
Hemos estado creando un informe y encontramos que el rendimiento apesta. No hay ningún índice aparte del agrupado. Podríamos crearlos, pero debido a que esta tabla está escrita a más de lo que se lee, existe una preocupación de rendimiento de contrapesos. Para los informes, me inclino a colocar índices en cada columna porque las columnas fuente y descripción deben buscarse en subcadenas.
Nos preguntamos si una vista indexada ( vista materializada AKA) sería una opción, donde la vista indexada contendría todas las columnas de la tabla EVENT_LOG
pero tendrían los índices apropiados creados en la vista. ¿Nos EVENT_LOG
esto el rendimiento para los informes, sin afectar las escrituras en la tabla EVENT_LOG
?
Creo que aún afectaría el rendimiento, ya que los índices en la vista materializada deben actualizarse en algún momento, aunque probablemente no sea necesario que estén sincronizados con las escrituras de la tabla.
Personalmente, pondría los índices en la tabla y mediría el rendimiento de escritura yo mismo. Puedes adivinar cuánto sería el número de escrituras más lentas con los índices allí, pero hasta que realmente lo midas solo estarás especulando. Puede que no haga una diferencia notable en absoluto.
Me encontré con un problema similar. Decidió agregar un índice de varias columnas contra el consejo de DBA. En mi máquina de desarrollo y el servidor (con permiso de DBA), el rendimiento para escribir e informar fue significativamente más rápido (17x) que la creación de índices en columnas individuales. Por qué, no lo sé, ya que no soy un DBA, pero sí conozco lo básico, y algunas veces eso te ayuda a ver a través del bosque / árboles. Por lo tanto, estoy de acuerdo con Eric Pertroelje, debe agregar índices y medir el rendimiento de escritura e incluso medir el rendimiento de lectura.
No si va a escribir a menudo, ya que tendría el costo de rendimiento del índice en su vista materializada. Las vistas materializadas son más para los datos que no cambian a menudo.
Una vista indexada causará los mismos problemas que un índice en la columna, ya que las vistas indizadas requieren with schemabinding
, que lo vinculan directamente a la tabla, impidiendo que usted cambie o altere el esquema de esa tabla de cualquier forma, forma o forma. Esto incluye cambiar el tamaño de una columna (p. Ej., De varchar(50)
a varchar(255)
), cambiar el tipo de datos de una columna (p. Ej., De double
a decimal(18,5)
), etc. He visto que causan mucho Dolores de cabeza inesperados debido a este hecho.
Mi sugerencia es configurar un procedimiento almacenado o un paquete SSIS que cree una tabla de informes para usted que se ejecute cada hora aproximadamente. De esta manera, puede indexar el infierno de todos los amantes y disfrutar de todos los beneficios de rendimiento que produce. Me da miedo negarme a informar desde un sistema en vivo y en progreso. Todavía no he visto el caso donde esto es necesario. Para fines de presentación de informes, la información de una hora de antigüedad suele ser absolutamente suficiente para realizar el trabajo.