সাধারণ টেবিল এক্সপ্রেশন (সিটিই) সুবিধা?


21

এমএসডিএন থেকে :

উত্পন্ন টেবিলের বিপরীতে, একটি সিটিই স্ব-উল্লেখযোগ্য হতে পারে এবং একই ক্যোয়ারিতে একাধিকবার উল্লেখ করা যেতে পারে।

আমি সিটিইগুলি বেশ ব্যবহার করছি তবে এগুলি ব্যবহারের সুবিধা সম্পর্কে আমি গভীরভাবে চিন্তাও করি না।

যদি আমি একই ক্যোয়ারিতে কোনও সিটিই একাধিকবার উল্লেখ করি:

  • কোন কার্যকারিতা সুবিধা আছে?
  • যদি আমি স্ব-যোগদান করি, তবে এসকিউএল সার্ভার লক্ষ্য টেবিলগুলি দু'বার স্ক্যান করবে?

2
এটি দুবার স্ক্যান করে কিনা তা প্রোফাইলার আপনাকে জানাতে হবে। আইএমএইচও, সিটিই'র পুনরাবৃত্তির জন্য দুর্দান্ত।
ড্যান অ্যান্ড্রুজ

3
ক্যোয়ারী অপ্টিমাইজার প্লে করার সময় কোনও শক্ত উত্তর নেই। কিছু প্রশ্নগুলি পারফরম্যান্স সুবিধাগুলি দেখবে, কিছু না। কখনও কখনও সিটিইর পরিবর্তে একটি টেম্প টেবিল ব্যবহার করা আরও দ্রুত হবে, কখনও কখনও তা হবে না।

উত্তর:


25

একটি নিয়ম হিসাবে, একটি সিটিই কর্মক্ষমতা উন্নত করবে না

একটি সিটিই মূলত একটি নিষ্পত্তিযোগ্য ভিউ। কোনও অতিরিক্ত পরিসংখ্যান নেই, কোনও সূচিপত্র ইত্যাদি নেই It এটি একটি সাবকিউয়ের শর্টহ্যান্ড হিসাবে কাজ করে।

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


3
একমত। রিকার্সিভ সিটিই ব্যতীত তারা কেবল পাঠযোগ্যতার জন্য সহায়তা করে
জিবিএন

সিটিই যদি কেবল কয়েকটি সারি ফেরত দেয় (যাতে তাদের স্মৃতিতে রাখা যেতে পারে) যা গণনা করার জন্য ব্যয়বহুল (বৃহত টেবিলে একত্রিতকরণ) এবং সেই ফলাফলটি একাধিকবার ব্যবহৃত হয়? যে কর্মক্ষমতা উন্নত করা উচিত, তাই না? (কমপক্ষে পোস্টগ্র্রেএসকিউএল এবং ওরাকল নিয়ে আমার অভিজ্ঞতা যেখানে টেম্প টেবিল খুব কম ব্যবহার করা হয়)
a_horse_with_no_name

2
@ এ_হর্স_বিহীন_নাম_নাম - এটি কেবল এটিকে সাবকিউরি তৈরির সমতুল্য হবে। যদি ফলাফলটি একক কোয়েরিতে একাধিকবার ব্যবহৃত হয়, তবে এটি পুনরায় ব্যবহার করা হবে এবং পুনরায় গণনা করা হবে না। যদি এটি একাধিক ক্যোয়ারিতে ব্যবহৃত হয়, তবে CTEএগুলি একটি খারাপ পছন্দ, যেহেতু প্রথম ক্যোয়ারির পরে ফলাফলগুলি বাতিল করা হয়।
জেএনকে

@ জেএনকে: ধন্যবাদ মনে হয় এসকিউএল সার্ভার এখানে অন্যরকম আচরণ করে।
a_horse_with_no_name

