2008-11-20 8 views
5

Một bảng tồn tại mà người khác đã tải. Tôi cần phải truy vấn đối với bảng, nhưng việc thiếu các chỉ mục làm cho kế hoạch truy vấn trở nên vô cùng. Những gì tôi muốn làm là phát hiện nếu có một chỉ mục cho một cột cụ thể, để tôi có thể tạo nó nếu nó không tồn tại, và không tạo nó nếu nó đã có sẵn.Làm thế nào để bạn phát hiện nếu có một chỉ mục cho một cột cụ thể trên một bảng trong Oracle?

Cảm ơn.

Ác

Trả lời

7

Bạn có thể truy vấn DBA_/ALL_/USER_IND_COLUMNS, ví dụ:

SQL> SELECT index_name 
    2 FROM dba_ind_columns 
    3 WHERE table_owner = 'SCOTT' 
    4  AND table_name = 'EMP' 
    5  AND column_name = 'EMPNO'; 

INDEX_NAME 
------------------------------ 
PK_EMP 

Tất nhiên, bạn có thể muốn mở rộng truy vấn một chút. Điều này sẽ nhận bất kỳ chỉ mục nào mà cột EMPNO xuất hiện. Bạn có thể muốn giới hạn mình vào các chỉ mục trong đó cột là cột hàng đầu của chỉ mục (COLUMN_POSITION = 1). Hoặc bạn có thể muốn giới hạn bản thân chỉ mục trên cột cụ thể đó (để không có cột nào trong COLUMN_POSITION 2), tức là

SQL> ed 
Wrote file afiedt.buf 

    1 SELECT index_name 
    2 FROM dba_ind_columns a 
    3 WHERE table_owner = 'SCOTT' 
    4  AND table_name = 'EMP' 
    5  AND column_name = 'EMPNO' 
    6  AND column_position = 1 
    7  AND NOT EXISTS(SELECT 1 
    8      FROM dba_ind_columns b 
    9      WHERE a.index_owner = b.index_owner 
10      AND a.index_name = b.index_name 
11*      AND b.column_position = 2) 
SQL>/

INDEX_NAME 
------------------------------ 
PK_EMP 
1

Làm quen với truy vấn schema SYS:

Select * from sys.all_ind_columns where table_name=:TabName and table_owner=:TabOwner;