데이터베이스에 하나의 삽입 만있는 경우 가능한 모든 열 조합을 색인화하는 것이 좋지 않습니까? SQL Server 2017입니다. 이와 같은 시스템을 설계하는

큰 선택 쿼리가 필요하지만 한 번만 채워지는 데이터베이스를 기반으로하는보고 시스템에서 작업하고 있습니다. 데이터베이스 관리 시스템은 Microsoft SQL Server 2017입니다. 이와 같은 시스템을 설계하는 더 좋은 방법이있을 수 있지만 이론적으로 접근 해 봅시다.

이론적으로 말하면 :

  1. 데이터베이스가 매우 큰 경우 (여러 테이블에서 150M + 행)
  2. 그리고 데이터베이스가 한 번만 채워질 것이라고 가정 할 수 있습니다.

가능한 모든 열 조합을 인덱싱하면 선택 쿼리에 부정적인 성능 영향을 줄 수 있습니까?



답변

예, 옵티마이 저가 고려해야 할 데이터에 대한 추가 액세스 경로가 많으므로 초기 계획 컴파일 시간에 영향을 미칩니다.

SQL Server 2017을 사용 중이고 한 번로드하고 보고서를 실행하는 대신 클러스터 된 열 저장소 인덱스를 대신 사용하지 않는 이유는 무엇입니까?

가능한 모든 열 조합을 색인화 해야하는 이상적인 솔루션 인 것 같습니다.

열 저장소 인덱스-개요


답변

테이블에 N 개의 열이있는 경우 가능한 모든 열 조합은 2 ^ N-1입니다 (빈 세트 제거). 1023 개의 인덱스를 의미하는 10 개의 열의 경우 20 개의 열의 경우 1048575 개의 인덱스가 만들어집니다. 대부분의 인덱스는 사용되지 않지만 옵티마이 저가 고려해야합니다. 옵티마이 저가 더 나은 인덱스 대신 차선책 인덱스를 선택할 수 있습니다. 실제로 어떤 인덱스가 유용한 지 알아 내려고 노력하는 대신 모든 종류의 인덱스를 생성하는 길을 택하지는 않을 것입니다.

수정 가능한 색인 수 수정

Jeff가 지적한 것처럼 (3,2,1)은 (1,2,3)과 분명히 다르기 때문에 2 ^ N (전력 설정)보다 훨씬 나쁩니다. N 열의 경우 N 열의 모든 열을 포함하는 인덱스의 첫 번째 위치를 선택할 수 있습니다. N-1 방식 등의 두 번째 위치에 대해 우리는 N으로 끝납니다! 전체 크기의 다른 인덱스. 이 인덱스의 다른 인덱스는이 세트의 다른 인덱스에 포함되지 않습니다. 또한 더 짧은 색인을 추가하여 전체 색인에 포함되지 않습니다. 따라서 인덱스 수는 N!입니다. 그러므로 10 개의 열에 대한 예는 10이됩니다! = 3628800 인덱스 및 20 (드럼 롤) 2432902008176640000 인덱스. 이것은 엄청나게 큰 숫자입니다. 각 색인에 대해 1mm의 부품을 1 점씩 넣으면 모든 점을 통과하는 데 94 일이 걸립니다. 모두와 dont 😉


답변

아니.

“모든 것”을 색인하는 것은 실용적이지 않지만 “가장 많이”색인 할 수 있습니다.

여기 있습니다. 테이블에 N열 이 있으면 가능한 인덱스 수는 N!입니다. 테이블에 열이 10 개 있다고 가정하면 10가능한 인덱스는 없지만 10!. 즉 …입니다 3628800 하나의 테이블에 …. 많은 디스크 공간, 디스크 I / O, 캐시 및 탐색 시간입니다.

왜? 몇 가지 이유 :

  • Lightwwight 색인은 일반적으로 캐시되어 빛을 빠르게 만듭니다. 3 백만 개가 있으면 캐시되지 않습니다.

  • SQL 옵티마이 저는 특히 조인을 사용할 때 어느 것이 더 나은지를 결정하는 데 많은 시간이 걸릴 수 있습니다.

  • SQL 최적화 프로그램은 포괄적 인 알고리즘 사용을 포기하고 대신 휴리스틱 알고리즘을 시도 할 수 있습니다. 이것은 “최적의 것보다 적을”수 있습니다. 예를 들어 PostgreSQL에는 “8보다 작은 테이블 쿼리”및 “8보다 많은 테이블 쿼리”에 대해 서로 다른 옵션이 있습니다.

  • 인덱스는 힙보다 가벼워 야합니다. 모든 것을 인덱싱하는 경우 인덱스는 힙만큼 무거워집니다. 인덱스의 목적을 어기는 것입니다.


답변

아니요, 아마도 SELECT쿼리에 부정적인 영향을 미치지는 않지만

  • 디스크 사용량이 많아집니다.
  • 비용 이 크게 증가합니다 INSERT.
  • 대부분의 지수는 사용되지 않습니다.
  • 많은 WHERE조건식은 여전히 ​​더 복잡한 색인을 사용하지 않습니다.
  • 필요한 인덱스의 개수는 열 개수에 따라 기하 급수적으로 증가합니다. 즉, 예를 들어 8 개의 열이있는 경우 가능한 모든 조합에 대해 256 개의 인덱스가 필요합니다.