¿Cómo obtengo una lista de todas las columnas de índice e índice en SQL Server 2005+? Lo más cerca que pude llegar es:
select s.name, t.name, i.name, c.name from sys.tables t
inner join sys.schemas s on t.schema_id = s.schema_id
inner join sys.indexes i on i.object_id = t.object_id
inner join sys.index_columns ic on ic.object_id = t.object_id
inner join sys.columns c on c.object_id = t.object_id and
ic.column_id = c.column_id
where i.index_id > 0
and i.type in (1, 2) -- clustered & nonclustered only
and i.is_primary_key = 0 -- do not include PK indexes
and i.is_unique_constraint = 0 -- do not include UQ
and i.is_disabled = 0
and i.is_hypothetical = 0
and ic.key_ordinal > 0
order by ic.key_ordinal
Que no es exactamente lo que quiero.
Lo que quiero es enumerar todos los índices definidos por el usuario (lo que significa que no hay índices que admitan restricciones únicas y claves principales ) con todas las columnas (ordenadas por cómo aparecen en la definición del índice) más tantos metadatos como sea posible.
sql-server
tsql
indexing
reverse-engineering
Anton Gogolev
fuente
fuente
Respuestas:
Hay dos vistas de catálogo "sys" que puede consultar:
Esos le darán casi cualquier información que pueda desear sobre los índices y sus columnas.
EDITAR: esta consulta se está acercando bastante a lo que está buscando:
fuente
is_ms_shipped=0
), pero no las claves principales (is_primary_key=0
) ni los índices que se crean para admitir restricciones únicas (is_unique_constraint=0
).WHERE (1=1)
dejó encadenar y reordenar su correo electrónicoAND ...
sin preocuparse por cuál fue el primero. Ver: stackoverflow.com/a/8149183/1160796 y stackoverflow.com/a/242831/1160796Puede usar
sp_helpindex
para ver todos los índices de una tabla.Y para todos los índices, puede recorrer
sys.objects
para obtener todos los índices para cada tabla.fuente
Ninguno de los anteriores hizo el trabajo para mí, pero esto sí:
Si sus nombres incluyen espacios, agregue corchetes alrededor de ellos en los scripts de creación.
Cuando la última columna Clave es nula, sabe que no falta ninguna.
Filtrar claves primarias, etc. como en la solicitud original es trivial.
NOTA: Tenga cuidado con esta solución, ya que no distingue las columnas indexadas e incluidas.
fuente
--Corto y dulce:
fuente
Lo siguiente funciona en SQL Server 2014/2016, así como en cualquier base de datos SQL de Microsoft Azure.
Produce un conjunto completo de resultados que se puede exportar fácilmente a Notepad / Excel para cortar y cortar en cubitos e incluye
fuente
Hola chicos, no lo revisé pero obtuve lo que quería en la consulta publicada por el autor original.
Lo usé (sin condiciones / filtros) para mi requerimiento pero dio resultados incorrectos
El principal problema fue que los resultados obtuvieron productos cruzados sin condición de unión en index_id
fuente
He necesitado obtener índices particulares, sus columnas de índice y sus columnas incluidas también. Aquí está la consulta que he usado:
fuente
SELECT
de generar lasCREATE
declaraciones:,CreateStatement = 'CREATE INDEX [' + INX.[name] + '] ON dbo.[' + TBL.[name] + '] (' + REPLACE(DS1.IndexColumnsNames, '] [', '], [') + ')' + CASE WHEN DS2.IncludedColumnsNames IS NOT NULL THEN ' INCLUDE (' + REPLACE(DS2.IncludedColumnsNames, '] [', '], [') + ')' ELSE '' END
.Siguiente da lo que es similar a sp_helpindex tablename
fuente
Basado en la respuesta aceptada y otras dos preguntas 1 , 2 , he reunido la siguiente consulta:
Esta consulta devuelve resultados como el siguiente, que muestra la lista de índices, sus columnas y su uso. Muy útil para determinar qué índice está funcionando mejor que otros:
fuente
esto funcionará:
esto no vuelve a generar el nombre de la tabla y obtendrá advertencias para todas las tablas sin un índice, si eso es un problema, puede crear un bucle sobre las tablas que tienen índices como este:
EDITE
si lo desea, puede filtrar los datos, aquí hay algunos ejemplos (estos funcionan para cualquier método):
fuente
fuente
index_column_id
es el orden de las columnas en el PK sino en la tabla! Usar en su lugar.key_ordinal
Esta es una forma de retroceder en los índices. Puede usar SHOWCONTIG para evaluar la fragmentación. Enumerará todos los índices de la base de datos o la tabla, junto con las estadísticas. Advierto que en una base de datos grande, puede ser de larga duración. Para mí, uno de los beneficios de este enfoque es que no es necesario ser administrador para usarlo.
- Mostrar información de fragmentación en todos los índices en una base de datos
... apague NOCOUNT nuevamente cuando haya terminado
- Mostrar información de fragmentación en todos los índices en una tabla
- Mostrar información de fragmentación en un índice específico
fuente
¿Puedo arriesgar otra respuesta a esta pregunta saturada?
Esta es una reelaboración liberal de la respuesta de @marc_s, mezclada con algunas cosas de @Tim Ford, con el objetivo de tener un conjunto de resultados más limpio y simple y una visualización final y pedidos para mi necesidad actual.
fuente
basado en el código de Tim Ford, esta es la respuesta correcta:
fuente
index_column_id
es el orden de las columnas en el PK sino en la tabla! Usar en su lugar.key_ordinal
Se me ocurrió esta, que me da la descripción exacta que necesito. Lo que ayuda es que obtienes una fila por índice en la que se agregan las columnas de índice.
fuente
Dado que su perfil indica que está usando .NET, podría usar Objetos administrados por servidor (SMO) mediante programación ... de lo contrario, cualquiera de las respuestas anteriores es fantástica.
fuente
La solución anterior es elegante, pero según MS, INDEXKEY_PROPERTY está en desuso. Ver: http://msdn.microsoft.com/en-us/library/ms186773.aspx
fuente
En oráculo
En SQL Server con
fuente
Solo tenga en cuenta que si va a utilizar cualquiera de las consultas de trabajo anteriores para escribir sus índices, debe incorporar la columna filter_definition de la tabla sys.indexes en sus consultas para obtener la definición de filtro de índices no agrupados en SQL 2008+
A.M
fuente
La consulta a continuación incluye toda la información pertinente para los índices definidos por el usuario (sin índices para restricciones únicas y claves principales) con todas las columnas:
Como beneficio adicional, la siguiente consulta está formateada para escribir los scripts de creación de índice y caída de índice:
fuente
Esto es mío, funciona en un esquema predeterminado pero se puede mejorar fácilmente. Da 3 columnas con SQLQueries - Crear / Soltar / Reconstruir (sin reorganizar)
Consulta:
Salida
fuente
Primero, tenga en cuenta que todas las consultas anteriores pueden perder o incorporar erróneamente INCLUIR columnas de los índices. También falta en algunos el orden apropiado y / o la opción ASC / DESC de las columnas.
Modificado la consulta anterior por jona. Por otro lado, en muchas de las bases de datos que uso, instalo mi propia función agregada CLR CONCATENATE, por lo que el siguiente código depende de que algo así esté presente. Las declaraciones SQL anteriores se reducen a un mantenimiento mucho más sostenible:
Existen muchos agregados de concatenación si su entorno permite que se le agreguen funciones basadas en CLR.
fuente
Para columnas únicas por índice:
fuente
Aquí está la mejor manera de hacerlo:
Prefiero usar combinaciones implícitas ya que es mucho más fácil de entender para mí. Puede eliminar la referencia object_id ya que puede que no la necesite.
Salud.
fuente
Con SQL Server 2016, esto proporciona una lista completa de todos los índices, con un volcado incluido de cada tabla para que pueda ver cómo se relacionan las tablas. También muestra columnas incluidas en los índices de cobertura:
fuente
index_column_id
es el orden de las columnas en el PK sino en la tabla! Usar en su lugar.key_ordinal
He utilizado la siguiente consulta cuando tuve este requisito ...
fuente
Solución de trabajo para SQL Server 2014. He incluido solo un puñado de campos de salida aquí, pero no dude en agregar tantos como desee.
fuente
index_column_id
es el orden de las columnas en el PK sino en la tabla! Usar en su lugar.key_ordinal
Le di a la respuesta de KFD9 una actualización.
Adapte su versión para admitir la especificación de inclusión y no utilizar indexkey_property, que está en desuso
Esto le proporciona una declaración de creación y caída para índices y restricciones.
fuente
fuente
index_column_id
es el orden de las columnas en el PK sino en la tabla! Usar en su lugar.key_ordinal