Sei sulla pagina 1di 7

Historia de los ndices duplicados

Las bases de datos creadas con SQL Anywhere 5 y Adaptativa Server Anywhere 6 tienen un ndice combinado creado para cada uno de sus claves externas hacen referencia a la clave primaria o de unicidad y. Tales ndices combinados podran ser muy grandes si muchas claves externas hacen referencia a la misma clave primaria o de unicidad. Por lo tanto, estos ndices pueden afectar al rendimiento si se utiliza para exploraciones de ndices parciales en una consulta. Esta fue la razn por la cual se recomienda crear otra sencilla (es decir, sin combinar) los ndices de las mismas columnas que la clave principal y en las mismas columnas como las claves externas. Los ndices simples funcionan mucho mejor si se utiliza en consultas que tienen predicados comparables mediante SARG de columnas de clave principal o las columnas de clave externa. Los cambios introducidos en Adaptive Server Anywhere 7 quitan la necesidad de la creacin de tales ndices duplicados de las bases de datos creadas con SQL Server 7 y versiones posteriores tienen un ndice separado para cada clave primaria, restriccin nica y clave externa declarada en el esquema de base de datos. No hay ndices combinados se crean para estas bases de datos. Si, por alguna razn, una base de datos tiene ndices duplicados (es decir, los ndices creados en las mismas columnas con las propiedades similares de secuencia de columna), el rendimiento de las dos operaciones de actualizacin y consulta podra verse afectada.Como parte de su enfoque en el rendimiento, Adaptive Server en cualquier lugar 8 introdujo varios mensajes de advertencia de rendimiento nuevos, incluyendo uno que identifica la existencia de ndices duplicados. Para las tablas de base, la lista de ndices se analiza para marcar los ndices duplicados cuando se cargan los ndices, o si se agrega o se quita un ndice. Un mensaje de advertencia de la muestra es: Nota: Duplicar ndice "IDX1" de la tabla "t" en la base de datos "db".

Impacto en el rendimiento
La presencia de ndices duplicados puede reducir el rendimiento debido a que: Cada vez que una columna indexada se ha modificado, Adaptive Server Anywhere debe cambiar el valor de la tabla y tambin cambiar el ndice. Si hay ndices duplicados, cada ndice se debe mantener por separado cada vez que se modifican los datos. Aumenta la cantidad de mantenimiento de ndices de INSERT, UPDATE y DELETE que afectan el ndice. Espacio de bsqueda del optimizador aumenta en la bsqueda de un ndice apropiado de usar, lo que posiblemente evitando que la bsqueda de un plan de acceso ptimo para algunas declaraciones. **

** NOTA: Debido a los cambios realizados a raz del caso de la ingeniera # 357981, ndices duplicados ya no se consideran durante la optimizacin, a no ser nombrada en una sugerencia de ndice. Para ms informacin: 1. Visita la seccin de asistencia. 2. Haga clic Casos resueltos en las opciones de la barra lateral. o Puede acceder Casos resueltos si usted tiene un contrato de soporte Sybase y son un soporte tcnico designado Contacto. 3. Inicie sesin en MySybase. 4. Seleccione las solicitudes de cambio.

5. Entre 357.981 en el campo de palabras clave. 6. Haga clic en Ir!.

Casos de duplicacin de ndices comunes Aqu est una lista de los


casos ms comunes de la duplicacin de ndice: La columna de clave principal se define en una columna declarada como nica Un ndice se define en la columna (s) que componen la clave principal Un ndice se define en una columna que se define en una restriccin de unicidad

Adaptive Server Anywhere automticamente ndices de columnas de clave principal, las columnas de clave externa, y las columnas con una restriccin de unicidad.Cuando se agrega una restriccin nica a una definicin de la clave primaria (que es de todos modos redundantes), o cuando se crea de forma explcita un ndice en una columna que se indexa de forma automtica, usted termina con un ndice duplicado. Se recomienda encarecidamente a bajar los ndices duplicados siempre que sea posible.

Reglas para determinar si un ndice es un duplicado


