আমি নিম্নলিখিত দৃশ্যে একটি সূচক দৃষ্টিভঙ্গি সেটআপ করার জন্য সংগ্রাম করছি যাতে নীচের কোয়েরিটি দুটি ক্লাস্টারযুক্ত সূচক স্ক্যান ছাড়াই সম্পাদন করে। যখনই আমি এই ক্যোয়ারির জন্য একটি সূচক ভিউ তৈরি করি এবং তারপরে এটি ব্যবহার করি, মনে হয় আমি যে কোনও সূচক রেখেছি তা এড়িয়ে চলেছে:
-- +++ THE QUERY THAT I WANT TO IMPROVE PERFORMANCE-WISE +++
SELECT TOP 1 *
FROM dbo.TB_test1 t1
INNER JOIN dbo.TB_test2 t2 ON t1.PK_ID1 = t2.FK_ID1
ORDER BY t1.somethingelse1
,t2.somethingelse2;
GO
টেবিল সেটআপটি নিম্নরূপ:
- দুটি টেবিল
- তারা উপরের ক্যোয়ারী দ্বারা একটি অভ্যন্তরীণ যোগদান দ্বারা যোগদান করা হয়
- এবং প্রথমটি থেকে একটি কলাম এবং তারপরে কোয়েরিতে দ্বিতীয় টেবিল থেকে একটি কলাম দ্বারা অর্ডার করা হয়েছে; কেবল শীর্ষ 1 টি নির্বাচিত হয়েছে
(নীচের স্ক্রিপ্টে পরীক্ষার ডেটা উত্পন্ন করার জন্য কিছু লাইন রয়েছে, কেবল যদি সমস্যাটি পুনরুত্পাদন করতে সহায়তা করে)
-- +++ TABLE SETUP +++ CREATE TABLE [dbo].[TB_test1] ( [PK_ID1] [INT] IDENTITY(1, 1) NOT NULL ,[something1] VARCHAR(40) NOT NULL ,[somethingelse1] BIGINT NOT NULL CONSTRAINT [PK_TB_test1] PRIMARY KEY CLUSTERED ( [PK_ID1] ASC ) ); GO create TABLE [dbo].[TB_test2] ( [PK_ID2] [INT] IDENTITY(1, 1) NOT NULL ,[FK_ID1] [INT] NOT NULL ,[something2] VARCHAR(40) NOT NULL ,[somethingelse2] BIGINT NOT NULL CONSTRAINT [PK_TB_test2] PRIMARY KEY CLUSTERED ( [PK_ID2] ASC ) ); GO ALTER TABLE [dbo].[TB_test2] WITH CHECK ADD CONSTRAINT [FK_TB_Test1] FOREIGN KEY([FK_ID1]) REFERENCES [dbo].[TB_test1] ([PK_ID1]) GO ALTER TABLE [dbo].[TB_test2] CHECK CONSTRAINT [FK_TB_Test1] GO -- +++ TABLE DATA GENERATION +++ -- this might not be the quickest way, but it's only to set up test data INSERT INTO dbo.TB_test1 ( something1, somethingelse1 ) VALUES ( CONVERT(VARCHAR(40), NEWID()) -- something1 - varchar(40) ,ISNULL(ABS(CHECKSUM(NewId())) % 92233720368547758078, 1) -- somethingelse1 - bigint ) GO 100000 RAISERROR( 'Finished setting up dbo.TB_test1', 0, 1) WITH NOWAIT GO INSERT INTO dbo.TB_test2 ( FK_ID1, something2, somethingelse2 ) VALUES ( ISNULL(ABS(CHECKSUM(NewId())) % ((SELECT MAX(PK_ID1) FROM dbo.TB_test1) - 1), 0) + 1 -- FK_ID1 - int ,CONVERT(VARCHAR(40), NEWID()) -- something2 - varchar(40) ,ISNULL(ABS(CHECKSUM(NewId())) % 92233720368547758078, 1) -- somethingelse2 - bigint ) GO 100000 RAISERROR( 'Finished setting up dbo.TB_test2', 0, 1) WITH NOWAIT GO
ইনডেক্সড ভিউ সম্ভবত নীচের হিসাবে সংজ্ঞায়িত করা উচিত এবং ফলাফলের শীর্ষ 1 কোয়েরি নীচে। তবে আমার কী সূচিগুলির প্রয়োজন তাই যাতে এই ক্যোয়ারীটি সূচী দর্শন না করে আরও ভাল সম্পাদন করে?
CREATE VIEW VI_test
WITH SCHEMABINDING
AS
SELECT t1.PK_ID1
,t1.something1
,t1.somethingelse1
,t2.PK_ID2
,t2.FK_ID1
,t2.something2
,t2.somethingelse2
FROM dbo.TB_test1 t1
INNER JOIN dbo.TB_test2 t2 ON t1.PK_ID1 = t2.FK_ID1
GO
SELECT TOP 1 * FROM dbo.VI_test ORDER BY somethingelse1,somethingelse2
GO