Подтвердить что ты не робот

Запрос проверки индекса на таблицу

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

4b9b3361

Ответ 1

В 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

Ответ 2

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

Ответ 3

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

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

select count(*) from INFORMATION_SCHEMA.TABLE_CONSTRAINTS

EDIT: SQL Server имеет INFORMATION_SCHEMA, и он проще в использовании, чем их таблицы, зависящие от поставщика, поэтому просто пойдите с ним.

Ответ 4

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

Ответ 5

В 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
    

Литература:

Ответ 6

Вот что я использовал для 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;

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

Ответ 7

Создал хранимую процедуру для индексирования таблицы в базе данных в 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

Ответ 8

Сначала вы проверяете свой идентификатор таблицы (aka 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

Ответ 9

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

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