আমি যখন এই জিনিসটি পেলাম তখন আমি অন্য কিছু নিয়ে গবেষণা করছিলাম। আমি এতে কিছু ডেটা সহ পরীক্ষার টেবিলগুলি তৈরি করেছিলাম এবং প্রশ্নগুলি লেখার বিভিন্ন উপায় কীভাবে প্রয়োগের পরিকল্পনাকে প্রভাবিত করে তা জানতে বিভিন্ন অনুসন্ধান চালিয়ে যাচ্ছিলাম। এখানে আমি স্ক্রিপ্টটি র্যান্ডম পরীক্ষার ডেটা উত্পন্ন করতে ব্যবহার করেছি:
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID('t') AND type in (N'U'))
DROP TABLE t
GO
CREATE TABLE t
(
c1 int IDENTITY(1,1) NOT NULL
,c2 int NULL
)
GO
insert into t
select top 1000000 a from
(select t1.number*2048 + t2.number a, newid() b
from [master]..spt_values t1
cross join [master]..spt_values t2
where t1.[type] = 'P' and t2.[type] = 'P') a
order by b
GO
update t set c2 = null
where c2 < 2048 * 2048 / 10
GO
CREATE CLUSTERED INDEX pk ON [t] (c1)
GO
CREATE NONCLUSTERED INDEX i ON t (c2)
GO
এখন, এই ডেটা দেওয়া, আমি নিম্নলিখিত কোয়েরি অনুরোধ:
select *
from t
where
c2 < 1048576
or c2 is null
;
আমার মহান বিস্ময়, ফাঁসি পরিকল্পনা যে এই জিজ্ঞাসার জন্য উত্পন্ন করা হয়েছিল করার জন্য, ছিল এই । (বাহ্যিক লিঙ্কটির জন্য দুঃখিত, এটি এখানে ফিট করা খুব বড়)
এই সমস্ত " কনস্ট্যান্ট স্ক্যান " এবং " কম্পিউট স্কেলারস " এর সাথে কী চলছে তা আমাকে কেউ ব্যাখ্যা করতে পারেন ? কি হচ্ছে?
|--Nested Loops(Inner Join, OUTER REFERENCES:([Expr1010], [Expr1011], [Expr1012]))
|--Merge Interval
| |--Sort(TOP 2, ORDER BY:([Expr1013] DESC, [Expr1014] ASC, [Expr1010] ASC, [Expr1015] DESC))
| |--Compute Scalar(DEFINE:([Expr1013]=((4)&[Expr1012]) = (4) AND NULL = [Expr1010], [Expr1014]=(4)&[Expr1012], [Expr1015]=(16)&[Expr1012]))
| |--Concatenation
| |--Compute Scalar(DEFINE:([Expr1005]=NULL, [Expr1006]=NULL, [Expr1004]=(60)))
| | |--Constant Scan
| |--Compute Scalar(DEFINE:([Expr1008]=NULL, [Expr1009]=(1048576), [Expr1007]=(10)))
| |--Constant Scan
|--Index Seek(OBJECT:([t].[i]), SEEK:([t].[c2] > [Expr1010] AND [t].[c2] < [Expr1011]) ORDERED FORWARD)