A continuacin se describe el mtodo empleado por Adaptive Server Anywhere para determinar si un ndice es un duplicado. Para esta discusin, vamos a suponer que el esquema tiene ndices IDX1 y IDX2 definidos. En este ejemplo, el servidor de base de datos se deriva que el IDX1 ndice tambin es nico porque IDX2 es nico. Un ndice es considerado un duplicado si concurren las siguientes condiciones: IDX1 y IDX2 se definen en las mismas columnas, con el mismo fin, y que tiene la propiedad ASC / DESC exactamente el mismo para cada columna. IDX2 es un ndice de clave principal, pero no es IDX1 IDX2 se declara ndice nico y no es IDX1 IDX2 es un ndice de clave externa y IDX1 no es IDX2 se declara ndice agrupado y IDX1 no es ninguna de las anteriores (en este caso, SQL Server elige aleatoriamente en cualquier lugar IDX1 ser el duplicado de IDX2)

Por ejemplo, supongamos que los siguientes ndices se definen: CREATE INDEX IDX1 EN T (ASC TA, TB DESC) CREATE UNIQUE IDX2 NDICE DE LA T (ASC TA, TB DESC) Para este diseo, IDX1 se considera un duplicado de IDX2.

Extraccin de los ndices duplicados


1. Copie y pegue el siguiente script en SQL interactivo y ejecutarlo. Este script muestra ndices duplicados y luego crea un procedimiento almacenado que cae un ndice. - Comenzar a copiar aqu llaman dbo.sa_make_object ("procedimiento", "sa_duplicate_indexes ',' dbo ') go

alterar dbo.sa_duplicate_indexes procedimiento () resultado ( nombre_usuario char (128), table_name char (128), table_id int sin firmar, index_name char (128), index_id int sin firmar, index_unique char (1), index_cols varchar (1000), index_seqs varchar ( 300), dup_index_name char (128), dup_index_id int sin firmar, dup_index_unique char (1), dup_index_seqs varchar (300)) comenzar declarar simple_indexes tablas temporales locales ( nombre_usuario char (128) no es nulo, nombre_tabla char (128) not null, unsigned int table_id no nulo, index_name char (128) not null, unsigned int index_id no nulo, index_unique char (1) no es nulo, index_cols varchar (1000) no es nulo, index_seqs varchar (300) NOT NULL, reverse_index_seqs varchar (300) NOT NULL ) al confirmar preservar filas; declarar duplicate_indexes tablas temporales locales ( nombre_usuario char (128) no es nulo, nombre_tabla char (128) not null, unsigned int table_id no nulo, index_name char (128) not null, unsigned int index_id no nulo, index_unique char (1) no es nulo, index_cols varchar (1000) no es nulo, index_seqs varchar (300) NOT NULL, dup_index_name char (128) not null, unsigned int dup_index_id, dup_index_unique char (1) not null, dup_index_seqs varchar (300) NOT NULL, ) al confirmar preservar filas; insertar en simple_indexes seleccionar SYS.SYSINDEX i unirme SYS.SYSTABLE t en (t.table_id = i.table_id) unirse SYS.SYSUSERPERMS u on (u.user_id = t.creator), lateral (lista de seleccin (orden c.column_name por ixc.sequence), lista (ixc. "orden" ordenado por ixc.sequence) lista ((si ixc. "orden" = 'A' a continuacin 'D' else 'A' endif) Ordenar por ixc.sequence) de SYS.SYSIXCOL ixc join SYS . SYSCOLUMN c on (c.column_id = ixc.column_id y c.table_id = ixc.table_id) donde ixc.table_id = i.table_id y ixc.index_id = i.index_id ) como DT (cols, seqs, rev_seqs) donde i. creador <> 0 ;

/ / Encuentra todos los ndices ascendentes o todos-descendente que son duplicados de PK insertar en duplicate_indexes ( seleccione clave ", tpk.seqs, 'P' de simple_indexes S, (select list (orden column_name por column_id) lista ('A'), identificador de tabla de SYS.SYSCOLUMN donde tecla p = 'Y' agrupar por table_id) tpk (clist, seqs, table_id) donde tpk.table_id = S.table_id y (index_seqs no como '% D% "o index_seqs no como '% A%') y index_cols = tpk.clist ) ;

