मैं निम्नलिखित परिदृश्य में एक अनुक्रमित दृश्य को सेटअप करने के लिए संघर्ष कर रहा हूं ताकि निम्न क्वेरी दो क्लस्टर इंडेक्स स्कैन के बिना निष्पादित हो। जब भी मैं इस क्वेरी के लिए एक अनुक्रमणिका दृश्य बनाता हूं और फिर इसका उपयोग करता हूं, तो यह मेरे द्वारा लगाए गए किसी भी सूचकांक को अनदेखा करने लगता है:
-- +++ 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
तालिका सेटअप निम्नानुसार है:
- दो मेज़
- वे ऊपर की क्वेरी द्वारा एक आंतरिक जुड़ने से जुड़े हुए हैं
- और पहले से एक स्तंभ द्वारा आदेश दिया गया और फिर ऊपर क्वेरी द्वारा दूसरी तालिका से एक स्तंभ; केवल TOP 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
अनुक्रमित दृश्य को संभवतः निम्नानुसार परिभाषित किया जाना चाहिए और परिणामी TOP 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