বিচ্ছিন্ন কলাম, সিপিইউ সময় এবং ফিল্টার সূচকগুলি


10

Sparsing

স্পার্স কলামগুলিতে কিছু পরীক্ষা করার সময়, আপনি যেমন করছিলেন, সেখানে একটি পারফরম্যান্স ধাক্কা লেগেছে যা আমি এর সরাসরি কারণ জানতে চাই।

DDL

আমি দুটি অভিন্ন টেবিল তৈরি করেছি, একটিতে 4 টি স্পার্স কলাম এবং একটি অপ্রয়োজনীয় কলাম ছাড়াই।

--Non Sparse columns table & NC index
CREATE TABLE dbo.nonsparse( ID INT IDENTITY(1,1) PRIMARY KEY NOT NULL,
                      charval char(20) NULL,
                      varcharval varchar(20) NULL,
                      intval int NULL,
                      bigintval bigint NULL
                      );
CREATE INDEX IX_Nonsparse_intval_varcharval
ON dbo.nonsparse(intval,varcharval)
INCLUDE(bigintval,charval);

-- sparse columns table & NC index

CREATE TABLE dbo.sparse( ID INT IDENTITY(1,1) PRIMARY KEY NOT NULL,
                      charval char(20) SPARSE NULL ,
                      varcharval varchar(20) SPARSE NULL,
                      intval int SPARSE NULL,
                      bigintval bigint SPARSE NULL
                      );

CREATE INDEX IX_sparse_intval_varcharval
ON dbo.sparse(intval,varcharval)
INCLUDE(bigintval,charval);

DML

আমি তখন দুজনের মধ্যে প্রায় 2540 নন-নুল মান সন্নিবেশ করিয়েছি

INSERT INTO dbo.nonsparse WITH(TABLOCK) (charval, varcharval,intval,bigintval)
SELECT 'Val1','Val2',20,19
FROM MASTER..spt_values;

INSERT INTO dbo.sparse WITH(TABLOCK) (charval, varcharval,intval,bigintval)
SELECT 'Val1','Val2',20,19
FROM MASTER..spt_values;

এর পরে, আমি উভয় টেবিলের মধ্যে 1 এম নুল মান .োকালাম

INSERT INTO dbo.nonsparse WITH(TABLOCK)  (charval, varcharval,intval,bigintval)
SELECT TOP(1000000) NULL,NULL,NULL,NULL 
FROM MASTER..spt_values spt1
CROSS APPLY MASTER..spt_values spt2;

INSERT INTO dbo.sparse WITH(TABLOCK) (charval, varcharval,intval,bigintval)
SELECT TOP(1000000) NULL,NULL,NULL,NULL 
FROM MASTER..spt_values spt1
CROSS APPLY MASTER..spt_values spt2;

ক্যোয়ারী

ননস্পার্স টেবিল কার্যকর করা

সদ্য নির্মিত নন পার্স সারণিতে দু'বার এই ক্যোয়ারী চালানোর সময়:

SET STATISTICS IO, TIME ON;
SELECT  * FROM dbo.nonsparse
WHERE   1= (SELECT 1) -- force non trivial plan
OPTION(RECOMPILE,MAXDOP 1);

যৌক্তিক পঠনগুলি 5257 পৃষ্ঠাগুলি প্রদর্শন করে

(1002540 rows affected)
Table 'nonsparse'. Scan count 1, logical reads 5257, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

এবং সিপিইউ সময় 343 এমএস এ হয়

 SQL Server Execution Times:
   CPU time = 343 ms,  elapsed time = 3850 ms.

বিরল টেবিল কার্যকর

স্পার ছকে দুটি বার একই ক্যোয়ারী চালানো:

SELECT  * FROM dbo.sparse
WHERE   1= (SELECT 1) -- force non trivial plan
OPTION(RECOMPILE,MAXDOP 1);

পঠন কম, 1763

(1002540 rows affected)
Table 'sparse'. Scan count 1, logical reads 1763, physical reads 3, read-ahead reads 1759, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

তবে সিপিইউর সময় বেশি, 547 এমএস

 SQL Server Execution Times:
   CPU time = 547 ms,  elapsed time = 2406 ms.

বিচ্ছিন্ন টেবিল কার্যকরকরণ পরিকল্পনা

অ বিরল টেবিল কার্যকরকরণ পরিকল্পনা


প্রশ্নাবলি

আসল প্রশ্ন

যেহেতু NULL মানগুলি স্পার্স কলামগুলিতে সরাসরি সংরক্ষণ করা হয় না, ফলস্বরূপ হিসাবে NULL মানগুলি ফেরত দেওয়ার কারণে সিপিইউর সময় বৃদ্ধি পেতে পারে ? অথবা ডকুমেন্টেশনে উল্লিখিত আচরণটি কি কেবল এই জাতীয় আচরণ ?