/ / Encuentra los ndices no nicos totalmente ascendente o descendente todo que son duplicados de Fks insertar en duplicate_indexes (

seleccionar simple_indexes S, (select list (orden column_name por primary_column_id) lista ('A'), fk.foreign_key_id, fk.foreign_table_id, fk.role de SYS.SYSFOREIGNKEY fk join SYS.SYSFKCOL fkc on (fk.foreign_table_id = fkc.foreign_table_id y fk.foreign_key_id = fkc.foreign_key_id) unirse SYS.SYSCOLUMN c on (c.table_id = fkc.foreign_table_id y c.column_id = fkc.foreign_column_id) grupo por fk.foreign_key_id, fk.foreign_table_id, fk.role) como tfk (clist , seqs, foreign_key_id, foreign_table_id, papel) , donde (index_seqs no como '% D% "o index_seqs les gusta '% A%') y S.index_unique = 'N' ytfk.foreign_table_id = S.table_id y S.index_cols = tfk.clist

); / / Buscar ndices duplicados que no son claves y no son restricciones nicas insertar en duplicate_indexes ( select S1.user_name, S1.table_name, S1.table_id, (si S1.index_unique = 'U', entonces S2.index_name ms S1.index_name endif) como index_name, (si S1.index_unique = 'U', entonces S2 . index_id ms S1.index_id endif) como index_id, (si S1.index_unique = 'U' y luego S2.index_unique ms S1.index_unique endif) como index_unique, S1.index_cols, (si luego S1.index_seqs S1.index_unique = 'U' ms S2.index_seqs endif) como index_seqs, (si S1.index_unique = 'U', entonces S1.index_name ms S2.index_name endif) como dup_index_name, (si S1.index_unique = 'U', entonces S1.index_id ms S2.index_id endif) como dup_index_id, (si S1.index_unique = 'U', entonces S1.index_unique ms S2.index_unique endif) como dup_index_unique, (si S1.index_unique = 'U', entonces S1.index_seqs ms S2.index_seqs endif) como dup_index_seqs de simple_indexes S1, simple_indexes S2 donde S1.index_id> S2.index_id y S1.index_cols = S2.index_cols y S1.table_id = S2.table_id y (S1.index_seqs = S2.index_seqs O S1.index_seqs = S2.reverse_index_seqs) y (S1.index_unique < > 'U' OR S2.index_unique <> 'U') ); select * from duplicate_indexes; final ir llame dbo.sa_make_object ("procedimiento", "sa_drop_index ',' dbo ') ir

alterar procedimiento dbo.sa_drop_index ( en @ nombre_usuario char (128), en @ table_name char (128), en @ index_name char (128), en @ index_unique char (1)) comienzan if (@ index_unique = 'Y' OR @ index_unique = 'N') entonces mensaje "El ndice '| | @ nombre_usuario | |'. ' | | @ Table_name | | '.' | | @ Index_name | | '(' | | @ index_unique | | ')' | | '. est siendo abandonado " al cliente, ejecutar inmediatamente "ndice de cada" '| | @ nombre_usuario | |' "." '| | @ table_name | |' "." '| | @ index_name | |' "'; otro if (@ index_unique = 'U ') entonces el mensaje de advertencia! Redundante restriccin nica en '| | @ nombre_usuario | |'. ' | | @ Table_name | | '.' | | @ index_name | | 'debera eliminarse. al cliente, cosa mensaje "Warning! ndice redundante '| | @ nombre_usuario | |'. ' | | @ Table_name | | '.' | | @ Index_name | | '(' | | @ index_unique | | ')' | | '. No se deja caer' al cliente final si final si, final ir - Deje de copiar aqu 2. Ejecute la siguiente instruccin para listar los ndices duplicados: SELECT * FROM sa_duplicate_indexes () AS DT 3. Copie y pegue el siguiente script en SQL interactivo y ejecutarlo. Este script quita los ndices duplicados. comenzar a l1 como c1 cursor para (seleccione nombre_usuario distinta, table_name, index_name, index_unique de sa_duplicate_indexes ()) hacer sa_drop_index llamada (usuario, table_name, index_name, index_unique); finales de finales

Potrebbero piacerti anche