SQL सर्वर में अनुक्रमित दृश्य


11

मेरे पास एक मेज और उस पर एक अनुक्रमित दृश्य है जैसे

Create table mytable1 (ID int identity(1,1), Name nvarchar(100))

Create table mytable2 (ID int identity(1,1), Name nvarchar(100))

Create view myview 
with schemabinding 
as 
   select a.name, b.name
   from mytable1 a 
   join mytable2 b on a.Id = b.Id

अब अगर मैं निम्नलिखित क्वेरी चलाता हूं

select a.name, b.name
from mytable1 a 
join mytable2 b on a.Id = b.Id

यह मेरे अनुक्रमित दृश्य का उपयोग नहीं करता है। इसके बजाय अनुक्रमित दृश्य का उपयोग करने के लिए SQL सर्वर को बाध्य करने के लिए कोई संकेत (या अन्य तरीका) है?

मेरे पास एक बड़ी प्रणाली है, और इसे अनुकूलित करने की आवश्यकता है। मैं तालिकाओं के बजाय दृश्य से चयन करने के लिए अपनी सभी एसक्यूएल लिपियों को नहीं बदल सकता। मैं अनुक्रमित दृश्य बनाना चाहता हूं और तालिकाओं के बजाय उनसे डेटा प्राप्त करने के लिए SQL सर्वर को मजबूर करना चाहता हूं।

मैं SQL Server 2014 एंटरप्राइज़ संस्करण का उपयोग कर रहा हूं।


मेरे पास एक बड़ी प्रणाली है, और इसे अनुकूलित करने की आवश्यकता है। मैं तालिकाओं के बजाय दृश्य से चयन करने के लिए अपनी सभी sql लिपियों को नहीं बदल सकता। मैं अनुक्रमित दृश्य बनाना चाहता हूं और तालिकाओं के बजाय उनसे डेटा प्राप्त करने के लिए एसक्यूएल सर्वर को मजबूर करना चाहता हूं।
आर्टाचेस खाचट्रीन

जवाबों:


23

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

और ज़ेन से : एक साइड नोट के रूप में, किसी भी अन्य इंडेक्स की तरह इंडेक्स किए गए विचारों से सावधान रहें, यह आपके अपडेट में जोड़ देगा, सम्मिलित करेगा और समय को हटाएगा।


-5

यदि आप अपने एप्लिकेशन कोड को नए ऑब्जेक्ट नाम में नहीं बदल सकते हैं, तो हो सकता है कि आप एक नए डिफ़ॉल्ट स्कीमा का उपयोग करने के लिए अपने एप्लिकेशन उपयोगकर्ता को बदल सकते हैं और किसी अन्य स्कीमा में अनुक्रमित विचार बना सकते हैं? उदाहरण के लिए:

create view iv.MyTest 
as 
 select Col1, Col2 from dbo.MyTest 

निश्चित रूप से यह केवल तभी काम करेगा जब आपने एप्लिकेशन कोड में स्कीमा नामों का उपयोग नहीं किया हो।

यदि आपके पास है, तो आप सभी वस्तुओं को एक नए स्कीमा में ले जाने और पुराने स्कीमा में विचारों को पेश करने की कोशिश कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.