मैं मौजूदा उत्पादों को ट्यून करने के लिए हर समय SQL सर्वर में अनुक्रमित दृश्य बनाता हूं। यदि आप उपयुक्त स्तंभों का उपयोग कर रहे हैं तो अनुक्रमणिका का उपयोग करने के लिए ऑप्टिमाइज़र पर्याप्त स्मार्ट है।
अपने उदाहरण का उपयोग करते हुए, ऐसा लगता है कि आपने दृश्य बनाया है, लेकिन वास्तव में उस पर एक इंडेक्स नहीं बनाया है।
if object_id(N'mytable1') is not null
drop table mytable1
if object_id(N'mytable2') is not null
drop table mytable2
go
Create table mytable1 (ID int identity(1,1), Name1 nvarchar(100))
GO
Create table mytable2 (ID int identity(1,1), Name2 nvarchar(100))
GO
insert into mytable1 values ('steve')
insert into mytable1 values ('jack')
insert into mytable1 values ('mike')
insert into mytable1 values ('ralph')
insert into mytable1 values ('simon')
insert into mytable2 values ('smith')
insert into mytable2 values ('jackson')
insert into mytable2 values ('mikaelson')
insert into mytable2 values ('montalvo')
insert into mytable2 values ('singer')
go
if object_id(N'myview') is not null
drop view myview
go
Create view myview
with schemabinding
as
select a.id, a.name1, b.name2
from dbo.mytable1 a
join dbo.mytable2 b on a.Id = b.Id
GO
select a.name1, b.name2
from mytable1 a join mytable2 b on a.Id = b.Id
GO
चूंकि इस दृश्य पर कोई इंडेक्स नहीं है, इसलिए हम बेस टेबल पर स्कैन करते हैं:
लेकिन एक बार जब हम एक इंडेक्स जोड़ लेते हैं, तो अनुकूलक इसका उपयोग कर सकता है:
CREATE UNIQUE CLUSTERED INDEX [ix_cl_names] ON [myview]
(
[name1] ASC,
[name2] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
यह उचित रूप से दृश्य का उपयोग करता है:
मैं तालिकाओं के बजाय दृश्य से चयन करने के लिए अपनी सभी एसक्यूएल लिपियों को नहीं बदल सकता। मैं अनुक्रमित दृश्य बनाना चाहता हूं और तालिकाओं के बजाय उनसे डेटा प्राप्त करने के लिए SQL सर्वर को मजबूर करना चाहता हूं।
क्वेरी में संदर्भित नहीं होने पर अनुक्रमित दृश्य का उपयोग करने के लिए SQL सर्वर को बाध्य करने के लिए कोई संकेत या अन्य विधि नहीं है।
अतिरिक्त जानकारी ( ज्योफ पैटरसन से )
एक अतिरिक्त बिंदु यह है कि जब एंटरप्राइज़ संस्करण में ऑप्टिमाइज़र केवल इस मामले में अनुक्रमित दृश्य का उपयोग कर सकता है, तो यह NOEXPAND
संकेत का उपयोग करते हुए सीधे दृश्य को संदर्भित करने के लिए समझ में आ सकता है यदि आपको उपयोग किए जाने वाले दृश्य सूचकांक के 100% सुनिश्चित होने की आवश्यकता है या यदि आप कभी भी इसे मानक संस्करण में उपयोग करना चाहते हैं।
मैंने अक्सर एंटरप्राइज़ संस्करण में भी प्रश्न देखे हैं, जहां ऑप्टिमाइज़र इस तथ्य पर नहीं उठाता है कि जब तक उपयोग नहीं किया जाता है, तब तक दृश्य सूचकांक NOEXPAND
का उपयोग किया जा सकता है। यह जटिल प्रश्नों के साथ अधिक सामान्य है, लेकिन सरल प्रश्नों के साथ भी हो सकता है।
पॉल व्हाइट ने मेरे द्वारा पढ़ी गई बेहतर लेखों में से एक है NOEXPAND
; व्यू इंडेक्स के सिर्फ उपयोग से परे, हिंट चीजों को भी प्रभावित कर सकता है, जैसे कि योजना के लिए इंडेक्सेड व्यू और कार्डिनैलिटी अनुमानों पर स्वचालित रूप से आंकड़े बनाए जाते हैं।
और ज़ेन से : एक साइड नोट के रूप में, किसी भी अन्य इंडेक्स की तरह इंडेक्स किए गए विचारों से सावधान रहें, यह आपके अपडेट में जोड़ देगा, सम्मिलित करेगा और समय को हटाएगा।