SQL सर्वर संकुचित अनुक्रमणिका डेटा संपीड़न निर्दिष्ट किए बिना पुनर्निर्माण पर संकुचित रहते हैं?


13

एक के बाद एक पृष्ठ संपीड़न ( ALTER INDEX IX1 REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE)) का उपयोग करके अपने SQL सर्वर अनुक्रमित को फिर से लिखता है, बाद में फिर से करता है (जैसा कि एक निश्चित विखंडन सीमा से पहले कुछ रखरखाव लिपियों द्वारा किया जाता है) फिर से डेटा संपीड़न को निर्दिष्ट करने की आवश्यकता होती है? क्या इंडेक्स अन्यथा प्रभावी रूप से विघटित होंगे?

जवाबों:


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 विकल्प को बरकरार नहीं रखा जाता है।

हालाँकि, यदि हम सूचकांक को निष्क्रिय करते हैं, तो संपीड़न के साथ पुनर्निर्माण करें और फिर से पुनर्निर्माण करें:

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

ओला हॉलनग्रेन के रखरखाव समाधान के साथ पुनर्निर्माण का परीक्षण करना

परीक्षण प्रयोजनों के लिए मापदंडों को संशोधित किया जाता है।

एक पृष्ठ पर जाने के लिए कुछ डेटा जोड़ें, क्योंकि यह 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

एक रखरखाव योजना के साथ पुनर्निर्माण का परीक्षण करना (मैं ओला के समाधान के लिए दृढ़ता से तर्क दूंगा)

अनुक्रमणिका का पुनर्निर्माण करें

यहाँ छवि विवरण दर्ज करें

परीक्षण तालिका चुनें

यहाँ छवि विवरण दर्ज करें

कुछ परीक्षण विखंडन स्तर जोड़ें।

यहाँ छवि विवरण दर्ज करें

विखंडन होने के लिए कुछ मान डालें

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 डेटाबेस जो मैंने संपीड़ित किए थे वे सभी संपीड़न खो चुके थे और मुझे इसे फिर से लागू करना पड़ा। उस काम के हिस्से के रूप में, मैंने आपके परिणामों की जांच की और पुष्टि की लेकिन पता नहीं कि यह कैसे हुआ। केवल एक और संभावना है कि मैं भर में आया हूं, अगर इंडेक्स को अक्षम किया जाता है, तो वे पुनर्निर्माण के समय संपीड़न खो देते हैं। हमारी ईटीएल टीम के अनुसार ऐसा प्रतीत नहीं होता है। मैंने SQLServerCentral: sqlservercentral.com/Forums/2017336/Dat डेटाबेस-Lost-Compression पर यह सवाल भी रखा है कि यह कैसे हुआ।
मार्वल

हाय @Marvel, यह हो सकता है कि कुछ अन्य प्रक्रिया डेटाबेस पर अनुक्रमित अनुक्रमित हो? उदाहरण के लिए कुछ एप्लिकेशन example अपग्रेड ’करते हैं जहां वे गिरते हैं और अनगिनत इंडेक्स बनाते हैं। हालांकि मुझे नहीं लगता है कि कोई भी अधिक विवरण के बिना एक स्पष्ट विवरण देने में सक्षम होगा। अगली बार ऐसा होने पर, आप अनुक्रमणिका निर्माण तिथि को पा सकते हैं, और पा सकते हैं कि क्या वे फिर से बनाए गए हैं (जैसे कि इस कड़ी में क्वेरी के साथ: stackoverflow.com/questions/7579932/… । अन्यथा आप हमेशा एक प्रश्न के रूप में पूछ सकते हैं, लेकिन मैं करता हूं। सोचें कि आपको अधिक जानकारी प्रदान करने की आवश्यकता होगी।
Randi Vertongen

1
धन्यवाद, रैंडी! मैंने डेटाबेस पर SCHEMA_OBJECT_CHANGE_GROUP ऑडिटिंग की स्थापना की, लेकिन यह निश्चित रूप से मुझे लॉग के माध्यम से पार्स करने में मदद करेगा। मैंने पहले से ही दोषियों में से एक को पाया है- डेटाबेस का मालिक, जिसने संपीड़न का अनुरोध किया है वह लगातार टेबल और इंडेक्स को संशोधित कर रहा है। उन्होंने महसूस नहीं किया कि जब उन्होंने नई तालिकाएँ बनाईं और पुराने डेटा को स्थानांतरित किया और नए अनुक्रमित बनाए तो संपीड़न खो जाएगा। :( मैंने उसे अपनी टेबल और इंडेक्स बनाने का सही तरीका प्रदान किया है। मुझे नहीं लगता कि वह एकमात्र अपराधी है। हालांकि, मैं सोच भी नहीं सकता कि उसने
मार्वल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.