2011-09-09 3 views
2

PostgreSQL 데이터베이스에서 인덱스의 열 위치를 얻는 방법은 무엇입니까? pg_index 카탈로그 테이블의 indkey는 테이블에있는 해당 열의 위치를 ​​알려주지 만 인덱스가 들어있는 열의 위치를 ​​원한다.인덱스의 열 위치

답변

5

한 가지 방법이 있습니다. 그것은 최선의 방법이 아닐 수도 있습니다.

SELECT c.relname, a.attname, a.attnum 
FROM pg_attribute a 
INNER JOIN pg_class c on c.oid = a.attrelid 
WHERE c.relkind = 'i' 
    AND c.relname = 'beds_pkey' 
    AND a.attnum > 0 

여기에서 beds_pkey은 색인 이름입니다.

select 
    c.relname as tabela, 
    a.relname as indexname, 
    d.attname as coluna, 
    (
    select 
     temp.i + 1 
    from 
     (
     SELECT generate_series(array_lower(b.indkey,1),array_upper(b.indkey,1)) as i 
    ) temp 
    where 
     b.indkey[i] = d.attnum 
) as posicao 
from 
    pg_class a 
    inner join 
    pg_index b 
    on 
    a.oid = b.indexrelid 
    inner join 
    pg_class c 
    on 
    b.indrelid = c.oid 
    inner join 
    pg_attribute d 
    on 
    c.oid = d.attrelid and 
    d.attnum = any(b.indkey) 
where 
    b.indisprimary != true and 
    a.relname not like 'pg_%' 
order by 
    tabela, indexname, posicao 
+0

+1 내 대답보다 훨씬 나은 해결책. –

+0

그러나 pg_class와 pg_attribute를 결합하는 것보다 "indkey"라는 이름을 보는 것이 훨씬 더 합리적입니다. 나는 시스템 테이블이 싫다. 내가 그들을 볼 때마다 나는 내 이름 인 앨리스 (Alice)처럼 느껴져, 나는 방금 보이는 유리를 밟았다. –

1

indkey은 배열이며 해당 배열의 항목 순서에 따라 색인 열의 순서가 결정됩니다.

따라서 indkey에 {2,4}가 있으면 표의 두 번째 열이 색인에서 첫 번째로 나오고 표의 네 번째 열이 색인의 두 번째 열입니다.

indkey에 {4,3}이 있으면 표의 네 번째 열이 색인의 첫 번째 열이고 표의 세 번째 열이 색인의 두 번째 열입니다.

+0

@Catcall을 빠른 테스트에서 나에 적절한 솔루션 : 여기 – vchitta

1

은 테이블에 의해 검색 할 때 인덱스의 위치를 ​​검색하는 쿼리입니다. 나는 이것을 사용하기 위해 약간 조정해야한다.
+0

리카르도의 대답은 내가 필요한 대답이다. 벡터 pg_index.indkey에서 pg_attribute.attnum (테이블의 열 위치)의 위치를 ​​찾아야합니다. 인덱스의 열 위치가 표시됩니다. –

+0

자체 테이블이있는 인덱스의 열의'attnum' 쿼리 할 때 마이크 솔루션을 올바른지. Mike 's는 인덱스로 쿼리 할 수 ​​있습니다. 테이블별로 쿼리 할 수 ​​있습니다. – Logan

관련 문제