Запрос на проверку индекса по таблице - PullRequest
35 голосов
/ 26 ноября 2009

Мне нужен запрос, чтобы проверить, есть ли в таблице какие-либо индексы.

Ответы [ 9 ]

71 голосов
/ 26 ноября 2009

На SQL Server будут перечислены все индексы для указанной таблицы:

select * from sys.indexes
where object_id = (select object_id from sys.objects where name = 'MYTABLE')

В этом запросе будут перечислены все таблицы без индекса:

SELECT name
FROM sys.tables 
WHERE OBJECTPROPERTY(object_id,'IsIndexed') = 0

И это интересный FAQ по MSDN по соответствующей теме:
Вопросы и ответы по системному каталогу SQL Server

17 голосов
/ 26 ноября 2009

Если вы используете MySQL, вы можете запустить SHOW KEYS FROM table или SHOW INDEXES FROM table

9 голосов
/ 04 августа 2015

Если вам просто нужны индексированные столбцы EXEC sp_helpindex 'TABLE_NAME'

7 голосов
/ 26 ноября 2009

Большинство современных РСУБД поддерживают схему INFORMATION_SCHEMA. Если ваш поддерживает это, то вы хотите либо INFORMATION_SCHEMA.TABLE_CONSTRAINTS или INFORMATION_SCHEMA.KEY_COLUMN_USAGE, либо, возможно, оба.

Чтобы увидеть, поддерживает ли ваш, это так же просто, как запустить

select count(*) from INFORMATION_SCHEMA.TABLE_CONSTRAINTS

РЕДАКТИРОВАТЬ: SQL Server имеет INFORMATION_SCHEMA, и его проще использовать, чем их таблицы, зависящие от поставщика, так что просто пойти с ним.

3 голосов
/ 26 ноября 2009

в Oracle:

  • Определить все индексы в таблице:

    SELECT index_name 
     FROM user_indexes
     WHERE table_name = :table
    
  • Определение индексов столбцов и столбцов по индексу:

    SELECT index_name
         , column_position
         , column_name
      FROM user_ind_columns
     WHERE table_name = :table
     ORDER BY index_name, column_order
    

Ссылки:

2 голосов
/ 19 апреля 2016

Вот что я использовал для TSQL, который позаботился о том, чтобы имя моей таблицы могло содержать имя схемы и, возможно, имя базы данных:

DECLARE @THETABLE varchar(100);
SET @THETABLE = 'theschema.thetable';
select i.*
  from sys.indexes i
 where i.object_id = OBJECT_ID(@THETABLE)
   and i.name is not NULL;

Вариант использования для этого заключается в том, что я хотел получить список индексов для именованной таблицы, чтобы я мог написать процедуру, которая будет динамически сжимать все индексы в таблице.

1 голос
/ 24 апреля 2017

Создана хранимая процедура для вывода списка индексов для таблицы в базе данных в SQL Server

create procedure _ListIndexes(@tableName nvarchar(200))
as
begin
/*
exec _ListIndexes '<YOUR TABLE NAME>'
*/
SELECT DB_NAME(DB_ID()) as DBName,SCH.name + '.' + TBL.name AS TableName,IDX.name as IndexName, IDX.type_desc AS IndexType,COL.Name as ColumnName,IC.*
    FROM sys.tables AS TBL 
         INNER JOIN sys.schemas AS SCH ON TBL.schema_id = SCH.schema_id 
         INNER JOIN sys.indexes AS IDX ON TBL.object_id = IDX.object_id 
         INNER JOIN sys.index_columns IC ON  IDX.object_id = IC.object_id and IDX.index_id = IC.index_id 
         INNER JOIN sys.columns COL ON ic.object_id = COL.object_id and IC.column_id = COL.column_id 
        where TBL.name = @tableName
    ORDER BY TableName,IDX.name

end
1 голос
/ 04 января 2017

Сначала вы проверяете свой идентификатор таблицы (он же object_id)

SELECT * FROM sys.objects WHERE type = 'U' ORDER BY name

тогда вы можете получить имена столбцов. Например, предполагая, что вы получили из предыдущего запроса число 4 как object_id

SELECT c.name
FROM sys.index_columns ic
INNER JOIN sys.columns c ON  c.column_id = ic.column_id
WHERE ic.object_id = 4 
AND c.object_id = 4
0 голосов
/ 07 января 2017

проверьте это также Это дает обзор связанных ограничений по базе данных. Пожалуйста, также включите облегчение, когда условие с именем таблицы интереса, чтобы дать информацию быстрее.

select a.TABLE_CATALOG as DB_name,a.TABLE_SCHEMA as tbl_schema, a.TABLE_NAME as tbl_name,a. CONSTRAINT_NAME as constraint_name,b.CONSTRAINT_TYPE from INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE a join INFORMATION_SCHEMA.TABLE_CONSTRAINTS b on a.CONSTRAINT_NAME=b.CONSTRAINT_NAME

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...