সমষ্টিগুলির জন্য সূচী দর্শনগুলি ব্যবহার করা - সত্য হতে খুব ভাল?


28

আমাদের কাছে বেশ বড় রেকর্ড গণনা (10-20 মিলিয়ন সারি) সহ একটি ডেটা গুদাম রয়েছে এবং প্রায়শই এমন অনুসন্ধান চালানো হয় যা নির্দিষ্ট তারিখের মধ্যে রেকর্ড গণনা করে বা নির্দিষ্ট পতাকা সহ রেকর্ড গণনা করে eg

SELECT
    f.IsFoo,
    COUNT(*) AS WidgetCount
FROM Widgets AS w
JOIN Flags AS f
    ON f.FlagId = w.FlagId
WHERE w.Date >= @startDate
GROUP BY f.IsFoo

পারফরম্যান্সটি ভয়াবহ নয়, তবে তুলনামূলকভাবে আলগা হতে পারে (ঠান্ডা ক্যাশে সম্ভবত 10 সেকেন্ড)।

সম্প্রতি আমি আবিষ্কার করেছি যে আমি GROUP BYইনডেক্সড ভিউগুলিতে ব্যবহার করতে পারি এবং নীচের মতো কিছু মিলিয়ে দেখতে চেষ্টা করেছি

CREATE VIEW TestView
WITH SCHEMABINDING
AS
    SELECT
        Date,
        FlagId,
        COUNT_BIG(*) AS WidgetCount
    FROM Widgets
    GROUP BY Date, FlagId;
GO

CREATE UNIQUE CLUSTERED INDEX PK_TestView ON TestView
(
    Date,
    FlagId
);

ফলস্বরূপ আমার প্রথম ক্যোয়ারীর পারফরম্যান্সটি এখন <100 মিমি, এবং ফলাফল এবং সূচকটি <100 কে (যদিও আমাদের সারি গণনা বড়, তারিখ এবং পতাকা আইডির সীমাটি এই ভিউটিতে কেবল 1000-2000 সারি রয়েছে)।

আমি ভেবেছিলাম সম্ভবত এটি উইজেট টেবিলে লেখার পারফরম্যান্সকে বিকৃত করে দেবে, তবে না - এই টেবিলটিতে সন্নিবেশ এবং আপডেটের পারফরম্যান্সটি যতটা আমি বলতে পারি ততই বেশ ক্ষতিগ্রস্থ হয়েছে (প্লাস, ডেটা গুদাম হওয়ার কারণে এই টেবিলটি খুব কম সময়ে আপডেট হয়) যাহাই হউক না কেন)

আমার কাছে, এটি সত্য বলে মনে হয় খুব ভাল - তাই না? এভাবে সূচকযুক্ত দর্শনগুলি ব্যবহার করার সময় আমার কী সাবধানতা অবলম্বন করা উচিত?


2
আপনি কি আপনার স্ক্রিপ্টগুলি আবার লিখতে পারেন যাতে সেগুলি আসলে বৈধ এসকিউএল হয়? আপনার SELECTএবং CREATE VIEWস্ক্রিপ্টগুলি ভুল, কারণ আমি বিশ্বাস করি আপনার CREATE INDEXস্ক্রিপ্ট।
মার্ক সিনিংসন

2
@ মার্কসিংকসন ক্ষমা প্রার্থনা করে দেখা গেছে যে কাল্পনিক টেবিলের জন্য বৈধ এসকিউএল লেখার চেষ্টা করা শক্ত
জাস্টিন

আমার পক্ষে 'সত্য হতে খুব ভাল' অংশটি তখনই এসেছিল যখন আমি আরও উন্নত দৃষ্টিভঙ্গি চাইতাম যেমন ম্যাক্স, স্ব বা বাহ্যিক যোগদান করে অথবা এমন একটি ভিউ সূচিত করে যা নিজেই অন্য দৃশ্যের উল্লেখ করে - এসকিউএল সার্ভারে যা কিছু অন্তত তা নয় মঞ্জুরিপ্রাপ্ত ডকস.মাইক্রোসফট.এইন.উস / এসকিএল / রিলেশনাল- ডেটাবেসস / ভিউস /… । সুতরাং আমি সর্বদা অতিরিক্ত উচ্চাভিলাষী হওয়া এবং তারপরে জিনিসগুলি স্কেল করে ফেলার চেষ্টা করি। তবে সরল সমাহারগুলির জন্য তারা সত্যই দুর্দান্ত - এমনকি এসইউএম সমর্থিত।
সাইমন_উইভার

উত্তর:


29

যেমনটি আপনি উল্লেখ করেছেন, ভিউটি কেবলমাত্র কয়েকটি সংখ্যক সারি তৈরি করে - তাই আপনি যদি পুরো টেবিলটি আপডেট করেন তবে ভিউটি আপডেট করার সাথে জড়িত অতিরিক্ত আই / ও অবহেলিত। আপনি দৃশ্যটি তৈরি করার সময় আপনি সম্ভবত সবচেয়ে বড় ব্যথা অনুভব করতে শুরু করেছেন। পরবর্তী নিকটবর্তীটি হবে যদি আপনি ভিউতে নতুন সারি প্রয়োজন এমন নতুন আইডিগুলির একটি গোছা সহ বেস টেবিলটিতে গাজিলিয়ন সারি যুক্ত করেন।

