2012-04-06 15 views
21

में शामिल हों I MSSQL Server 2008 R2 का उपयोग कर रहा हूं और जब मैं इंडेक्स किए गए दृश्यों पर ठोकर खा रहा हूं तो मैं अपने विचारों को अनुकूलित करने की कोशिश कर रहा हूं। दुर्भाग्यवश मेरे अधिकांश दृश्य एक बाएं बाहरी जुड़ने का उपयोग करते हैं जो इंडेक्स किए गए दृश्यों के साथ समर्थित नहीं है। शोध के एक समूह के बाद, मुझे इस बारे में जाने का सबसे अच्छा तरीका उलझन में छोड़ दिया गया है। जिस तरह से मैं इसे देख, मैं निम्नलिखित विकल्प हैं:इंडेक्स किए गए दृश्य और बाएं एक बार और सभी

1) कन्वर्ट बाईं मिलती है आंतरिक चाल का उपयोग कर एक छोड़ दिया अनुकरण के साथ शामिल होने के लिए मिलती है करने के लिए "या (IsNull (ए) और IsNull (ख))"

मुझे यह समाधान दो स्थानों पर मिला, लेकिन प्रदर्शन हानि का उल्लेख किया गया।

2) बाईं कन्वर्ट मिलती भीतरी जुड़ जाता है और) खाली guids (00000000-0000-0000-0000-000000000000 साथ व्यर्थ स्तम्भ के nulls की जगह और मेल खाता GUID के साथ सही तालिका के एक ही पंक्ति जोड़ने के लिए।

यह सबसे स्पष्ट प्रदर्शन-वार दिखाई देता है, लेकिन ऐसा लगता है कि हर पंक्ति के लिए जगह का अपशिष्ट है जो अन्यथा नल होगा।

3) मेरे विचार को दो विचारों में विभाजित करें। पहला दृश्य मेरे तर्क का बहुमत है जो सूचकांक है। और दूसरा दृश्य पहले दृश्य से प्राप्त होता है और बाएं जोड़ता है।

यहां विचार, आधार दृश्य के माध्यम से एक प्रदर्शन लाभ हो सकता है। और यहां तक ​​कि व्युत्पन्न दृश्य से पूछताछ करने से कम से कम प्रदर्शन लाभ प्राप्त होगा।

4) नहीं सूचकांक क्या मेरे विचार

चाहेंगे दृश्य जिस तरह से यह ऊपर दिए गए विकल्पों में से किसी की तुलना में अधिक performant होना है छोड़ने?

CREATE TABLE [dbo].[tbl_Thumbnails](
     [ThumbnailId] [uniqueidentifier] NOT NULL, 
     [Data] [image] NULL, 
     [Width] [smallint] NOT NULL, 
     [Height] [smallint] NOT NULL 
    CONSTRAINT [PK_tbl_Thumbnails] PRIMARY KEY CLUSTERED 
    (
     [ThumbnailId] ASC 
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 

    GO 

    CREATE TABLE [dbo].[tbl_Tags](
     [TagId] [uniqueidentifier] NOT NULL, 
     [ThumbnailId] [uniqueidentifier] NULL 
    CONSTRAINT [PK_tbl_Tags] PRIMARY KEY CLUSTERED 
    (
     [TagId] ASC 
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
    ) ON [PRIMARY] 

    GO 

    CREATE VIEW [dbo].[v_Tags] WITH SCHEMABINDING AS 
    SELECT  dbo.tbl_Tags.TagId, dbo.tbl_Tags.ThumbnailId 
    FROM   dbo.tbl_Tags LEFT OUTER JOIN 
          dbo.tbl_Thumbnails 
    ON  dbo.tbl_Tags.ThumbnailId = dbo.tbl_Thumbnails.ThumbnailId 

    GO 

    INSERT INTO tbl_Tags VALUES ('16b23bb8-bf17-4784-b80a-220da1163584', NULL) 
    INSERT INTO tbl_Tags VALUES ('e8b50f03-65a9-4d1e-b3b4-268f01645c4e', 'a45e357b-ca9c-449a-aa27-834614eb3f6e') 
    INSERT INTO tbl_Thumbnails VALUES ('a45e357b-ca9c-449a-aa27-834614eb3f6e', NULL, 150, 150) 

अब, निम्न क्वेरी पैदावार कर टेस्ट "दृश्य पर सूचकांक बनाया नहीं जा सकता":

5) विचार मैं का

मैं अपने बुनियादी परिदृश्य पटकथा के रूप में निम्नानुसार नहीं सोचा था .dbo.v_Tags "। क्योंकि यह एक वाम, अधिकार का उपयोग करता है, या पूर्ण बाहरी में शामिल होने, और कोई बाहरी अनुक्रमित विचारों में अनुमति दी जाती है मिलती है एक अंदरूनी में शामिल होने के बजाय उपयोग पर विचार करें।":

CREATE UNIQUE CLUSTERED INDEX [TagId] ON [dbo].[v_Tags] 
(
[TagId] ASC 
) 
GO 

यह व्यवहार की उम्मीद है, लेकिन आप मेरे परिदृश्य से सर्वश्रेष्ठ प्रदर्शन प्राप्त करने के लिए किस तरह की कार्रवाई की सिफारिश करेंगे? यहां घर लेना सबसे अच्छा प्रदर्शन है।

+1

आप क्या खत्म किया था इस के साथ कर रही है से लाभ होगा अपने टेबल पर बनाया जाना? मुझे कुछ विचारों को अनुक्रमणित करने की कोशिश कर रहे एक समान मुद्दे का सामना करना पड़ रहा है। – user1948635

+0

इसी तरह की स्थिति का सामना करना, denormalized तालिका (ट्रिगर्स या इसे अद्यतित रखने का कोई अन्य तरीका) सूची में भी एक विकल्प हो सकता है। –

+0

मैंने बाएं जुड़ने पर इंडेक्स को भौतिक बनाने के बारे में एक बहुत ही समान प्रश्न का उत्तर दिया। हालांकि इसे करने का कोई सीधा तरीका नहीं है ... यहां विकल्प # 5 है http://stackoverflow.com/a/31171129/1902664 – cocogorilla

उत्तर

6

आप अपने विचारों को क्यों अनुक्रमणित कर रहे हैं? आपने अपने समाधान 2 में "अंतरिक्ष का अपशिष्ट" का उल्लेख किया है, लेकिन क्या आप जानते थे कि जब आप अपने विचार को अनुक्रमित करते हैं, तो आप इसे डीबी पर जारी रखते हैं?

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

आप Profiler + DTA या यहाँ तक कि DMVS का उपयोग करते हैं आप सही अनुक्रमित के साथ आ सकता है कि किसी भी दृश्य

+1

क्या होगा यदि दृश्य लगभग स्थिर डेटा प्रस्तुत करता है (अंतर्निहित तालिकाओं में शायद ही कभी बदला जाता है) और है कई जगहों पर भी इस्तेमाल किया जाता है? इंडेक्स किए गए दृश्य इस मामले में – Thetam

+0

में प्रदर्शन के लिए बहुत मदद करता है, हां। आप सही हैं – Diego

+2

यदि आप उस पर एक पूर्ण टेक्स्ट इंडेक्स बनाना चाहते हैं तो आपको अपने दृश्य को भी इंडेक्स करना होगा। –

संबंधित मुद्दे