ধীরে ধীরে পরিবর্তনশীল মাত্রাগুলির জন্য এসকিউএল সার্ভার 2016 সিস্টেম-সংস্করণযুক্ত টেম্পোরাল টেবিলগুলি ব্যবহারের কৌশলগুলি অনুসন্ধান করুন


17

কোনও সিস্টেম-সংস্করণযুক্ত টেম্পোরাল টেবিল (এসকিউএল সার্ভার ২০১ Server-তে নতুন) ব্যবহার করার সময়, কোনও বৃহত্তর আপেক্ষিক ডেটা গুদামে আস্তে আস্তে পরিবর্তনের মাত্রা পরিচালনা করতে যখন এই বৈশিষ্ট্যটি ব্যবহার করা হয় তখন কোয়েরি রাইটিং এবং পারফরম্যান্সের কী কী প্রভাব পড়বে?

উদাহরণস্বরূপ, ধরুন আমার কাছে একটি কলাম 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

আপডেট: যেহেতু ক্যোয়ারিটি ডিডাব্লুএইচ / অ্যানালিটিক্স পরিস্থিতিতে পরিবেশিত হবে বলে মনে করা হচ্ছে, তাই কলামস্টোর সূচীকরণ পরীক্ষা করার একটি বিকল্প। আমি আগে 10 মিলিয়ন সারি সারণির জন্য কিছু মানদণ্ড তৈরি করেছি ।


কেন প্রতি গ্রাহক পরিবর্তনের সংখ্যা গণনা করা প্রয়োজন? গ্রাহকরা যারা বছরের মধ্যে ডাক কোড পরিবর্তন করে সেগুলি কোয়েরিতে জটিলতা যুক্ত করে তবে বাস্তবে এই পরিবর্তনগুলি সম্পর্কে প্রতিবেদন করা প্রয়োজন বলে মনে হয় না।
জাস্টিন গ্রান্ট

@ জাস্টিনগ্র্যান্টের পরিবর্তনের সংখ্যা হ'ল showতিহাসিক তথ্য থেকে কীভাবে এই রূপান্তরগুলি পুনরুদ্ধার করা যায় তা দেখানো। যাইহোক, এই লাইনগুলি, আপনি গতকাল যোগ করেছেন: "পোস্টাল কোড দ্বারা বিক্রয়" সম্পর্কে আমার ক্যোয়ারী সময়ের সাথে সাথে গ্রাহকের ডাক কোড কীভাবে পরিবর্তিত হয় তা নির্বিশেষে সঠিক ফলাফল গণনা করতে সক্ষম হওয়া উচিত। অনুরোধটি আরও পরিষ্কার করুন। সেক্ষেত্রে উভয় টেবিলের জন্য SYSTEM_TIME একইভাবে সেট করা উচিত। এবং দুটি উপায় রয়েছে: 1) বঞ্চিত টেবিলগুলি ব্যবহার করুন এবং উভয় টেবিলের জন্য system_Time প্রয়োগ করুন। 2) অথবা কেবল এমন একটি ভিউ তৈরি করুন যা একটি যোগদান রাখে এবং ভিউ জিজ্ঞাসা করার জন্য SYSTEM_TIME প্রয়োগ করবে
আলেকজান্ডার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.