আপনার প্রশ্নে, আপনি কয়েকটি পরীক্ষার বিবরণ দিয়েছেন যা আপনি প্রস্তুত করেছেন যেখানে আপনি "প্রমাণ" করেছেন যে বিচ্ছিন্ন কলামগুলির তুলনায় অতিরিক্ত বিকল্পটি দ্রুত। আমি সন্দেহ করি যে আপনার পরীক্ষার পদ্ধতিটি বেশ কয়েকটি উপায়ে ত্রুটিযুক্ত হতে পারে, যেমন @ জিবিএন এবং @ শ্রুতজকি ইঙ্গিত করেছেন।
প্রথমত, আপনাকে নিশ্চিত করতে হবে যে আপনি এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিও (বা আপনি যে কোনও ক্লায়েন্ট ব্যবহার করছেন) পরীক্ষা করছেন না। উদাহরণস্বরূপ, আপনি যদি SELECT *
3 মিলিয়ন সারি নিয়ে কোনও টেবিল থেকে চালাচ্ছেন তবে আপনি বেশিরভাগ এসএসকিউএল সার্ভার থেকে সারিগুলি টানতে এবং সেগুলি অন স্ক্রিনে রেন্ডার করার জন্য এসএসএমএসের দক্ষতার পরীক্ষা করছেন। SELECT COUNT(1)
নেটওয়ার্ক জুড়ে কয়েক মিলিয়ন সারি টানতে এবং এগুলি স্ক্রিনে রেন্ডার করার প্রয়োজনীয়তা উপেক্ষা করে এমন কিছু ব্যবহার করার জন্য আপনি অনেক বেশি ভাল ।
দ্বিতীয়ত, আপনার এসকিউএল সার্ভারের ডেটা ক্যাশে সম্পর্কে সচেতন হওয়া দরকার। সাধারণত, আমরা স্টোরেজ থেকে ডেটা পড়ার গতি এবং সেই ডেটা প্রক্রিয়াজাতকরণ, একটি শীতল-ক্যাশে থেকে পরীক্ষা করি (যেমন এসকিউএল সার্ভারের বাফার খালি রয়েছে)। মাঝেমধ্যে, আপনার সমস্ত পরীক্ষার উষ্ণ-ক্যাশে দিয়ে বোধগম্য করে তোলে, তবে আপনাকে সেই বিষয়টি মনে রেখে স্পষ্ট করে আপনার পরীক্ষাটি করা দরকার।
শীতল-ক্যাশে পরীক্ষার জন্য, আপনাকে পরীক্ষার প্রতিটি রান করার আগে চালানো CHECKPOINT
এবং DBCC DROPCLEANBUFFERS
আগে চালানো দরকার ।
আপনি আপনার প্রশ্নে যে পরীক্ষার বিষয়ে জিজ্ঞাসা করেছেন তার জন্য, আমি নিম্নলিখিত পরীক্ষার শয্যা তৈরি করেছি:
IF COALESCE(OBJECT_ID('tempdb..#SomeTest'), 0) <> 0
BEGIN
DROP TABLE #SomeTest;
END
CREATE TABLE #SomeTest
(
TestID INT NOT NULL
PRIMARY KEY
IDENTITY(1,1)
, A INT NOT NULL
, B FLOAT NOT NULL
, C MONEY NOT NULL
, D BIGINT NOT NULL
);
INSERT INTO #SomeTest (A, B, C, D)
SELECT o1.object_id, o2.object_id, o3.object_id, o4.object_id
FROM sys.objects o1
, sys.objects o2
, sys.objects o3
, sys.objects o4;
SELECT COUNT(1)
FROM #SomeTest;
এটি আমার মেশিনে 260,144,641 এর একটি গণনা দেয়।
"সংযোজন" পদ্ধতিটি পরীক্ষা করতে, আমি চালিত:
CHECKPOINT 5;
DBCC FREEPROCCACHE;
DBCC DROPCLEANBUFFERS;
SET STATISTICS IO, TIME ON;
GO
SELECT COUNT(1)
FROM #SomeTest st
WHERE (st.A + st.B + st.C + st.D) = 0;
GO
SET STATISTICS IO, TIME OFF;
বার্তা ট্যাব দেখায়:
সারণী '#SomeTest'। স্ক্যান গণনা 3, যৌক্তিক পাঠ 1322661, শারীরিক 0 0, পঠন-এগিয়ে 1313877, লব লজিকাল রিড 0, লব ফিজিকাল 0, লব রিড-ফরোয়ার্ড 0
এসকিউএল সার্ভার এক্সিকিউশন টাইমস: সিপিইউ সময় = 49047 এমএস, অতিবাহিত সময় = 173451 এমএস।
"পৃথক কলাম" পরীক্ষার জন্য:
CHECKPOINT 5;
DBCC FREEPROCCACHE;
DBCC DROPCLEANBUFFERS;
SET STATISTICS IO, TIME ON;
GO
SELECT COUNT(1)
FROM #SomeTest st
WHERE st.A = 0
AND st.B = 0
AND st.C = 0
AND st.D = 0;
GO
SET STATISTICS IO, TIME OFF;
আবার, বার্তা ট্যাব থেকে:
সারণী '#SomeTest'। স্ক্যান গণনা 3, যৌক্তিক পাঠ 1322661, শারীরিক 0 0, পঠন-এগিয়ে 1322661, লব লজিকাল 0, লব শারীরিক 0, লব পঠন-এগিয়ে 0 0
এসকিউএল সার্ভার এক্সিকিউশন টাইমস: সিপিইউ সময় = 8938 এমএস, অতিবাহিত সময় = 162581 এমএস।
উপরের পরিসংখ্যানগুলি থেকে আপনি দ্বিতীয় বৈকল্পটি দেখতে পারবেন, 0 এর সাথে তুলনায় পৃথক কলামগুলির সাথে, অতিবাহিত সময়টি প্রায় 10 সেকেন্ডের চেয়ে কম হয়, এবং সিপিইউ সময়টি প্রায় 6 গুণ কম হয়। উপরের আমার পরীক্ষাগুলির দীর্ঘ সময়কালগুলি বেশিরভাগ ডিস্ক থেকে প্রচুর সারি পড়ার ফলাফল। যদি আপনি সারির সংখ্যা 3 মিলিয়নে ফেলে দেন তবে আপনি অনুপাতটি একইরকম দেখতে পান তবে অতিবাহিত সময়গুলি লক্ষণীয়ভাবে হ্রাস পায়, যেহেতু ডিস্ক I / O এর প্রভাব খুব কম রয়েছে।
"সংযোজন" পদ্ধতি সহ:
সারণী '#SomeTest'। স্ক্যান কাউন্ট 3, লজিকাল 15155 রিডিজ, ফিজিকাল রিড 0, রিড-ফরোয়ার্ড 0 পড়ছে, লব লজিকাল রিড 0, লব ফিজিকাল রিড 0, লব রিড-ফরোয়ার্ড 0 0
এসকিউএল সার্ভার এক্সিকিউশন টাইমস: সিপিইউ সময় = 499 এমএস, অতিবাহিত সময় = 256 এমএস।
"পৃথক কলাম" পদ্ধতি সহ:
সারণী '#SomeTest'। স্ক্যান কাউন্ট 3, লজিকাল 15155 রিডিজ, ফিজিকাল রিড 0, রিড-ফরোয়ার্ড 0 পড়ছে, লব লজিকাল রিড 0, লব ফিজিকাল রিড 0, লব রিড-ফরোয়ার্ড 0 0
এসকিউএল সার্ভার এক্সিকিউশন টাইমস: সিপিইউ সময় = 94 এমএস, অতিবাহিত সময় = 53 এমএস।
কি এই পরীক্ষার জন্য সত্যিই বড় পার্থক্য করতে হবে? একটি উপযুক্ত সূচক, যেমন:
CREATE INDEX IX_SomeTest ON #SomeTest(A, B, C, D);
"সংযোজন" পদ্ধতি:
সারণী '#SomeTest'। স্ক্যান কাউন্ট 3, লজিকাল পড়ছে 14235, শারীরিক পাঠ 0, রিড-ফরোডড 0, লব লজিকাল রিড 0, লব ফিজিকাল 0, লব রিড-ফরোডড 0
এসকিউএল সার্ভার এক্সিকিউশন টাইমস: সিপিইউ সময় = 546 এমএস, অতিবাহিত সময় = 314 এমএস।
"পৃথক কলাম" পদ্ধতি:
সারণী '#SomeTest'। স্ক্যান কাউন্ট 1, লজিকাল রিডস 3, ফিজিকাল রিড 0, রিড-ফরোয়ার্ড রিড 0, লব লজিকাল রিড 0, লব ফিজিকাল 0, লব রিড-ফরোয়ার্ড 0
এসকিউএল সার্ভার এক্সিকিউশন টাইমস: সিপিইউ সময় = 0 এমএস, অতিবাহিত সময় = 0 এমএস।
প্রতিটি ক্যোয়ারির জন্য কার্যনির্বাহী পরিকল্পনা (উপরের ইনডেক্সে ইনডেক্স) বেশ কিছু বলছে।
"সংযোজন" পদ্ধতি, যা অবশ্যই পুরো সূচকের স্ক্যান সম্পাদন করে:
এবং "স্বতন্ত্র কলামগুলি" পদ্ধতিটি সূচকটির প্রথম সারিতে সন্ধান করতে পারে যেখানে শীর্ষস্থানীয় সূচক কলামটি A
শূন্য: