Как получить список всех индексов и столбцов индекса в SQL Server 2005+? Самое близкое, что я мог получить:
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
Что не совсем то, что я хочу.
Я хочу, чтобы список всех пользовательских индексов ( что означает отсутствие индексов, поддерживающих уникальные ограничения и первичные ключи ) со всеми столбцами (упорядоченными по тому, как они отображаются в определении индекса) плюс как можно больше метаданных.
sql-server
tsql
indexing
reverse-engineering
Антон Гоголев
источник
источник
Ответы:
Существует два вида каталога "sys", с которыми вы можете ознакомиться:
Они дадут вам практически любую информацию о индексах и их столбцах.
РЕДАКТИРОВАТЬ: Этот запрос приближается к тому, что вы ищете:
источник
is_ms_shipped=0
), но не было первичных ключей (is_primary_key=0
) и индексов, созданных только для поддержки уникальных ограничений (is_unique_constraint=0
).WHERE (1=1)
позволяет ему цепочку и переупорядочить его,AND ...
не беспокоясь о том, что было первым. См .: stackoverflow.com/a/8149183/1160796 и stackoverflow.com/a/242831/1160796Вы можете использовать
sp_helpindex
для просмотра всех индексов одной таблицы.И для всех индексов вы можете пройти,
sys.objects
чтобы получить все индексы для каждой таблицы.источник
Ничто из вышеперечисленного не сделало работу для меня, но это делает:
Если ваши имена включают пробелы, добавьте квадратные скобки вокруг них в сценарии создания.
Когда в последнем столбце Key все нули, вы знаете, что ни один из них не пропущен.
Отфильтровывать первичные ключи и т. Д., Как в исходном запросе, тривиально.
ПРИМЕЧАНИЕ. Будьте осторожны с этим решением, поскольку оно не различает проиндексированные и включенные столбцы.
источник
Коротко и сладко
источник
Следующее работает на SQL Server 2014/2016, а также на любой базе данных Microsoft Azure SQL.
Создает полный набор результатов, который легко экспортировать в Блокнот / Excel для нарезки и нарезки кубиками и включает в себя
источник
Эй, ребята, я не прошел, но я получил то, что хотел в запросе, опубликованном оригинальным автором.
Я использовал его (без условий / фильтров) для моего требования, но это дало неправильные результаты
Основная проблема заключалась в получении кросс-продукта результатов без условия объединения по index_id
источник
Мне нужно было получить определенные индексы, их столбцы индекса и включенные столбцы, а также. Вот запрос, который я использовал:
источник
SELECT
генерироватьCREATE
заявления:,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
.После дает то , что подобно тому, как sp_helpindex имя_таблица
источник
На основании принятого ответа и двух других вопросов 1 , 2 я собрал следующий запрос:
Этот запрос возвращает результаты, такие как ниже, который показывает список индексов, их столбцы и использование. Очень полезно при определении, какой индекс работает лучше, чем другие:
источник
это будет работать:
это не возвращает имя таблицы, и вы получите предупреждения для всех таблиц без индекса; если это проблема, вы можете создать цикл над таблицами, индексы которых выглядят следующим образом:
РЕДАКТИРОВАТЬ,
если вы хотите, вы можете отфильтровать данные, вот несколько примеров (они работают для любого метода):
источник
источник
index_column_id
- это не порядок столбцов в ПК, а в таблице! Используйтеkey_ordinal
вместо этого.Это способ возврата к индексам. Вы можете использовать SHOWCONTIG для оценки фрагментации. В нем будут перечислены все индексы для базы данных или таблицы, а также статистика. Я хотел бы предупредить, что на большой базе данных, это может быть длительным. Для меня одним из преимуществ этого подхода является то, что вам не нужно быть администратором, чтобы использовать его.
- Показать информацию фрагментации на все индексы в базе данных
... выключите NOCOUNT, когда закончите
- Показать информацию фрагментации на все индексы в таблице
- Показать информацию фрагментации по конкретному индексу
источник
Могу ли я дать другой ответ на этот насыщенный вопрос?
Это либеральная доработка ответа @marc_s, смешанного с некоторыми материалами @Tim Ford, с целью получить немного более чистый и простой набор результатов, а также окончательное отображение и порядок для моих текущих потребностей.
источник
основываясь на коде Тима Форда, это правильный ответ:
источник
index_column_id
- это не порядок столбцов в ПК, а в таблице! Используйтеkey_ordinal
вместо этого.Я придумал этот, который дает мне точный обзор, который мне нужен. Помогает то, что вы получаете одну строку на индекс, в которую агрегируются столбцы индекса.
источник
Поскольку в вашем профиле указано, что вы используете .NET, вы можете программно использовать объекты, управляемые сервером (SMO) ... в противном случае любой из приведенных выше ответов является фантастическим.
источник
Вышеупомянутое решение элегантно, но согласно MS, INDEXKEY_PROPERTY устарела. Смотрите: http://msdn.microsoft.com/en-us/library/ms186773.aspx
источник
В Oracle
В SQL Server с
источник
Просто отметьте, что если вы собираетесь использовать любой из вышеперечисленных рабочих запросов для сценариев ваших индексов, вам нужно включить столбец filter_definition из таблицы sys.indexes в свои запросы, чтобы получить определение фильтра для некластеризованных индексов в SQL 2008+
AM
источник
Приведенный ниже запрос включает всю необходимую информацию для пользовательских индексов (без индексов для уникальных ограничений и первичных ключей) со всеми столбцами:
В качестве дополнительного бонуса приведенный ниже запрос отформатирован для записи сценариев создания индекса и удаления индекса:
источник
Это моё, работает на одной схеме по умолчанию, но её можно легко улучшить. Она дает 3 столбца с SQLQueries - Create / Drop / Rebuild (без реорганизации)
Запрос:
Вывод
источник
Во-первых, обратите внимание, что все вышеперечисленные запросы могут быть пропущены или по ошибке включают INCLUDE. столбцы в индексы. В некоторых также отсутствует правильное упорядочение и / или опция ASC / DESC столбцов.
Модифицированный выше запрос от jona. Кроме того, во многих базах данных, которые я использую, я устанавливаю свою собственную агрегатную функцию CLR CONCATENATE, поэтому приведенный ниже код зависит от наличия чего-то подобного. Вышеприведенные операторы SQL сводятся к гораздо более понятному:
Существует множество конкатенационных агрегатов , если ваша среда допускает добавление к ней функций, основанных на CLR.
источник
Для уникальных столбцов по индексу:
источник
Вот лучший способ сделать это:
Я предпочитаю использовать неявные объединения, так как мне гораздо легче понять. Вы можете удалить ссылку на object_id, так как она может вам не понадобиться.
Приветствия.
источник
Используя SQL Server 2016, это дает полный список всех индексов с включенным дампом каждой таблицы, чтобы вы могли увидеть, как эти таблицы связаны. Также показаны столбцы, включенные в индексы покрытия:
источник
index_column_id
- это не порядок столбцов в ПК, а в таблице! Используйтеkey_ordinal
вместо этого.Я использовал следующий запрос, когда у меня было это требование ...
источник
Рабочее решение для SQL Server 2014. Я включил сюда только несколько выходных полей, но не стесняйтесь добавлять сколько угодно.
источник
index_column_id
- это не порядок столбцов в ПК, а в таблице! Используйтеkey_ordinal
вместо этого.Я дал ответ KFD9 обновление.
Я адаптировал их версию для поддержки спецификации include и не использовал indexkey_property, которая устарела
Это дает вам инструкции create и drop для индексов и ограничений.
источник
источник
index_column_id
- это не порядок столбцов в ПК, а в таблице! Используйтеkey_ordinal
вместо этого.