अनुक्रमित दृश्य
अनुक्रमित दृश्य संभव है।
एक अनुक्रमित दृश्य एक ऐसा दृश्य है जिस पर एक संकुल अनुक्रमणिका होती है, और डेटा वास्तव में डिस्क पर संग्रहीत होता है।
जैसा कि मैं इसे समझता हूं, आप tblProduct
में संग्रहीत प्रति उत्पाद आइटम की खरीदारी का योग रखने का प्रयास कर रहे हैं . मैंने मान लिया है कि ItemCode
tblProduct का PK है और वह ItemName
. है वहां भी परिभाषित किया गया है (हम MAX
. का उपयोग नहीं कर सकते हैं अनुक्रमित दृश्य में)। तो हम एक दृश्य को इस तरह परिभाषित कर सकते हैं:
CREATE VIEW dbo.vwTotalPurchases
WITH SCHEMABINDING -- must be schema bound, we cannot change underlying columns after creation
AS
SELECT
ItemCode,
SUM(Quantity) QuantityPurchased,
COUNT_BIG(*) CountPurchases -- if we group, must have count also, so that rows can be maintained
FROM dbo.tblPurchase -- must use two-part names
GROUP BY itemCode;
GO
फिर हम डिस्क पर इसे बनाए रखने के लिए उस पर क्लस्टर्ड इंडेक्स बना सकते हैं। जब भी बेस टेबल में कोई अपडेट होता है तो SQL सर्वर इंडेक्स को बनाए रखेगा। अगर ग्रुपिंग में कोई और पंक्तियाँ नहीं हैं (गिनती 0 होने से पहचानी जाती है), तो पंक्ति हटा दी जाती है:
CREATE UNIQUE CLUSTERED INDEX PK_vwTotalPurchases ON dbo.vwTotalPurchases (ItemCode);
GO
अब अगर हम इसे क्वेरी करना चाहते हैं, तो हम इस दृश्य को tblProducts
. पर छोड़ सकते हैं (बाएं शामिल हों क्योंकि कोई खरीदारी नहीं हो सकती है):
SELECT
p.ItemCode,
p.ItemName,
ISNULL(tp.QuantityPurchased, 0) QuantityPurchased,
ISNULL(tp.CountPurchases, 0) CountPurchases
FROM tblProducts p
LEFT JOIN vwTotalPurchases tp WITH (NOEXPAND) ON tp.ItemCode = p.ItemCode;
हम इसे एक दृश्य के रूप में भी परिभाषित कर सकते हैं (एक अनुक्रमित नहीं, बल्कि एक मानक दृश्य) ताकि परिभाषा कहीं भी प्रयोग करने योग्य हो।
NOEXPAND
पर ध्यान दें :
यदि आप SQL सर्वर एंटरप्राइज़ या डेवलपर संस्करण पर नहीं हैं, तो आपको संकेत WITH (NOEXPAND)
का उपयोग करना चाहिए इसे इंडेक्स का उपयोग करने के लिए बाध्य करने के लिए, अन्यथा यह आधार tblPurchase
. को क्वेरी करेगा बजाय। और उन संस्करणों में भी, NOEXPAND
. का उपयोग करना सबसे अच्छा है ।
देखें यह लेख इस पर पॉल व्हाइट द्वारा।