ดัชนีที่บีบอัด SQL Server ยังคงถูกบีบอัดในการสร้างใหม่โดยไม่ระบุการบีบอัดข้อมูลหรือไม่


13

หลังจากสร้างดัชนี SQL Server อีกครั้งโดยใช้การบีบอัดหน้า ( ALTER INDEX IX1 REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE)) ให้ทำการสร้างใหม่ในภายหลัง (ตามที่สคริปต์การบำรุงรักษาบางรายการผ่านเกณฑ์การแตกแฟรกเมนต์) จำเป็นต้องระบุการบีบอัดข้อมูลอีกครั้งหรือไม่ มิฉะนั้นดัชนีจะแตกอย่างมีประสิทธิภาพหรือไม่

คำตอบ:


22

ดัชนียังคงถูกบีบอัดเมื่อสร้างใหม่ / จัดระเบียบใหม่

สร้างตารางและดัชนีที่บีบอัด

 CREATE TABLE DBO.TEST_INDX(id int, bla varchar(255));
 CREATE INDEX IX1 ON dbo.TEST_INDX(id)  WITH (DATA_COMPRESSION = PAGE);

ตรวจสอบการบีบอัด

 SELECT i.name, p.data_compression_desc 
 FROM sys.partitions P
 INNER JOIN sys.indexes I ON I.object_id = P.object_id AND I.index_id = P.index_id
 WHERE P.data_compression > 0 and I.name = 'IX1';

ผลลัพธ์

name    data_compression_desc
IX1     PAGE

สร้างดัชนีใหม่

ALTER INDEX IX1 on  DBO.TEST_INDX rebuild 

ตรวจสอบการบีบอัด

 SELECT i.name, p.data_compression_desc 
 FROM sys.partitions P
 INNER JOIN sys.indexes I ON I.object_id = P.object_id AND I.index_id = P.index_id
 WHERE P.data_compression > 0 and I.name = 'IX1'

ผลลัพธ์

name    data_compression_desc
IX1     PAGE

การปิดใช้งานพวกเขาและการสร้างใหม่นั้นมีผลลัพธ์ที่แตกต่างกันเนื่องจากการปิดใช้งานจะลบดัชนีในขณะที่ยังคงรักษาคำจำกัดความของดัชนีไว้

alter index IX1 on  DBO.TEST_INDX DISABLE ;
alter index IX1 on  DBO.TEST_INDX REBUILD ;

ผลลัพธ์

name    data_compression_desc

การบีบอัดขาดหายไปนิยามการบีบอัดจะหายไปเมื่อวางและสร้างดัชนีผ่าน SSMS โดยไม่ปรับสคริปต์สร้างดัชนี

ทำไม?

เนื่องจากตัวเลือก data_compression จะไม่ถูกเก็บไว้เมื่อทำการสคริปต์คำสั่ง Index create

อย่างไรก็ตามหากเราปิดการใช้งานดัชนีให้สร้างใหม่ด้วยการบีบอัดแล้วสร้างใหม่อีกครั้ง:

alter index IX1 on  DBO.TEST_INDX DISABLE ;
alter index IX1 on  DBO.TEST_INDX REBUILD  WITH (DATA_COMPRESSION = PAGE);
alter index IX1 on  DBO.TEST_INDX REBUILD;

ผลลัพธ์

name    data_compression_desc
IX1 PAGE

การทดสอบการสร้างใหม่ด้วยโซลูชันการบำรุงรักษาของ Ola hallengren

พารามิเตอร์ถูกแก้ไขเพื่อวัตถุประสงค์ในการทดสอบ

เพิ่มข้อมูลบางอย่างเพื่อไปที่หน้าเดียวเนื่องจากจำเป็นสำหรับพารามิเตอร์ MinNumberOfPages

INSERT INTO dbo.TEST_INDX(id,bla)
VALUES(5,'test');
go 10 

ดำเนินการโปรแกรมเพิ่มประสิทธิภาพดัชนีเพื่อพิมพ์คำสั่ง

EXECUTE dbo.IndexOptimize
@Databases = 'TestDB',
@FragmentationLow = 'INDEX_REBUILD_ONLINE',
@FragmentationMedium = 'INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
@FragmentationHigh = 'INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
@FragmentationLevel1 = 5,
@FragmentationLevel2 = 30,
@Indexes = 'TestDB.DBO.TEST_INDX',
@Execute = 'N',
@MinNumberOfPages = 1;

ผลลัพธ์:

Command: ALTER INDEX [IX1] ON [TestDB].[dbo].[TEST_INDX] REBUILD WITH (SORT_IN_TEMPDB = OFF, ONLINE = ON, RESUMABLE = OFF)

Comment: ObjectType: Table, IndexType: NonClustered, ImageTex
t: No, NewLOB: No, FileStream: No, ColumnStore: No, AllowPageLocks: Yes, PageCount: 1, Fragmentation: 0
Outcome: Not Executed
Duration: 00:00:00
Date and time: 2019-01-09 14:48:12

การดำเนินการคำสั่งที่สร้างขึ้น

ALTER INDEX [IX1] ON [TestDB].[dbo].[TEST_INDX] REBUILD WITH (SORT_IN_TEMPDB = OFF, ONLINE = ON, RESUMABLE = OFF)

