การเสียหายของดัชนีเชิงพื้นที่ที่ไม่สามารถแก้ไขได้ถือว่าเป็นเรื่องปกติหรือไม่


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 พบข้อผิดพลาดในการจัดสรร 0 ข้อและข้อผิดพลาดที่สอดคล้องกัน 2 ข้อในตาราง 'sys.extended_index_xxx_384000' (รหัสวัตถุ xxx)

repair_rebuildระดับการซ่อมเป็น

การปล่อยและสร้างดัชนีใหม่จะไม่ลบรายงานความเสียหายเหล่านี้ หากไม่มีEXTENDED_LOGICAL_CHECKSแต่ด้วยDATA_PURITYข้อผิดพลาดจะไม่ถูกรายงาน

นอกจากนี้CHECKTABLEใช้เวลา 45 นาทีสำหรับตารางนี้แม้ว่า CI ของมันจะมีขนาด 30 MB และมีแถวประมาณ 30k ข้อมูลทั้งหมดในตารางนั้นเป็น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)

ฉันสคริปต์ตารางด้วยสคีมาและข้อมูล, ฐานข้อมูลใหม่, รัน ข้อผิดพลาดเดียวกัน CHECKDB ยังมีรันไทม์ที่เหลือเชื่อนี้เป็นเวลา 45 นาที ฉันบันทึกแผนการสืบค้น CHECKDB โดยใช้ SQL Profiler มีการรวมวงที่เข้าใจผิดทำให้เกิดการรันไทม์มากเกินไป แผนมีรันไทม์กำลังสองในจำนวนแถวของตาราง! ซ้อนซ้อนการสแกนวนซ้ำกันเป็นสองเท่า

แผนการดำเนินการ DBCC

การล้างดัชนีที่ไม่ใช่เชิงพื้นที่ทั้งหมดจะไม่เปลี่ยนแปลงอะไรเลย

คำตอบ:


25

ฉันไม่สามารถทำซ้ำได้ทันทีในปี 2014 - 12.0.4213.0 แต่เห็นใน SQL Server 2016 (CTP3.0) - 13.0.700.242

บนบิลด์ 2014 (โดยไม่มีข้อผิดพลาด DBCC) แผนมีลักษณะดังนี้

ป้อนคำอธิบายรูปภาพที่นี่

และใน 2016 สร้าง ( ที่มีข้อผิดพลาด DBCC รายงาน) เช่นนี้

ป้อนคำอธิบายรูปภาพที่นี่

แผนสองมีแถวเดียวออกมาจากการรวมการต่อต้านกึ่งเข้าด้วยกันแผนแรกเป็นศูนย์แถว

เพรดิเคตการเข้าร่วมนั้นแตกต่างกันไปตามสิ่งที่จับคู่กับpk0คอลัมน์ในดัชนีอวกาศ

ป้อนคำอธิบายรูปภาพที่นี่

อันแรกทำการแมปไปยังตารางคีย์หลักอย่างถูกต้องส่วนที่สองแมปไปยังIdคอลัมน์ที่ส่งคืนจาก TVF

ตามหนังสือ internals SQL Server 2012 นี่เป็นค่าเลขฐานสอง (5) สำหรับหมายเลข Hilbert ของเซลล์ดังนั้นการสรุปนี้ไม่ถูกต้องแน่นอน (ถ้า Id ของแถวเดี่ยวในตารางฐานถูกตั้งค่าเป็น 1052031049 แทนที่จะเป็น 20171 ฉันไม่ ดูข้อผิดพลาด DBCC อีกต่อไปเนื่องจากสิ่งนี้เกิดขึ้นเพื่อสอดคล้องกับค่านี้ของ0xa03eb4b849)


ในวันที่ 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 ดังนั้นดูเหมือนว่าสิ่งนี้อาจป้องกันความสับสนของคอลัมน์มาก่อน

ดังนั้นฉันเดาวิธีแก้ปัญหาที่อาจเกิดขึ้นอาจจะเปลี่ยนชื่อคอลัมน์Citiesเป็นCityIdตัวอย่าง

เชื่อมต่อรายการ (รายงานข้อบกพร่องของ Microsoft)


4
นี่เป็นข้อผิดพลาดที่น่าอัศจรรย์ :) อาจอธิบายการรวมลูปบ้าคลั่งเพราะพวกเขาอาจเป็นทางเลือกที่ดีสำหรับเงื่อนไขการเข้าร่วมที่สูงกว่านี้
boot4life

7
@ boot4life Idความสับสนยังทำให้สิ่งที่ควรจะเป็นสแกน เยี่ยมมากมาร์ติน ดูเหมือนว่าจะส่งผลกระทบต่อAUTO_GRIDตัวเลือกเท่านั้น ฉันสามารถสร้างข้อผิดพลาดใน CU4 2014 SP1 โดยใช้การเปรียบเทียบแบบตัวเล็กและตัวพิมพ์เล็ก SQL Server สร้างแบบสอบถามแบบขยายตรวจสอบอย่างไม่ถูกต้อง
พอลไวท์พูดว่า GoFundMonica
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.