특정 튜토리얼에서 저자가 sys.indexes
술어를 기준으로 필터링한다는 것을 읽었습니다 index_id < 256000
. 이것이 무엇을 달성합니까?
sys.selective_xml_index_paths
, sys.xml_indexes
, sys.sysindexes
하지만 난 마법 번호가 더 이상 유효하지 경우이 바로 업데이트되지 얻을 것 같아요.
특정 튜토리얼에서 저자가 sys.indexes
술어를 기준으로 필터링한다는 것을 읽었습니다 index_id < 256000
. 이것이 무엇을 달성합니까?
sys.selective_xml_index_paths
, sys.xml_indexes
, sys.sysindexes
하지만 난 마법 번호가 더 이상 유효하지 경우이 바로 업데이트되지 얻을 것 같아요.
답변:
이것은 XML 인덱스가 현재 적어도 256,000 이상인 id 체계를 가질 수있는 유일한 유형이라는 오해에 기초하고 있습니다 (적어도 그들의 관찰에 근거하여이 체계는 AFAIK에 문서화되어 있지 않으므로 의도적인지 확실하지 않습니다). 현재 버전에서는 아마 좋을지 모르지만 다음에 어떤 유형의 색인이 추가 될 것이며 누가 ID 체계가 시작 될지 누가 알 수 있습니까? XML 인덱스를 제외하려면 다른 항목도 제외하십시오. 예를 들어 공간 인덱스는 id = 384000에서 시작하는 것으로 보입니다. 위 쿼리에 XML 인덱스가 아닌 공간 인덱스를 포함하려는 경우 놀라 울 것입니다.
훨씬 더 나은 필터는 다음과 같습니다.
WHERE type <> 3;
... 또는 자체 문서화 기능이 있기 때문에 더 좋습니다 ...
WHERE type_desc <> N'XML';
그리고 이제 공간 인덱스를 제외하고 싶다면 쿼리가 다음으로 변경됩니다.
WHERE type_desc NOT IN (N'XML', N'SPATIAL');
... 공간 인덱스의 id 값이 차지하는 숫자 범위를 알아 내야하는 대신. 좋은 성과 있길 바래요.
이것들은 sys.indexes (Transact-SQL) 에 명확하게 문서화되어 있습니다. 나는이 마법 번호에 대한 언급이 없으며,이 저자가이 마법 번호가 의존해야하는 것이 아님을 알 수 있도록 여기에 튜토리얼 작성자를 적극 추천합니다.
index_id
. 특히 유형을 결정하기위한보다 정확한 데이터가 바로 옆에 앉아 있기 때문에 ... 문자 그대로.
"Microsoft SQL Server 2012 Internals"책에 따르면 Craig Freeman 인 Kalen Delaney에 따르면 XML 인덱스의 index_id는 256000으로 번호가 매겨지기 시작합니다. 따라서 모든 유형 인덱스 정보 (sys.indexes 쿼리)를 가져 오지만 XML 인덱스를 건너 뛰면 필터를 배치 할 수 있습니다.
SELECT * FROM sys.indexes WHERE index_id <256000
sys.indexes의 유형 열에 필터를 배치하면 동일한 결과 집합을 얻을 수 있습니다. XML 유형의 인덱스 유형은 3입니다.
SELECT * FROM sys.indexes WHERE type <> 3
또는
type_desc 열도 사용할 수 있습니다.
SELECT * FROM sys.indexes WHERE type_desc <> 'XML'
sys.sysindexkeys