"부분 일치 색인"이란 무엇입니까?


27

SQL Server 2016에 도입 된 "외래 키 참조 확인"쿼리 계획 연산자에 대해 자세히 알아 보려고합니다. 그에 대한 정보는 많지 않습니다. 마이크로 소프트는 발표 여기에 내가 그것에 대해 블로그 여기 . 254 개 이상의 수신 외부 키 참조가있는 상위 테이블에서 행을 삭제하여 새 연산자를 볼 수 있습니다 : dbfiddle link .

운영자 세부 사항에는 세 가지 다른 개수가 표시됩니다.

FK 점검 내용

  • 외래 키 참조 수 는 들어오는 외래 키 수입니다.
  • 일치하는 색인 ​​없음 개수 는 적합한 색인이없는 수신 외래 키의 수입니다. 업데이트되거나 삭제 된 테이블이 해당 제한 조건을 위반하지 않는지 확인하려면 하위 테이블을 스캔해야합니다.
  • Partial Matching Indexs Count 가 무엇을 나타내는 지 모르겠습니다 .

이 문맥에서 부분 일치 색인은 무엇입니까? 다음 중 하나를 수행 할 수 없었습니다.

  • 필터링 된 인덱스
  • 외래 키 열을 INCLUDE인덱스 열로 설정
  • 외래 키 열을 두 번째 키 열로 사용하는 인덱스
  • 여러 열 외래 키에 대한 단일 열 인덱스
  • 여러 열 외래 키에 대한 "인덱스 조인"계획을 가능하게하는 여러 인덱스를 만들기

Dan Guzman 은 인덱스 키가 외래 키 열과 다른 순서 인 경우에도 여러 열 외래 키가 인덱스와 일치 할 수 있다고 지적했습니다. 그의 코드는 여기 경우에 누군가가 부분적으로 일치하는 인덱스에 대한 자세한 알아 내기 위해 지점을 시작으로로 사용할 수 있습니다.

답변:


13

나는 사람들보다 훨씬 똑똑한 사람들과 이야기했고 우리는 이것을 곧 문서화 할 것입니다.

이에 대한 실제 정의는 다음과 같습니다.

PartialMatchingIndexCount는 인덱스 검색을 사용하여 확인할 수있는 참조 수를 반영하지만 인덱스 키는 검사중인 모든 열을 다루지 않습니다. 예를 들어, 해당 ForeignKeyReferenceCheck 요소에는 Seek Predicates 및 Predicate 요소가 모두 포함됩니다.

게다가:

이 수가 0보다 크면 부분 일치로 인해 많은 수의 행이 발생하는 경우 잠재적 인 성능 문제가 있습니다.


6
실제 사례 또는 실제 문서는 영광입니다. 현상금 제공
톰 V-팀 모니카

3

인터넷 검색을 한 후에 "부분 일치 색인"과 외래 키를 언급하는 게시물을 만들었습니다.

년 3 월 1 일 자격 카를로스 Klapp의 코드 블로그 2013 블로그 포스트는Foreign Keys without Indexes 저장 프로 시저 호출이 Util_FKsWithoutIndexesFK 관계에 대한 적절한 인덱스가없는 외래 키에 대한 어떤 모습을. (이 블로거가 이것을 SQL Server Central The Ultimate Index-Less Foreign-Key Finder(2009 년 10 월 15 일) 에서 해제 한 것처럼 보입니다 ) 블로그는 다음과 같이 말합니다.

완전히 일치하는 인덱스가없는 외래 키 제약 조건을 검색합니다.

최상의 부분 일치 색인은 MatchCounts 및 열 비교와 함께 출력됩니다.

일치하는 인덱스가 없거나 부분 일치하는 인덱스가없는 각 외래 키에 대해 CREATE INDEX 템플릿을 생성합니다.

필요에 따라 사용자 정의 (클러스터를 원하거나 기본 키의 일부 여야하거나 다른 인덱스와 병합하려는 경우 포함 추가)

완전 일치 색인이 누락 된 FK는 참조 무결성 검사를위한 테이블 스캔 및 외래 키 열이 WHERE 또는 JOIN 술어에있는 참조 테이블의 SELECT로 인해 참조 된 테이블에서 DELETES의 성능을 심각하게 손상시킬 수 있습니다. (이것은 제약 조건이 있는지 여부에 영향을 미칩니다). 인덱스의 첫 번째 N 열만 확인합니다. 여기서 N은 외래 키 제약 조건의 열 수입니다.

인덱스 열 순서는이 범위를 넘어서는 확인되지 않습니다 (3 열 인덱스의 두 번째 열에 일치하는 열이 1 인 2 열 FK는 부분 일치로 출력 됨)

데이터베이스에 외래 키 제약 조건이 없으면이 도구는 쓸모가 없습니다.

많은 데이터베이스에는 부분 외래 키 제약 조건이 있습니다. 제한 조건이 선언 된 관련 테이블에서만 작동합니다.

이것을 올바르게 이해하면 FK 관계에 필요한 인덱스의 모든 열과 일치하는 인덱스가 없으면 일부 열이있는 인덱스가있을 수 있습니다. 예를 들어, FK 관계는 세 개의 열을 갖는 경우 ( a, b, c)하지만, 그와 동일한 세 개의 열 인덱스가없는, 거기 (갖는 인덱스 존재 a, b또는 화학식 a, c) 또는 ( b, c) 및 쿼리시킬 수있는 것이지만 누락 된 열이있는 행에 대한 일부 인덱스 스캔이 필요합니다.

FK 제약 조건을 지원할 수있는 인덱스가 전혀없는 경우 "부분 일치 인덱스 수"는 0 ( 0)이거나 최소한이 수를 늘리지 않습니다.


이것이 당신이 생각한 것입니까? 그럼에도 불구하고 ... 작업에 얻을 수 dbfiddle.uk/...
조 Obbish

정확히. 로 FK를 (FKey2,FKey3)만들고에 색인을 만듭니다 FKey2. 시도하십시오.
RolandoMySQLDBA

저는 SQL Server 직원이 아니지만 도와 주려고 노력하고 있습니다.
RolandoMySQLDBA

시도해 볼만한 아이디어를 이해하고 감사합니다. 또한 두 열 하나를 작동시킬 수 없습니다.
Joe Obbish 님이

을 버리고 create unique index FULL_IX_UNIQUE ON FK_PARENT_TABLE (FKey, Fkey2, Fkey3)인덱스를 FKey2켜고 다시 시도 할 수 있습니다.
RolandoMySQLDBA
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.