কিছু মানুষ কোটে এর আরো কিছু বিশেষ পরিস্থিতির FWIW মধ্যে পাঠযোগ্য এটি stackoverflow.com/a/11170918/32453
rogerdpack

14

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

;WITH Conferences (Conference_id)
AS 
(select  m.Conference_id
FROM mydb.dbo.Conference m 
WHERE client_id = 10
    and Conference_id in 
            (select Conference_id from mydb.dbo.Expense 
            where amount <>0
            and amount is not null)
     )
--select * from Conferences
,MealEaters(NumberMealEaters, Conference_id, AttendeeType)
AS
(Select count(*) as NumberMealEaters, m.Conference_id,  AttendeeType 
from mydb.dbo.attendance ma 
join Conferences m on m.Conference_id = ma.Conference_id
where (ma.meals_consumed>0 or meals_consumed is null)and attended = 1
group by m.Conference_id)
--select * from MealEaters

,Expenses (Conference_id,expense_date, expenseDescription,  RecordIdentifier,amount)
AS
(select Conference_id,max(expense_date) as Expense_date, expenseDescription,  RecordIdentifier,sum(amount) as amount
    FROM
        (SELECT Conference_id,expense_date,  amount, RecordIdentifier
        FROM mydb.dbo.Expense
        WHERE  amount <> 0 
            and Conference_id IN 
            (SELECT  Conference_id
            FROM mydb.dbo.Conferences ) 
        group by Conference_id, RecordIdentifier) a
)
--select * from Expenses
Select m.Conference_id,me.NumberMealEaters, me.AttendeeType, e.expense_date,         e.RecordIdentifier,amount
from Conferences m
join mealeaters me on m.Conference_id = me.Conference_id
join expenses e on e.Conference_id = m.Conference_id

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


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

আমি উদাহরণ হিসাবে ব্যবহার করেছি কারণ এগুলি সাধারণত এখানে সবচেয়ে জটিল
এইচএলজিইএম

সম্ভাব্যরূপে আরও ভাল পারফরম্যান্সের জন্য +1 কখনও কখনও আরও লজিক্যাল (মানব পাঠযোগ্য) ক্যোয়ারী পছন্দ হয়।
onedaywhen

হ্যাঁ। একটি সিটিই সাধারণত একই ফলস্বরূপ পরিকল্পনা তৈরি করে দেয়, আমি ভয়াবহভাবে বাসা বাঁধে, বহু-subquery monstrosities তৈরি করার কোন কারণ দেখতে পাচ্ছি না - যখন আমরা পরিবর্তে প্রতিটি উপাদান তাদের প্রয়োজনীয় ক্রম অনুসারে দৃশ্যের বাইরে রেখে দিতে পারি। আমি এক্সএমএল ফাইলগুলি আমদানি করি এবং ডেটাটি সঠিক ফর্মটিতে আনতে বিভিন্ন অ্যাক্রোব্যাটিক্স করি, যা সিটিইগুলি ছাড়াই লেখা / পড়া অসহনীয়। (আমার কিছু পুরানো কোডের সম্ভবত চতুর্দিকে ভয়ঙ্কর উপশক্তি রয়েছে!)
আন্ডারস্কোর_২৯

0

সর্বদা এটি নির্ভর করে তবে এমন কিছু ঘটনা রয়েছে যেখানে পারফরম্যান্সের ব্যাপক উন্নতি হয়। আমি এটি নির্বাচনের জন্য একটি সিটিই ব্যবহার করুন এবং তারপরে INSERT INTO এ ব্যবহার করুন যেখানে নির্বাচন সুনির্দিষ্ট বিবৃতি সহ এটি দেখতে পাচ্ছি। এটি ডাটাবেসের জন্য আরসিএসআই চালু হওয়ার সাথে থাকতে পারে তবে সেই সময়গুলির জন্য যখন খুব কম নির্বাচিত হয় এটি বেশ কিছুটা সাহায্য করতে পারে।

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