2009-11-25 39 views
26

Tôi cần một truy vấn để xem bảng đã có bất kỳ chỉ mục nào trên bảng đó hay không.Truy vấn để kiểm tra chỉ mục trên một bảng

+0

Trong postgres, nó chỉ là \ d + bảng, trong MySQL là desc

. Trong máy chủ SQL, nó phức tạp như là địa ngục bởi vì Microsoft muốn làm cho cuộc sống khó khăn cho tất cả chúng ta !! –

Trả lời

9

Nếu bạn đang sử dụng MySQL bạn có thể chạy SHOW KEYS FROM table hoặc SHOW INDEXES FROM table

+0

vì vậy xin lỗi vì đã không nói với môi trường. SQL Server 2008 – sine

1

On Oracle:

  • Xác định tất cả các chỉ số trên bảng:

    SELECT index_name 
    FROM user_indexes 
    WHERE table_name = :table 
    
  • Xác định các cột chỉ số và cột trên chỉ số:

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

Tài liệu tham khảo:

6

Hầu hết các hỗ trợ RDBMS hiện đại schema INFORMATION_SCHEMA. Nếu máy của bạn hỗ trợ điều đó, thì bạn muốn hoặc là INFORMATION_SCHEMA.TABLE_CONSTRAINTS hoặc INFORMATION_SCHEMA.KEY_COLUMN_USAGE hoặc có thể cả hai.

Để xem nếu bạn hỗ trợ nó cũng đơn giản như chạy

select count(*) from INFORMATION_SCHEMA.TABLE_CONSTRAINTS

EDIT: SQL Server không có INFORMATION_SCHEMA, và nó dễ dàng hơn để sử dụng hơn so với bảng nhà cung cấp cụ thể của họ, vì vậy chỉ cần đi với nó.

+3

Như tên cho thấy, khung nhìn chuẩn ANSI, 'INFORMATION_SCHEMA.TABLE_CONSTRAINTS' chỉ hiển thị các ràng buộc. Trong khi một số ràng buộc là các chỉ mục không phải tất cả các chỉ mục đều là các ràng buộc. Chế độ xem này sẽ không hiển thị các chỉ mục thông thường: chỉ hiển thị 'CONSTRAINT_TYPE' của 'UNIQUE', ' TỪ CHÍNH ",' NGOẠI TỆ 'hoặc 'CHECK'. Xem [phần có liên quan từ “Hoàn thành SQL-99, Thực sự”] (https://mariadb.com/kb/en/sql-99-complete-really/16-sql-catalogs/the-information-schema/ information_schema-views/information_schematable_constraints /) –

62

Mở SQL Server, điều này sẽ liệt kê tất cả các chỉ số cho một bảng quy định:

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

truy vấn này sẽ liệt kê tất cả các bảng mà không có một chỉ số:

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

Và đây là một MSDN FAQ thú vị về một chủ đề liên quan:
Querying the SQL Server System Catalog FAQ

+1

Làm cách nào để xem các cột mà các chỉ mục này đã được đặt vào? –

+0

Cần lưu ý truy vấn hàng đầu sẽ thất bại nếu bảng có nhiều chỉ mục, Thay thế 'object_id = (select' bằng' object_id IN (select' nếu bạn cần xem thông tin về chỉ mục hoặc chỉ muốn truy vấn hoàn thành không có lỗi. – Tor

3

Nếu bạn chỉ cần các cột được lập chỉ mục E XEC sp_helpindex 'TABLE_NAME'

2

Dưới đây là những gì tôi sử dụng cho TSQL mà đã chăm sóc của vấn đề mà tên bảng của tôi có thể chứa tên lược đồ và có thể là tên cơ sở dữ liệu:

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; 

Các trường hợp sử dụng cho điều này là tôi muốn danh sách các chỉ mục cho một bảng được đặt tên để tôi có thể viết một thủ tục tự động nén tất cả các chỉ mục trên một bảng.

1

Trước tiên, bạn kiểm tra id bảng của bạn (aka object_id)

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

sau đó bạn có thể nhận được tên của cột.Ví dụ giả sử bạn thu được từ truy vấn trước số 4 như 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 
-1

việc kiểm tra này cũng này đưa ra một cái nhìn tổng quan của những hạn chế liên quan trên cơ sở dữ liệu. Cũng vui lòng bao gồm tạo điều kiện trong đó điều kiện với tên bảng quan tâm để cung cấp thông tin nhanh hơn.

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

1

Tạo một thủ tục lưu trữ để liệt kê chỉ mục cho một bảng trong cơ sở dữ liệu trong 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 
Các vấn đề liên quan