수정 불가능한 공간 인덱스 손상이 정상으로 간주됩니까?


23

손상 을 보고 하는 공간 인덱스 가 있습니다 DBCC CHECKDB.

DBCC CHECKDB(MyDB) 
WITH EXTENDED_LOGICAL_CHECKS, DATA_PURITY, NO_INFOMSGS, ALL_ERRORMSGS, TABLERESULTS

공간 인덱스, XML 인덱스 또는 인덱싱 된 뷰 'sys.extended_index_xxx_384000'(개체 ID xxx)에 뷰 정의가 생성하는 모든 행이 포함되어 있지 않습니다. 이것은 반드시이 데이터베이스의 데이터에 대한 무결성 문제를 나타내는 것은 아닙니다.

공간 인덱스, XML 인덱스 또는 인덱싱 된 뷰 'sys.extended_index_xxx_384000'(개체 ID xxx)에는 뷰 정의에 의해 생성되지 않은 행이 포함됩니다. 이것은 반드시이 데이터베이스의 데이터에 대한 무결성 문제를 나타내는 것은 아닙니다.

CHECKDB가 테이블 'sys.extended_index_xxx_384000'(객체 ID xxx)에서 0 개의 할당 오류와 2 개의 일관성 오류를 발견했습니다.

수리 수준은 repair_rebuild입니다.

인덱스를 삭제하고 다시 생성해도 이러한 손상 보고서는 제거되지 않습니다. 없이 EXTENDED_LOGICAL_CHECKS하지만 함께 DATA_PURITY오류가보고되지 않습니다.

또한 CHECKTABLECI의 크기가 30MB이고 행이 약 30k이지만이 테이블에 45 분이 걸립니다. 해당 테이블의 모든 데이터는 포인트 geography데이터입니다.

어떤 상황에서도이 동작이 예상됩니까? "이것은 반드시 무결성 문제를 나타내는 것은 아닙니다"라고 말합니다. 어떻게해야합니까? CHECKDB실패하고있는 문제입니다.

이 스크립트는 문제를 재현합니다.

CREATE TABLE dbo.Cities(
    ID int  NOT NULL,
    Position geography NULL,
 CONSTRAINT PK_Cities PRIMARY KEY CLUSTERED 
(
    ID ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
)

GO
INSERT dbo.Cities (ID, Position) VALUES (20171, 0xE6100000010C4E2B85402E424A40A07312A518C72A40)
GO
CREATE SPATIAL INDEX IX_Cities_Position ON dbo.Cities
(
    Position
)USING  GEOGRAPHY_AUTO_GRID 
WITH (
CELLS_PER_OBJECT = 16, PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO

버전 12.0.4427.24 (SQL Server 2014 SP1 CU3)입니다.

스키마와 데이터, 신선한 DB, 실행으로 테이블을 스크립팅했습니다. 같은 오류입니다. CHECKDB는 또한이 놀라운 런타임 45 분을 갖습니다. SQL Profiler를 사용하여 CHECKDB 쿼리 계획을 캡처했습니다. 루프 조인이 잘못되어 과도한 런타임이 발생하는 것 같습니다. 계획에는 테이블의 행 수에 2 차 런타임이 있습니다! 이중 중첩 스캐닝 루프 조인.

DBCC 실행 계획

비 공간 인덱스를 모두 지우면 아무 것도 변경되지 않습니다.

답변:


25

2014-12.0.4213.0에서 즉시 이것을 재현 할 수는 없었지만 SQL Server 2016 (CTP3.0)-13.0.700.242에서 볼 수 있습니다.

2014 빌드 (DBCC 오류 없음)에서 계획은 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

그리고 2016 빌드 ( 같은 DBCC 오류보고).

여기에 이미지 설명을 입력하십시오

두 번째 계획에는 병합 방지 반 결합에서 나오는 단일 행이 있으며 첫 번째 계획은 0 행입니다.

결합 술어는 pk0공간 인덱스 의 열과 일치하는 내용과 관련하여 다릅니다 .

여기에 이미지 설명을 입력하십시오

첫 번째 키는이를 기본 키 테이블에 올바르게 매핑하고 두 번째 키 Id는 TVF에서 반환 된 열에 매핑합니다 .

SQL Server 2012 내부 책에 따르면 이것은 셀의 힐버트 수에 대한 이진 (5) 값 이므로이 술어는 확실히 올바르지 않습니다 (기본 테이블의 단일 행 ID가 20171 대신 1052031049로 설정된 경우 I no 이 값이 0xa03eb4b849) 에 해당하므로 DBCC 오류가 더 길어집니다 .


2014-12.0.4213.0에서 다음과 같이 테이블을 다시 만든 후에 문제를 재현 할 수 있습니다.

CREATE TABLE dbo.Cities(
    Id int  NOT NULL,
    Position geography NULL,
 CONSTRAINT PK_Cities PRIMARY KEY CLUSTERED 
(
    Id ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
)

(에서 ID로 변경 참고 Id)

2014 년 인스턴스는 Case Sensitive 데이터 정렬과 함께 설치됩니다. 그래서 이것이 전에 열 혼동을 막 았던 것처럼 보입니다.

내가 추측 그래서 잠재적 인 해결에 열 이름을 바꿀 수 있습니다 CitiesCityId, 예를 들어.

연결 항목 (Microsoft 버그 보고서)


4
이것은 환상적인 버그입니다 :) 또한 미친 루프 조인을 설명 할 수 있습니다. 왜냐하면 그들은 아마도 카디널리티가 더 높은 조인 조건에 대한 좋은 선택 일 수 있기 때문입니다.
boot4life

7
@ boot4life 또한 Id혼동으로 인해 검색을 시도해야합니다. 잘 잡아라, 마틴 AUTO_GRID옵션 에만 영향을 미치는 것으로 보입니다 . 대소 문자를 구분하지 않는 조합으로 2014 SP1 CU4에서 버그를 재현 할 수 있습니다. SQL Server는 확장 검사 쿼리를 잘못 빌드합니다.
Paul White에 따르면 GoFundMonica는
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.