COUNT (*) FROM 테이블을 수행하지 않고 테이블의 현재 전체 행을 얻는 방아쇠를 만드는 것이 번거로울 수 있습니다. Postgres 8.5의 계획된 인덱스 구성 테이블이 가능하게 할 수 있다면 생각하고 있습니까?더 빠른 SELECT COUNT (*) FROM 테이블을 위해 인덱스 구성 테이블을 포장 할 수 있습니까?
답변
인덱스 구성 테이블이 모든 보이는 튜플을 계산하기 위해 스캔하는 것이 더 빠를 것이라고는 생각하지 못했습니다. 논리적으로 볼 때 데이터가 b-tree 리프 노드 또는 기존 힙 형식으로 구성되어 있는지 여부와 관계없이 동일한 양의 데이터를 처리해야합니다.
현재 postgresql 인덱스는 [key, ctid] 쌍 (본질적) 만 저장합니다. (ctid는 본질적으로 "rowid"- 힙 페이지 번호와 튜플 라인 포인터 인덱스입니다.) 따라서 각 튜플에 대해 [xmin, xmax]를 확인해야하기 때문에 인덱스를 통해 테이블의 행을 계산할 수는 없습니다 그리고 그것은 힙에있는 데이터로만 유지됩니다.
인덱스에 [xmin, xmax]를 넣어도됩니다. 수시로 제안 사항을 제안 할 수 있습니다. 그러나 인덱스를 확장하고 유용하게 사용하려면 모든 업데이트/삭제가 최신 상태로 유지되어야합니다. 업데이트를 수행하는 작업이 이제는 몇 배로 확장 되었기 때문에 문제가 발생합니다. 테이블의 인덱스 수만큼. tsvector와 같은 무거운 색인의 경우 또는 값 비싼 사용자 표현에 기반한 색인의 경우에는 다소 시간이 걸릴 수 있습니다. 일부 불쾌한 경우에는 색인에 실제로 게재되는 행이 표시되지만 전혀 표시되지 않습니다. 더미. 그리고이 연습의 전체적인 요점은 가능한 경우 데이터베이스가 인덱스의 실시간 정보에 독점적으로 의존 할 수 있어야한다는 것입니다. 8.3 (힙만있는 튜플)에서 속도를 높이기 위해 노력한 무 인덱스 열을 업데이트하더라도이 비용이 발생합니다.
인덱스를 [xmin, xmax]가있는 것으로 표시하는 것이 하나의 가능성이라고 가정합니다. 그렇게 pkey 인덱스 만 표시하십시오. 이것이 언제 이점 이었는지를 알아내는 데있어 플래너가 변경되어야합니다. 이것은 꽤 많은 일처럼 보입니다.
오라클 (그리고 클러스터 된 인덱스가있는 테이블이 기본적으로 인덱스 구성되어있는 SQL Server)에서 수행하는 인덱스 구성 테이블은 [key, tuple]을 기본 키 인덱스에 저장하여 작동합니다 대신에 (그리고 다른 모든 것들에서 아마도 [key, pkey]) ctid도 heap도 없다. 그래서 "튜플"은 [xmin, xmax, cminmax, natts, ....] 등을 포함 할 것이고 단지 인덱스를 스캔함으로써 "select count (*) from table"을 만족시킬 수 있습니다. 그러나 이것은 기본적으로 힙에서 튜플을 검색하는 것과 동일합니다. 이제는 "인덱스"에 있기 때문에 마술처럼 적은 공간을 차지하지 않습니다.
AFAICT 인덱스 구성 테이블의 주된 이유는 단일 기본 키 인덱스가있는 작은 테이블이 3 대신 1 페이지를 차지하고 기본 키로 인덱스 스캔이 약간 빠르다는 것입니다. 오라클과 관련된 IOT에 대한 조언은 오라클이 정적 차원 테이블을 대상으로 한 것이지 일반 용도가 아닌 것이 었으며 부분적으로는 보조 인덱스를 유지 관리하는 데 드는 비용 때문이었습니다 (오라클 스토어는 [ 키, pkey] IOT 보조 인덱스, 대신 오히려 일종의 대체 rowid).
이 방법은 날짜가 있지만 PostgreSQL 9.2에서는 개수 만 (*)을 수행 할 수있는 인덱스 전용 검색을 사용합니다. 당신이 링크를 제공 할 수 -
는
- 1. FROM 문 다음에 테이블을 더 선택 하시겠습니까?
- 2. SQL에서 "리터럴"테이블을 정의 할 수 있습니까?
- 3. 우리는 From 절의 빈 테이블을 추가 할 수 있습니까?
- 4. 인덱스 구성 테이블을 제공하는 DBMS는 무엇입니까?
- 5. SQL Server : 임시 테이블을 사용하지 않고 SELECT 문의 두 테이블을 UNION 할 수 있습니까?
- 6. 내가 새 테이블을 만들 MySQL의 테이블을 복사 할 수 있습니다
- 7. Oracle : select * from (select table_name from ...)?
- 8. mysql 테이블을 외부 데이터베이스의 테이블을 참조 할 수 있습니까?
- 9. MVC에서 테이블을 확장/축소 할 수 있습니까?
- 10. PostgreSQL : 테이블에서 select select count (*);
- 11. MySQL에서 테이블을 동적으로 생성 할 수 있습니까?
- 12. 테이블을 테이블처럼 프로그램 할 수 있습니까?
- 13. unified_thread fql 테이블을 공개 할 수 있습니까?
- 14. 데이터베이스에 다른 테이블을 추가 할 수 있습니까?
- 15. 이 Oracle SELECT 쿼리를 최적화하기 위해 테이블을 어떻게 인덱싱해야합니까?
- 16. SQL INSERT from SELECT
- 17. 즉시 테이블을 생성하고 테이블을 업데이트하십시오.
- 18. jQuery select from select
- 19. MySQL을 최적화하기 위해 필드별로 테이블을 분할 하시겠습니까?
- 20. SQL보기. Select count ... Where
- 21. SELECT (* - some_columns) SQL의 FROM TABLE
- 22. COUNT() 함수를 선택하는 동안 SQL 테이블을 조인하는 방법?
- 23. Select Distinct Count 질문
- 24. pyodbc를 사용하고 테이블을 생성하기 위해 html.py
- 25. 함수에 LINQ 테이블을 전달할 수 있습니까?
- 26. SELECT COUNT (*) SQL 서버에
- 27. 관계를 사용하지 않고 doctrine ORM의 테이블을 조인 할 수 있습니까?
- 28. Mysql - cmd에서 정보를보기 위해 더 큰 테이블을 보는 방법?
- 29. sql select count
- 30. html 테이블을 렌더링하는 가장 빠른 방법은 무엇입니까?
인덱스 구성 테이블은 CLUSTER 같은 소리, 참조? –
IOT는 클러스터 드 인덱스 (MSSQL?)처럼 들리지만, PostgreSQL에는 CLUSTER 인덱스가 있지만, MS 구현과 다릅니다.PostgreSQL은 이미 CLUSTER라는 용어를 사용하고 있기 때문에 Oracle 용어를 빌려 왔습니다. 마이크로 소프트는 심지어 Oracle이 사용하는보다 직관적 인 뷰를 사용하는 대신 구체화 된 뷰를 인덱싱 된 뷰라고 부르기까지했습니다. http://www.postgresonline.com/journal/index.php?/archives/10-HOW-does-CLUSTER-ON-improve-index-performance.html http://www.dba-oracle.com/t_index_organized_tables. htm – Hao
나는 postgres 사용자가 아니지만 ... COUNT를하는 것은 정말 느린가? 나는 이것이 병목 현상이 될 것이라고 기대하지 않았을 것이다 ... –