跳至主要内容

PostgreSQL 資料庫 index

簡單列出查詢與建立 index 的方法

查詢所有 index

postgres

    select a.schemaname, a.tablename, a.indexname, b.column_name
from pg_catalog.pg_indexes a,
information_schema.columns b
where a.tablename = b.table_name
and a.schemaname = b.table_schema and a.schemaname = 'public'
and ( a.indexdef like '%(' || b.column_name || '%'
or a.indexdef like '%, ' || b.column_name || '%'
or a.indexdef like '%("' || b.column_name || '%'
or a.indexdef like '%, "' || b.column_name || '%' )
order by a.tablename, length(b.column_name);

oracle

  • table_owner 依實際情況更
    select * from sys.all_ind_columns
where table_owner = 'InsectTotem'
order by index_name;

查詢沒 index 的 FK

  • foreign key 沒做 index 時,通常 join 會變慢
  • 但實際仍要看效能狀況決定是否須建立

postgres

    select fkeys.table_name,
fkeys.constraint_name,
fkeys.column_name,
ind_cols.indexname
from (
select a.constraint_schema,
a.table_name,
a.constraint_name,
a.column_name
from information_schema.key_column_usage a,
information_schema.referential_constraints b
where a.constraint_name = b.constraint_name
and a.constraint_schema = b.constraint_schema
and a.constraint_schema = 'public'
) fkeys
left join
( select a.schemaname, a.tablename, a.indexname, b.column_name
from pg_catalog.pg_indexes a,
information_schema.columns b
where a.tablename = b.table_name
and a.schemaname = b.table_schema and a.schemaname = 'public'
and ( a.indexdef like '%(' || b.column_name || '%'
or a.indexdef like '%, ' || b.column_name || '%'
or a.indexdef like '%("' || b.column_name || '%'
or a.indexdef like '%, "' || b.column_name || '%' )
) ind_cols on ( fkeys.constraint_schema = ind_cols.schemaname
and fkeys.table_name = ind_cols.tablename
and fkeys.column_name = ind_cols.column_name )

-- 如果只想看未加上 index 的 FK,移除掉下面的 comment
-- where ind_cols.indexname is null

oracle

  • owner name 依實際情況更改
    select a.table_name,
a.constraint_name,
a.column_name,
c.index_name
from all_cons_columns a,
all_constraints b,
all_ind_columns c
where a.owner = 'InsectTotem'
and b.constraint_type = 'R'
and a.owner = b.owner
and a.table_name = b.table_name
and a.constraint_name = b.constraint_name
and a.owner = c.table_owner (+)
and a.table_name = c.table_name (+)
and a.column_name = c.column_name (+)

--如果只想看未加上 index 的 FK,移除掉下面的 comment
--and c.index_name is null

建立與刪除 index 語法

  • index_mytable_mycol : index 名稱一般通用的格式,自行更換
-- 建立
create index index_mytable_mycol on mytable(mycol);

-- 刪除
drop index index_mytable_mycol;