SQL सर्वर 2016 सिस्टम-वर्जन वाली टेम्पोरल टेबल्स को स्लोली-चेंजिंग डाइमेंशन्स के लिए क्वेरी स्ट्रैटेजी


17

जब सिस्टम-वर्जन वाली टेम्पोरल टेबल (SQL Server 2016 में नई) का उपयोग किया जाता है, तो एक बड़े रिलेशनल डेटा वेयरहाउस में धीरे-धीरे बदलते आयामों को संभालने के लिए इस सुविधा का उपयोग करने पर क्वेरी संलेखन और प्रदर्शन निहितार्थ क्या हैं?

उदाहरण के लिए, मान लें कि मेरे पास एक कॉलम के Customerसाथ 100,000-पंक्ति आयाम Postal Codeऔर Salesएक CustomerIDविदेशी कुंजी कॉलम के साथ एक बहु-अरब-पंक्ति तथ्य तालिका है । और मान लें कि मैं "ग्राहक के पोस्टल कोड द्वारा कुल 2014 बिक्री" को क्वेरी करना चाहता हूं। सरलीकृत डीडीएल इस तरह है (स्पष्टता के लिए कई कॉलमों को छोड़ना):

CREATE TABLE Customer
(
    CustomerID int identity (1,1) NOT NULL PRIMARY KEY CLUSTERED, 
    PostalCode varchar(50) NOT NULL,
    SysStartTime datetime2 GENERATED ALWAYS AS ROW START NOT NULL, 
    SysEndTime datetime2 GENERATED ALWAYS AS ROW END NOT NULL,   
    PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime) 
)
WITH (SYSTEM_VERSIONING = ON);

CREATE TABLE Sale
(
    SaleId int identity(1,1) NOT NULL PRIMARY KEY CLUSTERED,
    SaleDateTime datetime2 NOT NULL,
    CustomerId int NOT NULL FOREIGN KEY REFERENCES Customer(CustomerID),
    SaleAmount decimal(10,2) NOT NULL
);

जहां यह दिलचस्प हो जाता है कि ग्राहक वर्ष के दौरान स्थानांतरित हो सकते हैं, तो एक ही ग्राहक के पास अलग-अलग डाक कोड हो सकते हैं। और यह भी दूर से संभव है कि एक ग्राहक दूर चला गया और फिर वापस चला गया, जिसका अर्थ है कि एक ही डाक कोड के साथ एक ही ग्राहक के लिए कई इतिहास रिकॉर्ड हो सकते हैं! "डाक कोड द्वारा बिक्री" की मेरी क्वेरी को ग्राहकों के डाक कोड समय के साथ कैसे बदलते हैं, इसके सही परिणामों की गणना करने में सक्षम होना चाहिए।

मैं समझता हूं कि ग्राहक आयाम को अकेले क्वेरी करने के लिए टेम्पोरल टेबल का उपयोग कैसे करें (जैसे SELECT * FROM Customer FOR SYSTEM_TIME FROM '2014-1-1' TO '2015-1-1') लेकिन मुझे यकीन नहीं है कि तथ्य तालिका में सबसे सटीक और कुशलता से कैसे शामिल हो।

क्या यह है कि मुझे इसे कैसे क्वेरी करना चाहिए?

SELECT c.PostalCode, sum(s.SaleAmount) SaleAmount
FROM Customer c FOR SYSTEM_TIME FROM '2014-1-1' TO '2015-1-1'
    JOIN Sale s ON s.CustomerId = c.CustomerId
WHERE s.SaleDateTime >= '2014-1-1' AND s.SaleDateTime < '2015-1-1'
    AND c.SysStartTime >= s.SaleDateTime
    AND c.SysEndTime < s.SaleDateTime
GROUP BY c.PostalCode

और इस तरह के प्रश्न करते समय मुझे क्या प्रदर्शन पर विचार करना चाहिए?

जवाबों:


1

मुझे लगता है, आपके मामले में प्रति ग्राहक पोस्टकोड के म्यूटेशन की संख्या को अलग करने के लिए एक व्युत्पन्न तालिका आवश्यक है:

SELECT c.postalcode 
, sum(s.SaleAmount) SaleAmount
, count(postcode_mutations.customerid) as CntCustomerChangedPostCode   
FROM dbo.Sale s
JOIN dbo.Customer c on s.customerid = c.customerid

LEFT JOIN (
SELECT 
    CustomerID
FROM [dbo].[Customer]
FOR SYSTEM_TIME FROM '20140101' TO '20150101'
GROUP BY CustomerID
HAVING COUNT(DISTINCT PostalCode) > 1
) postcode_mutations on s.customerid = postcode_mutations.customerid

WHERE s.SaleDateTime >= '2014-1-1' AND s.SaleDateTime < '2015-1-1'
GROUP BY c.PostalCode

अपडेट: चूंकि क्वेरी DWH / Analytics परिदृश्यों की सेवा करने वाली है, इसलिए कॉलमस्टोर इंडेक्सिंग एक विकल्प है। मैंने 10 मिलियन पंक्तियों की तालिका के लिए पहले कुछ बेंचमार्क भी बनाए थे


प्रति ग्राहक परिवर्तनों की संख्या की गणना करना क्यों आवश्यक है? ग्राहक जो वर्ष के दौरान पोस्टल कोड बदलते हैं, क्वेरी में जटिलता जोड़ते हैं, लेकिन वास्तव में उन परिवर्तनों पर रिपोर्टिंग की आवश्यकता नहीं लगती है।
जस्टिन ग्रांट

@JustinGrant परिवर्तनों की संख्या यह दिखाना है कि ऐतिहासिक डेटा से इन उत्परिवर्तन को कैसे प्राप्त किया जा सकता है। हालाँकि, ये पंक्तियाँ, आपने कल जोड़ी थीं: "डाक कोड द्वारा बिक्री" की मेरी क्वेरी को सही परिणाम की गणना करने में सक्षम होना चाहिए, भले ही ग्राहकों के डाक कोड समय के साथ बदलते हों। अनुरोध अधिक स्पष्ट करें। उस स्थिति में, System_TIME को दोनों तालिकाओं के लिए समान तरीके से सेट किया जाना चाहिए। और दो तरीके हैं: 1) वंचित तालिकाओं का उपयोग करें और दोनों तालिकाओं के लिए system_time लागू करें। 2) या बस एक दृश्य बनाएं जो एक पकड़ को शामिल करता है और दृश्य को क्वेरी करने पर SYSTEM_TIME लागू करता है
एलेक्जेंडर वोल्क
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.