[SQL] 외래 키와 기본 키에 포스트 그레스 및 인덱스
SQL외래 키와 기본 키에 포스트 그레스 및 인덱스
합니까 포스트 그레스가 자동으로 외래 키와 기본 키에 인덱스를 넣어? 어떻게 알 수 있습니까? 테이블의 모든 인덱스를 반환하는 명령이 있는가?
해결법
-
==============================
1.PostgreSQL은 자동이 아닌 외래 키 관계의 참조 측면에서, 기본 키 및 고유 제한 조건에 인덱스를 생성합니다.
PostgreSQL은 자동이 아닌 외래 키 관계의 참조 측면에서, 기본 키 및 고유 제한 조건에 인덱스를 생성합니다.
대학원은 암시 적 인덱스를 만들 때 그것이 일어날 때 당신이 볼 수 있도록, psql 프로그램 및 / 또는 시스템 로그에서 볼 수있는주의 사항 수준의 메시지를 방출합니다. 자동적으로 생성 된 인덱스도 테이블의 \ D 출력에 표시된다.
고유 인덱스에 대한 설명서는 말한다 :
과 제약에 대한 설명서는 말한다 :
따라서 당신은 당신이 그들을 원하는 경우 외국 키 자신에 대한 인덱스를 생성해야합니다.
당신은 M-에-N 테이블의 PK로 2 FK의 같은 차 외국 키를 사용하는 경우, 당신은 아마도 PK에 인덱스를 가지고 것을 참고 여분의 인덱스를 만들 필요가 없습니다.
그것은 당신의 참조 측 외래 키 열 (또는 포함)에 인덱스를 생성하는 것이 좋은 생각하지만, 필요하지 않습니다. 각 인덱스는 당신이 모든 INSERT, UPDATE에 성능 비용을 지불하거나 삭제 있도록 감속이, 아래로 약간 작업을 DML 추가합니다. 인덱스가 거의 사용하지 않는 경우이 가진 가치가되지 않을 수 있습니다.
-
==============================
2.당신이 당신의 프로그램에서 스키마 (들)에있는 모든 테이블의 인덱스를 나열 할 경우, 모든 정보는 카탈로그의 손에 있습니다 :
당신이 당신의 프로그램에서 스키마 (들)에있는 모든 테이블의 인덱스를 나열 할 경우, 모든 정보는 카탈로그의 손에 있습니다 :
select n.nspname as "Schema" ,t.relname as "Table" ,c.relname as "Index" from pg_catalog.pg_class c join pg_catalog.pg_namespace n on n.oid = c.relnamespace join pg_catalog.pg_index i on i.indexrelid = c.oid join pg_catalog.pg_class t on i.indrelid = t.oid where c.relkind = 'i' and n.nspname not in ('pg_catalog', 'pg_toast') and pg_catalog.pg_table_is_visible(c.oid) order by n.nspname ,t.relname ,c.relname
(예 : 열 및 순서로) 더 탐구하고 싶은 경우에, 당신은 pg_catalog.pg_index 볼 필요가있다. psql의 -E [DBNAME]를 사용하여 카탈로그를 쿼리하는 방법을 알아내는 위해 유용합니다.
-
==============================
3.이 쿼리는 외래 키, 원본 소스에없는 인덱스를 나열합니다.
이 쿼리는 외래 키, 원본 소스에없는 인덱스를 나열합니다.
편집 : 그것은 작은 테이블 (미만 9메가바이트)과 일부 다른 경우를 확인하지 않습니다. 최종 WHERE 문을 참조하십시오.
-- check for FKs where there is no matching index -- on the referencing side -- or a bad index WITH fk_actions ( code, action ) AS ( VALUES ( 'a', 'error' ), ( 'r', 'restrict' ), ( 'c', 'cascade' ), ( 'n', 'set null' ), ( 'd', 'set default' ) ), fk_list AS ( SELECT pg_constraint.oid as fkoid, conrelid, confrelid as parentid, conname, relname, nspname, fk_actions_update.action as update_action, fk_actions_delete.action as delete_action, conkey as key_cols FROM pg_constraint JOIN pg_class ON conrelid = pg_class.oid JOIN pg_namespace ON pg_class.relnamespace = pg_namespace.oid JOIN fk_actions AS fk_actions_update ON confupdtype = fk_actions_update.code JOIN fk_actions AS fk_actions_delete ON confdeltype = fk_actions_delete.code WHERE contype = 'f' ), fk_attributes AS ( SELECT fkoid, conrelid, attname, attnum FROM fk_list JOIN pg_attribute ON conrelid = attrelid AND attnum = ANY( key_cols ) ORDER BY fkoid, attnum ), fk_cols_list AS ( SELECT fkoid, array_agg(attname) as cols_list FROM fk_attributes GROUP BY fkoid ), index_list AS ( SELECT indexrelid as indexid, pg_class.relname as indexname, indrelid, indkey, indpred is not null as has_predicate, pg_get_indexdef(indexrelid) as indexdef FROM pg_index JOIN pg_class ON indexrelid = pg_class.oid WHERE indisvalid ), fk_index_match AS ( SELECT fk_list.*, indexid, indexname, indkey::int[] as indexatts, has_predicate, indexdef, array_length(key_cols, 1) as fk_colcount, array_length(indkey,1) as index_colcount, round(pg_relation_size(conrelid)/(1024^2)::numeric) as table_mb, cols_list FROM fk_list JOIN fk_cols_list USING (fkoid) LEFT OUTER JOIN index_list ON conrelid = indrelid AND (indkey::int2[])[0:(array_length(key_cols,1) -1)] @> key_cols ), fk_perfect_match AS ( SELECT fkoid FROM fk_index_match WHERE (index_colcount - 1) <= fk_colcount AND NOT has_predicate AND indexdef LIKE '%USING btree%' ), fk_index_check AS ( SELECT 'no index' as issue, *, 1 as issue_sort FROM fk_index_match WHERE indexid IS NULL UNION ALL SELECT 'questionable index' as issue, *, 2 FROM fk_index_match WHERE indexid IS NOT NULL AND fkoid NOT IN ( SELECT fkoid FROM fk_perfect_match) ), parent_table_stats AS ( SELECT fkoid, tabstats.relname as parent_name, (n_tup_ins + n_tup_upd + n_tup_del + n_tup_hot_upd) as parent_writes, round(pg_relation_size(parentid)/(1024^2)::numeric) as parent_mb FROM pg_stat_user_tables AS tabstats JOIN fk_list ON relid = parentid ), fk_table_stats AS ( SELECT fkoid, (n_tup_ins + n_tup_upd + n_tup_del + n_tup_hot_upd) as writes, seq_scan as table_scans FROM pg_stat_user_tables AS tabstats JOIN fk_list ON relid = conrelid ) SELECT nspname as schema_name, relname as table_name, conname as fk_name, issue, table_mb, writes, table_scans, parent_name, parent_mb, parent_writes, cols_list, indexdef FROM fk_index_check JOIN parent_table_stats USING (fkoid) JOIN fk_table_stats USING (fkoid) WHERE table_mb > 9 AND ( writes > 1000 OR parent_writes > 1000 OR parent_mb > 10 ) ORDER BY issue_sort, table_mb DESC, table_name, fk_name;
-
==============================
4.예 - (워드 프로세서에서 이상) 외래 키의 경우 - 기본 키에 대해.
예 - (워드 프로세서에서 이상) 외래 키의 경우 - 기본 키에 대해.
\d <table_name>
"psql의"쇼의 모든 인덱스를 포함하는 테이블의 설명.
-
==============================
5.나는이이 문서 냉각 성능 설명은 EclipseLink 2.5의 기능을하는 방법을 좋아한다
나는이이 문서 냉각 성능 설명은 EclipseLink 2.5의 기능을하는 방법을 좋아한다
-
==============================
6.기본 키의 경우, 인덱스는 다음과 같은 메시지가 생성됩니다 :
기본 키의 경우, 인덱스는 다음과 같은 메시지가 생성됩니다 :
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "index" for table "table"
참조 된 테이블에 대한 인덱스가없는 경우 외부 키 제약 조건이 생성되지 않습니다.
참조 테이블의 인덱스는 (비록 원하는)이 필요하지 않고, 따라서 내재적 생성되지 않을 것이다.
from https://stackoverflow.com/questions/970562/postgres-and-indexes-on-foreign-keys-and-primary-keys by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 설정 제한 SQL에서 테이블 행에 대한 (0) | 2020.06.12 |
---|---|
[SQL] 날짜 범위에있는 모든 날짜 SQL 서버에서 가져 오기 (0) | 2020.06.12 |
[SQL] 행에 열 및 열로 MySQL의 트랜스 행 [중복] (0) | 2020.06.12 |
[SQL] 분산 트랜잭션 오류? (0) | 2020.06.12 |
[SQL] 어떻게 Google BigQuery에서 결석 날짜를 차지 최신 시리즈를 생성? (0) | 2020.06.12 |