এস -কিউএল কেলেক্টেড ফিল্ড নির্বাচন করুন এবং বিভাগ দ্বারা গ্রুপ করুন in


11

প্রায়শই আমার এমএস এসকিউএল সার্ভার ডেটাবেসগুলি জিজ্ঞাসা করার সময়, আমাকে একটি গণনা ক্ষেত্র তৈরি করা প্রয়োজন, যেমন

(CASE WHEN A.type = 'Workover' THEN 'Workover' 
      ELSE (CASE WHEN substring(C.category, 2, 1) = 'D' THEN 'Drilling' 
                 WHEN substring(C.category, 2, 1) = 'C' THEN 'Completion' 
                 WHEN substring(C.category, 2, 1) = 'W' THEN 'Workover' 
                 ELSE 'Other' 
            END)
END)

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

উত্তর:


13

আমার নির্বাচন এবং গ্রুপ উভয় পক্ষেই একই গণনা রয়েছে। এসকিউএল সার্ভারটি আসলে এই গণনাগুলি দু'বার সম্পাদন করছে বা এটি কেবল একবার একবার করার জন্য যথেষ্ট স্মার্ট?

সহজ উত্তরটি হ'ল এসকিউএল সার্ভার কখন এবং কখন কতবার স্ক্যালার এক্সপ্রেশনটি কার্যকর করা যায় তা সম্পর্কে কোনও সাধারণ গ্যারান্টি দেয় না।

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

স্ক্যালারের বিবরণ গণনা করুন

এর আগে আমি যে আচরণগুলির প্রতি ইঙ্গিত দিয়েছিলাম তার মধ্যে একটির বিবরণ প্রকাশের পিছিয়ে দেওয়া কার্যকর করা। আমি এই ব্লগ পোস্টে অন্যান্য কিছু বর্তমান আচরণ (যা যে কোনও সময় পরিবর্তন করতে পারে) সম্পর্কে লিখেছিলাম ।

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

খুব সাধারণ অভিব্যক্তির জন্য, সম্ভবত বেশিরভাগ ক্ষেত্রে অভিব্যক্তিটি একবারে বা বহুবার মূল্যায়ন করা হয় কিনা তা খুব বেশি পার্থক্য করে না। এটি বলেছিল, আমি বৃহত্তর প্রশ্নের মুখোমুখি হয়েছি যেখানে এক্সপ্রেশনটি খুব বেশি সংখ্যক বার মূল্যায়ন করা হয় বা কর্মদক্ষতার উপর বিরূপ প্রভাব পড়েছিল, বা মূল্যায়নটি একক থ্রেডে ঘটে যেখানে এটি কার্যকর করার সমান্তরাল শাখায় মূল্যায়ন করা সুবিধাজনক হত পরিকল্পনা।

সংক্ষেপে, বর্তমানের আচরণটি সংজ্ঞায়িত, এবং কী ঘটেছে তা নির্ধারণ করার জন্য মৃত্যুদণ্ড কার্যকর করার পরিকল্পনার তেমন কিছুই নেই (এবং ব্লগ পোস্টের মতো, ইঞ্জিনের বিশদ আচরণগুলি পরীক্ষা করার জন্য কোনও ডিবাগার সংযুক্ত করা সবসময় সুবিধাজনক হবে না)।

যদি আপনি এমন কেসগুলির মুখোমুখি হন যেখানে স্কেলার মূল্যায়নগুলি কার্য সম্পাদনের ক্ষেত্রে গুরুত্বপূর্ণ হয় তবে মাইক্রোসফ্ট সাপোর্টের সাথে বিষয়টি উত্থাপন করুন। পণ্যের ভবিষ্যতের সংস্করণগুলিকে উন্নত করতে প্রতিক্রিয়া জানাতে এই সর্বোত্তম উপায়।


3

আপনার প্রশ্নের মতামত অনুযায়ী, উত্তরটি (আমার অভিজ্ঞতায়, কমপক্ষে) "হ্যাঁ"। পুনরায় গণনা এড়াতে সাধারণত এসকিউএল সার্ভার যথেষ্ট স্মার্ট। আপনি সম্ভবত এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওর মধ্যে থেকে এক্সিকিউশন প্ল্যানটি দেখিয়ে এটি যাচাই করতে পারেন। প্রতিটি গণনা করা ক্ষেত্র নির্ধারিত হয় Exprxxxxx(যেখানে xxxxx একটি সংখ্যা)। আপনি যদি সন্ধান করতে চান তবে আপনি এটি যাচাই করতে সক্ষম হবেন যে এটি একই অভিব্যক্তিটি ব্যবহার করে।

আলোচনায় যুক্ত করতে, আপনার অন্যান্য নান্দনিক বিকল্পটি সাধারণ টেবিলের মত প্রকাশ :