এটি সত্য হতে খুব ভাল না। লেখার সময় ভবিষ্যতের ক্যোয়ারী সমষ্টিগুলির জন্য অর্থ প্রদানের জন্য আপনি কীভাবে নির্দেশিত দর্শনগুলি ব্যবহার করা হচ্ছিলেন - বা কমপক্ষে কার্যকর উপায়গুলির মধ্যে একটি হ'ল। ফলাফলটি উত্সের চেয়ে অনেক ছোট হলে এবং এটি অবশ্যই সবচেয়ে ভাল কাজ করে যখন অবশ্যই অন্তর্ভুক্ত ডেটা আপডেট হওয়ার চেয়ে বার বার সমষ্টিগুলির জন্য অনুরোধ করা হয় (সাধারণত ওয়ালটিপির চেয়ে ডিডাব্লুতে বেশি সাধারণ)।

দুর্ভাগ্যক্রমে অনেক লোক মনে করেন একটি ভিউকে সূচনা করা ম্যাজিক - একটি সূচি সমস্ত দৃষ্টিভঙ্গিকে আরও দক্ষ করে তোলে না, বিশেষত এমন মতামত যা কেবল টেবিলগুলিতে যোগদান করে এবং / অথবা উত্স হিসাবে (বা এমনকি গুণ) একই সংখ্যক সারি তৈরি করে produce এই ক্ষেত্রে ভিউ থেকে আই / ও হ'ল মূল ক্যোয়ারীর চেয়ে একই বা আরও খারাপ, কেবল একই বা আরও বেশি সারি রয়েছে বলেই নয়, তবে প্রায়শই তারা আরও কলামগুলিও সংরক্ষণ করে এবং বাস্তবায়িত করে চলেছে। সুতরাং অগ্রিমগুলি বাস্তবায়িত করা কোনও লাভ দেয় না, যেহেতু - এসএসডি সহ - I / O, নেটওয়ার্ক এবং ক্লায়েন্ট প্রসেসিং / রেন্ডারিং এখনও ক্লায়েন্টের কাছে বৃহত ফলাফলের ফলাফলগুলি ফেরত দেওয়ার ক্ষেত্রে প্রাথমিক বাধা হয়ে দাঁড়িয়েছে। রানটাইমের সময় যোগ দেওয়া এড়াতে যে সঞ্চয় আপনি পেয়েছেন তা আপনি এখনও ব্যবহার করছেন এমন সমস্ত অন্যান্য সংস্থার তুলনায় পরিমাপযোগ্য নয়।

ক্লাস্টারবিহীন সূচকের মতো, এটি অতিরিক্ত না করার জন্য কেবল সাবধান হন। যদি আপনি একটি টেবিলে 10 টি ভিন্ন সূচকযুক্ত ভিউ যোগ করেন তবে আপনি আপনার কাজের চাপের লেখার অংশে আরও বেশি প্রভাব দেখতে পাচ্ছেন, বিশেষত যদি গ্রুপিং কলাম (গুলি) ক্লাস্টারিং কীটিতে না থাকে।

খোশ, আমি এই বিষয়টি সম্পর্কে ব্লগ করার অর্থ পেয়েছি।


19

অ্যারনস উত্তরগুলি এই প্রশ্নটি ভালভাবে কভার করেছিল। দুটি জিনিস যুক্ত করতে হবে:

  1. সমষ্টি সূচী দর্শনগুলি ক্রস-সারি বিতর্ক এবং ডেডলকগুলিতে নিয়ে যেতে পারে। সাধারণত, দুটি সন্নিবেশগুলি অচলাবস্থায় থাকে না (বরং বিরল অবস্থার জন্য যেমন লক এ্যাসকেলেশন বা লক হ্যাশের সংঘর্ষ)। তবে যদি উভয় সন্নিবেশকরা একই দলে দলে বক্তব্য রাখেন তবে তারা বিতর্ক করবেন। একই পয়েন্টটি লক (ডিএমএল, লক ইঙ্গিত) লাগে এমন অন্য কোনও কিছুর জন্য দাঁড়ায়।
  2. সমষ্টিগত নয় এমন সূচী দর্শনগুলিও কার্যকর হতে পারে। এগুলি আপনাকে একাধিক সারণী থেকে কলামগুলিতে সূচকের অনুমতি দেয়। এইভাবে আপনি দক্ষতার সাথে একটি টেবিলে ফিল্টার করতে পারেন এবং একটি যোগদানের টেবিল থেকে একটি কলাম দ্বারা অর্ডার করতে পারেন। এই প্যাটার্নটি সম্পূর্ণ টেবিল জোড়কে ক্ষুদ্র ধ্রুবক-সময় প্রশ্নের সাথে রূপান্তর করতে পারে।

আমি উভয় একত্রিতকরণ ব্যবহার করেছি এবং চূড়ান্ত সুবিধার সাথে দর্শনগুলিতে যোগদান করেছি।

আপনার সমস্ত ব্যবহারের ক্ষেত্রে এটি একটি নিখুঁত কেসের মতো মনে হয়। ইনডেক্সেড ভিউগুলি এমন একটি কৌশল যা বহুগুণ কার্যকর হয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.