বিরল কলামগুলি ননাল মানগুলি পুনরুদ্ধার করতে আরও ওভারহেডের ব্যয়ে নাল মানগুলির জন্য স্থানের প্রয়োজনীয়তা হ্রাস করে

বা ওভারহেড কেবল পঠন এবং স্টোরেজ ব্যবহারের সাথে সম্পর্কিত?

এক্সিকিউশন অপশনের পরে ফেলে দেওয়া ফলাফলগুলি সহ এসএমএস চালানোর সময়, বিচ্ছিন্ন নির্বাচনের সিপিইউ সময়টি অবিচ্ছিন্ন (219 এমএস) তুলনায় বেশি (407 এমএস) ছিল।

সম্পাদনা

এটি কেবলমাত্র 2540 উপস্থিত থাকলেও এটি নাল মানগুলির ওভারহেড হতে পারে তবে আমি এখনও নিশ্চিত নই।

এটি একই পারফরম্যান্স সম্পর্কে বলে মনে হচ্ছে, তবে বিরল ফ্যাক্টরটি হারিয়ে গেছে।

CREATE INDEX IX_Filtered
ON dbo.sparse(charval,varcharval,intval,bigintval)
WHERE charval IS NULL  
      AND varcharval IS NULL
      AND intval  IS NULL
      AND bigintval  IS NULL;

CREATE INDEX IX_Filtered
ON dbo.nonsparse(charval,varcharval,intval,bigintval)
WHERE charval IS NULL  
      AND varcharval IS NULL
      AND intval  IS NULL
      AND bigintval  IS NULL;


    SET STATISTICS IO, TIME ON;

SELECT  charval,varcharval,intval,bigintval FROM dbo.sparse WITH(INDEX(IX_Filtered))
WHERE charval IS NULL AND  varcharval IS NULL
                     AND intval  IS NULL
                     AND bigintval  IS NULL
                     OPTION(RECOMPILE,MAXDOP 1);


SELECT  charval,varcharval,intval,bigintval 
FROM dbo.nonsparse WITH(INDEX(IX_Filtered))
WHERE charval IS NULL AND 
                      varcharval IS NULL
                     AND intval  IS NULL
                     AND bigintval  IS NULL
                     OPTION(RECOMPILE,MAXDOP 1);

একই মৃত্যুদন্ড কার্যকর সময় বলে মনে হচ্ছে:

 SQL Server Execution Times:
   CPU time = 297 ms,  elapsed time = 292 ms.

 SQL Server Execution Times:
   CPU time = 281 ms,  elapsed time = 319 ms.

কিন্তু কেন এখন যৌক্তিক একই পরিমাণ পড়ছে? বিচ্ছিন্ন কলামের জন্য ফিল্টারড সূচকগুলি কি অন্তর্ভুক্ত আইডি ক্ষেত্র এবং কিছু অন্যান্য ডেটা পৃষ্ঠা ব্যতীত আর কিছু সঞ্চয় করা উচিত নয়?

Table 'sparse'. Scan count 1, logical reads 5785,
Table 'nonsparse'. Scan count 1, logical reads 5785

এবং উভয় সূচকের আকার:

RowCounts   Used_MB Unused_MB   Total_MB
1000000     45.20   0.06        45.26

কেন এই একই আকার? স্পার্স-নেসটি কি হারিয়েছিল?

ফিল্টার ইনডেক্স ব্যবহার করার সময় উভয় প্রশ্নের পরিকল্পনা করে


অতিরিক্ত তথ্য

select @@version

মাইক্রোসফ্ট এসকিউএল সার্ভার 2017 (আরটিএম-সিইউ 16) (কেবি 4508218) - 14.0.3223.3 (এক্স 64) জুলাই 12 2019 17:43:08 কপিরাইট (সি) 2017 মাইক্রোসফ্ট কর্পোরেশন বিকাশকারী সংস্করণ (64-বিট) উইন্ডোজ সার্ভার 2012 আর 2 ডাটাসেন্টার 6.3 (বিল্ড) 9600:) (হাইপারভাইজার)

অনুসন্ধানগুলি চালানোর সময় এবং কেবলমাত্র আইডি ক্ষেত্রটি নির্বাচন করার সময়, সিপিইউ সময়টি তুলনীয়, স্পার টেবিলের জন্য নিম্ন যৌক্তিক পাঠ সহ।

টেবিলগুলির আকার

SchemaName  TableName   RowCounts   Used_MB Unused_MB   Total_MB
dbo         nonsparse   1002540     89.54   0.10        89.64
dbo         sparse      1002540     27.95   0.20        28.14

ক্লাস্টারযুক্ত বা নন-ক্ল্লাস্টার্ড সূচককে বাধ্য করার সময়, সিপিইউ সময়ের পার্থক্য থেকে যায়।


1
আপনি কি সম্পাদনা-পরবর্তী প্রশ্নের জন্য পরিকল্পনাগুলি পেতে পারেন?
জর্জ.পালাসিয়োস