with [cte] as
(
    select
        (case when a.type = 'workover' then 'workover' else 
        (case when substring(c.category, 2, 1) = 'd' then 'drilling'
              when substring(c.category, 2, 1) = 'c' then 'completion'
              when substring(c.category, 2, 1) = 'w' then 'workover'
              else 'other' end)
         end)) as [group_key],
         *
    from
        [some_table]
)
select
    [group_key],
    count(*) as [count]
from
    [cte]
group by
    [group_key]

সংক্ষিপ্ত উত্তর, এগুলি দেখার জন্য কার্যত অভিন্ন, তবে কেবলমাত্র পরবর্তী বিবৃতিতে ব্যবহারের জন্য বৈধ। আমি তাদের উত্সযুক্ত টেবিলগুলির বেশিরভাগই পঠনযোগ্য বিকল্প হিসাবে দেখি কারণ এটি বাসা বাঁধে।

যদিও এই প্রশ্নের সাথে প্রাসঙ্গিক নয়, তারা নিজেরাই রেফারেন্স করতে পারে এবং সেভাবে পুনরাবৃত্ত অনুসন্ধানগুলি তৈরি করতে ব্যবহার করা যেতে পারে।


@ কিউক জো স্মিথ: আমি মনে করব আপনি এক্সপ্রেক্সিক্সএক্সএক্সএক্সএক্স সম্পর্কে সঠিক, কারণ আমি এটিও দেখেছি। যাইহোক, আমি যদি অভিব্যক্তিকে ম্যানুয়ালি (কেস ... শেষ) অপটিপ হিসাবে কোনও নাম দিয়ে থাকি, তবে গ্রুপ বা গ্রুপের মাধ্যমে অপ্ট টাইপ ক্ষেত্রটি ব্যবহার করুন, আমি একটি ত্রুটি পেয়েছি এটি একটি অবৈধ কলামের নাম।
ডাঃ ড্রু

দুর্ভাগ্যক্রমে, প্রায়শই আপনার দু'বার অভিব্যক্তিটি নির্দিষ্ট করার একমাত্র উপায় হ'ল উপরের পদ্ধতিগুলির মধ্যে একটি: একটি সিটিই, দেখুন বা নেস্টেড কোয়েরি।
কুই জো স্মিথ

2
ক্রস প্রয়োগের বিষয়ে আপনি যদি না জানেন তবে ।
অ্যান্ড্রি এম

cross applyএই ক্ষেত্রে ব্যবহার করা কিছুটা প্রসারিত, এবং অকারণে স্ব-যোগদানের পরিচয় দিয়ে এটি সম্ভবত কার্য সম্পাদনকে ক্ষতিগ্রস্থ করবে।
কুই জো স্মিথ

2
আমি মনে করি না আপনি পরামর্শটি "পেয়েছেন"। CROSS APPLYঠিক একই সারিতে কলাম থেকে ওরফে সংজ্ঞায়িত করে। যোগদানের দরকার নেই। উদাহরণস্বরূপSELECT COUNT(*), hilo FROM master..spt_values CROSS APPLY (VALUES(high + low)) V(hilo) GROUP BY hilo
মার্টিন স্মিথ

1

পারফরম্যান্স শুধুমাত্র একটি দিক। অন্যটি রক্ষণাবেক্ষণযোগ্যতা।

ব্যক্তিগতভাবে, আমি নিম্নলিখিত করতে ঝোঁক:

SELECT T.GroupingKey, SUM(T.value)
FROM
(
    SELECT 
        A.*
        (CASE WHEN A.type = 'Workover' THEN 'Workover' ELSE 
        (CASE WHEN substring(C.category, 2, 1) = 'D' THEN 'Drilling' WHEN substring(C.category, 2, 1) = 'C' THEN 'Completion' WHEN substring(C.category, 2, 1) = 'W' THEN 'Workover' ELSE 'Other' END)
        END) AS GroupingKey
    FROM Table AS A
) AS T

GROUP BY T.GroupingKey

হালনাগাদ:

যদি আপনি বাসা বাঁধতে পছন্দ করেন না, তবে প্রতিটি টেবিলে যেখানে আপনি জটিল অভিব্যক্তি ব্যবহার করা দরকার সেখানে আপনি ভিউ তৈরি করতে পারেন।

CREATE VIEW TableExtended
AS 
SELECT 
    A.*
    (CASE WHEN A.type = 'Workover' THEN 'Workover' ELSE 
    (CASE WHEN substring(C.category, 2, 1) = 'D' THEN 'Drilling' WHEN substring(C.category, 2, 1) = 'C' THEN 'Completion' WHEN substring(C.category, 2, 1) = 'W' THEN 'Workover' ELSE 'Other' END)
    END) AS GroupingKey
FROM Table AS A

তারপরে আপনি অতিরিক্ত বাসা বাঁধে না করে সিলেক্ট করতে পারবেন;

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