การบีบอัดจะถูกเก็บไว้

name    data_compression_desc
IX1 PAGE

การทดสอบการสร้างใหม่ด้วยแผนการบำรุงรักษา (ฉันขอโต้แย้งการแก้ปัญหาของ ola)

สร้างดัชนีใหม่

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

เลือกตารางทดสอบ

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

เพิ่มระดับการแตกแฟรกเมนต์ทดสอบ

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

แทรกค่าบางอย่างเพื่อให้การกระจายตัว

INSERT INTO dbo.TEST_INDX(id)
SELECT id from TEST_INDX
go 4

ตรวจสอบเปอร์เซ็นต์การกระจายตัว

SELECT 
I.[name] AS  INDX ,
IPS.avg_fragmentation_in_percent,
IPS.page_count
FROM sys.dm_db_index_physical_stats (DB_ID(), object_id('[dbo].[TEST_INDX]'), NULL, NULL, NULL) AS IPS
INNER JOIN sys.indexes AS I ON I.[object_id] = IPS.[object_id]
AND IPS.index_id = I.index_id
WHERE IPS.database_id = DB_ID()
and I.name = 'IX1'

ผลลัพธ์

INDX    avg_fragmentation_in_percent    page_count
IX1 66,6666666666667    3

เรียกใช้แผน

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

ส่วนที่น่าสนใจที่นี่เมื่อดูรายงานแผนคือDATA_COMPRESSION = PAGEตัวเลือกจะถูกเพิ่มไปยังREBUILDคำสั่งที่สร้างขึ้น!

Command:USE [TestDB]
GO
ALTER INDEX [IX1] ON [dbo].[TEST_INDX] REBUILD PARTITION = ALL WITH (PAD_INDEX = ON, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, RESUMABLE = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80, DATA_COMPRESSION = PAGE)

การกระจายตัว:

INDX    avg_fragmentation_in_percent    page_count
IX1 0   2

การบีบอัด:

name    data_compression_desc
IX1 PAGE

ฉันเจอคุณโพสต์เมื่อฉันพบว่า 3 ฐานข้อมูลที่ฉันบีบอัดได้สูญเสียการบีบอัดข้อมูล & ฉันต้องนำไปใช้ใหม่ ในส่วนของงานนั้นฉันทดสอบและยืนยันผลลัพธ์ของคุณ แต่ไม่รู้ว่ามันเกิดขึ้นได้อย่างไร ความเป็นไปได้อื่น ๆ ที่ฉันได้พบคือถ้าดัชนีถูกปิดใช้งานพวกเขาจะสูญเสียการบีบอัดเมื่อสร้างใหม่ สิ่งนี้ไม่ได้เกิดขึ้นสำหรับทีม ETL ของเรา ฉันยังได้วางคำถามนี้ใน SQLServerCentral: sqlservercentral.com/Forums/2017336/Database-Lost-Compressionทั้งหมดที่สูญเสียสำหรับวิธีนี้เกิดขึ้น
ประหลาดใจเมื่อ

สวัสดี @Marvel เป็นไปได้ไหมที่กระบวนการอื่นสร้างดัชนีบนฐานข้อมูลอีกครั้ง ตัวอย่างเช่นบางแอพพลิเคชั่นทำการ 'อัปเกรด' โดยที่พวกมันดร็อปและสร้างดัชนีจำนวนนับไม่ถ้วน อย่างไรก็ตามฉันไม่คิดว่าใครจะสามารถให้คำอธิบายที่ชัดเจนโดยไม่มีรายละเอียดเพิ่มเติม ครั้งต่อไปที่มันเกิดขึ้นคุณสามารถค้นหาวันที่สร้างดัชนีและค้นหาว่าพวกเขาอยู่ที่ไหนที่สร้างขึ้นใหม่ (เช่นกับแบบสอบถามในลิงค์นี้: stackoverflow.com/questions/7579932/… . มิฉะนั้นคุณสามารถถามคำถามได้เสมอ แต่ฉันทำ คิดว่าคุณจะต้องให้ข้อมูลเพิ่มเติม
Randi Vertongen

1
ขอบคุณ Randi! ฉันตั้งค่าการตรวจสอบ SCHEMA_OBJECT_CHANGE_GROUP ในฐานข้อมูล แต่สิ่งนี้จะช่วยให้ฉันสามารถแยกวิเคราะห์บันทึกได้เร็วขึ้น ฉันได้พบหนึ่งในผู้ร้าย - เจ้าของฐานข้อมูลคนที่ร้องขอการบีบอัดได้รับการปรับเปลี่ยนตารางและดัชนีอย่างต่อเนื่อง เขาไม่ทราบว่าเมื่อเขาสร้างตารางใหม่ & ย้ายข้อมูลเก่าใน & สร้างดัชนีใหม่จะทำให้การบีบอัดข้อมูลสูญหาย :( ฉันให้วิธีที่ถูกต้องแก่เขาในการสร้างตารางและดัชนีของเขา แต่ฉันไม่คิดว่าเขาเป็นผู้ร้ายเพียงคนเดียว แต่ฉันไม่สามารถจินตนาการได้ว่าเขาได้ทำสิ่งนี้กับ e
Marvel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.