1
@ জর্জ.প্যালাসিয়োস তাদের যুক্ত করেছে :)
রেন্ডি

উত্তর:


6

অথবা ডকুমেন্টেশনে উল্লিখিত আচরণটি কি কেবল এই জাতীয় আচরণ?

তাই মনে হয়. ডকুমেন্টেশনে উল্লিখিত "ওভারহেড" সিপিইউ ওভারহেড হিসাবে প্রদর্শিত হবে।

দুটি ক্যোয়ারী রচনা করে স্পার্স ক্যোয়ারী সিপিইউয়ের 367 এমএস নমুনা করেছে, অন্যদিকে স্পার্সে সিপিইউয়ের 284 এমএস রয়েছে। এটি 83 এমএসের পার্থক্য।

পারফিউভের স্ক্রিনশটটি থ্রেডের জন্য মোট সিপিইউ দেখায় যা ক্যোরি চালিয়েছে

এর বেশিরভাগ কোথায়?

উভয় প্রোফাইল এগুলি না পাওয়া পর্যন্ত একেবারে অনুরূপ দেখায় sqlmin!IndexDataSetSession::GetNextRowValuesInternal। এই মুহুর্তে, স্পার কোডটি একটি চলার পথে চলে যায় sqlmin!IndexDataSetSession::GetDataLong, যা কিছু ফাংশনকে কল করে যা দেখে মনে হয় যে তারা স্পার্স কলাম বৈশিষ্ট্য ( HasSparseVector, StoreColumnValue) এর সাথে সম্পর্কিত এবং (42 + 11 =) 53 এমএস পর্যন্ত যুক্ত।

স্পার্স কলামের জন্য সিপিইউ পার্থক্যের স্ক্রিনশট

কেন এই একই আকার? স্পার্স-নেসটি কি হারিয়েছিল?

হ্যাঁ, স্পার্স কলামটি যখন সূচক কী হিসাবে ব্যবহৃত হয় তখন স্পার্স স্টোরেজ অপটিমাইজেশন নন ক্ল্লাস্টারড ইনডেক্সগুলিতে বহন করে না appears সুতরাং অবিবাহিত সূচীর কী কলামগুলি স্বল্পতা বিবেচনা না করেই তাদের পূর্ণ আকার গ্রহণ করে তবে অন্তর্ভুক্ত কলামগুলি শূন্যস্থান নিতে পারে যদি সেগুলি খুব কম হয় এবং NULL হয়।

এ খুঁজছি DBCC PAGEশূন্য-মূল্যবান বিক্ষিপ্ত কলাম সহ ক্লাস্টার সূচক পাতা থেকে আউটপুট, আমি দেখতে পারেন রেকর্ড দৈর্ঘ্য হল 11 (4 আইডি + + 7 প্রতি রেকর্ড ওভারহেড মান জন্য):

Record Type = PRIMARY_RECORD        Record Attributes =  NULL_BITMAP    Record Size = 11

ফিল্টারড ইনডেক্সের জন্য, রেকর্ডটি সর্বদা 40 হয়, যা সমস্ত মূল কলামের আকারের যোগফল (4 বাইট আইডি + 20 বাইট চার্ভাল + 4 বাইট ভার্চারওয়াল + 4 বাইট ইনট্ভাল + 8 বাইট বিগ ইনটওয়াল = 40 বাইট)।

কোনও কারণে, DBCC PAGEসূচি রেকর্ডগুলির জন্য "রেকর্ড আকার" এর মধ্যে 7 বাইট ওভারহেড অন্তর্ভুক্ত করবেন না:

Record Type = INDEX_RECORD          Record Attributes =  NULL_BITMAP    Record Size = 40

ফিল্টারবিহীন সূচকের আকারটি ছোট (4 বাইট আইডি + 4 বাইট অন্তর্নিহিত + 4 বাইট ভার্চারওয়াল = 12 বাইট) কারণ স্পার্স কলামগুলির মধ্যে দুটি কলাম অন্তর্ভুক্ত করা হয়, যা আবার স্বল্পতম অপ্টিমাইজেশন পায়:

Record Type = INDEX_RECORD          Record Attributes =  NULL_BITMAP    Record Size = 12

আমি ডক্স পৃষ্ঠায় তালিকাবদ্ধ সীমাবদ্ধতার একটিতে আচরণের লাইনে এই পার্থক্যটি অনুমান করি:

একটি স্পারস কলাম কোনও ক্লাস্টারড সূচক বা কোনও অনন্য প্রাথমিক কী সূচকের অংশ হতে পারে না

অবিচ্ছিন্ন সূচকে তাদের কী হওয়ার অনুমতি দেওয়া হয়েছে, তবে এগুলি খুব কম সংরক্ষণ করা হয় না।


2
সুন্দর! আবার ধন্যবাদ!
রেন্ডি ভার্টনজেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.