Мне нужен запрос, чтобы увидеть, есть ли в таблице какие-либо индексы.
Запрос проверки индекса на таблицу
Ответ 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