অন্যান্য পোস্ট করা উত্তরের উপর বিল্ডিং।
এই দুটিই সঠিক মান তৈরি করবে:
select distributor_id,
count(*) total,
sum(case when level = 'exec' then 1 else 0 end) ExecCount,
sum(case when level = 'personal' then 1 else 0 end) PersonalCount
from yourtable
group by distributor_id
SELECT a.distributor_id,
(SELECT COUNT(*) FROM myTable WHERE level='personal' and distributor_id = a.distributor_id) as PersonalCount,
(SELECT COUNT(*) FROM myTable WHERE level='exec' and distributor_id = a.distributor_id) as ExecCount,
(SELECT COUNT(*) FROM myTable WHERE distributor_id = a.distributor_id) as TotalCount
FROM myTable a ;
তবে, কর্মক্ষমতাটি একেবারেই আলাদা, যা ডেটার পরিমাণ বাড়ার সাথে স্পষ্টতই আরও প্রাসঙ্গিক হবে।
আমি দেখতে পেলাম যে, টেবিলে কোনও সূচী সংজ্ঞায়িত করা হয়নি, এসইউএমএস ব্যবহার করে কোয়েরিটি একটি একক টেবিল স্ক্যান করবে while
উদাহরণ হিসাবে, নিম্নলিখিত স্ক্রিপ্টটি চালান:
IF OBJECT_ID (N't1', N'U') IS NOT NULL
drop table t1
create table t1 (f1 int)
insert into t1 values (1)
insert into t1 values (1)
insert into t1 values (2)
insert into t1 values (2)
insert into t1 values (2)
insert into t1 values (3)
insert into t1 values (3)
insert into t1 values (3)
insert into t1 values (3)
insert into t1 values (4)
insert into t1 values (4)
insert into t1 values (4)
insert into t1 values (4)
insert into t1 values (4)
SELECT SUM(CASE WHEN f1 = 1 THEN 1 else 0 end),
SUM(CASE WHEN f1 = 2 THEN 1 else 0 end),
SUM(CASE WHEN f1 = 3 THEN 1 else 0 end),
SUM(CASE WHEN f1 = 4 THEN 1 else 0 end)
from t1
SELECT
(select COUNT(*) from t1 where f1 = 1),
(select COUNT(*) from t1 where f1 = 2),
(select COUNT(*) from t1 where f1 = 3),
(select COUNT(*) from t1 where f1 = 4)
2 টি নির্বাচনী বিবৃতি হাইলাইট করুন এবং প্রদর্শন আনুমানিক এক্সিকিউশন প্ল্যান আইকনে ক্লিক করুন। আপনি দেখতে পাবেন যে প্রথম বিবৃতিটি একটি টেবিল স্ক্যান করবে এবং দ্বিতীয়টি 4 করবে vious স্পষ্টতই একটি টেবিল স্ক্যান 4 এর চেয়ে ভাল।
একটি ক্লাস্টার্ড সূচক যুক্ত করা আকর্ষণীয় interesting যেমন
Create clustered index t1f1 on t1(f1);
Update Statistics t1;
উপরের প্রথম নির্বাচনটি একটি একক ক্লাস্টারড ইনডেক্স স্ক্যান করবে। দ্বিতীয় নির্বাচনটি 4 টি ক্লাস্টারড ইনডেক্স সিক্স করবে, তবে তারা এখনও একটি ক্লাস্টারড ইনডেক্স স্ক্যানের চেয়ে বেশি ব্যয়বহুল। আমি 8 মিলিয়ন সারি সহ একটি টেবিলে একই জিনিসটি চেষ্টা করেছি এবং দ্বিতীয় SELECT এখনও অনেক ব্যয়বহুল ছিল।
SELECT distributor_id, COUNT(*) AS TOTAL, COUNT(*) WHERE level = 'exec', COUNT(*) WHERE level = 'personal'