প্রাথমিক কীতে স্ব-যোগদান করুন


9

Nস্ব-যোগদানের সমন্বিত এই কোয়েরিটি বিবেচনা করুন :

select
    t1.*
from [Table] as t1
join [Table] as t2 on
    t1.Id = t2.Id
-- ...
join [Table] as tN on
    t1.Id = tN.Id

এটি এন ক্লাস্টারড ইনডেক্স স্ক্যানগুলির সাথে একটি কার্যকরকরণ পরিকল্পনা তৈরি করে এবং এন -1 সংযুক্ত হয়ে যোগদান করে।

সত্যিই, আমি সমস্ত যোগদানগুলিকে অপ্টিমাইজ করার জন্য এবং কেবল একটি ক্লাস্টারড ইনডেক্স স্ক্যান করার কোনও কারণ দেখতে পাচ্ছি না, অর্থাৎ এটিতে মূল কোয়েরিটি অনুকূলিত করুন:

select
    t1.*
from [Table] as t1

প্রশ্নাবলি

  • যোগদান কেন অপ্টিমাইজড হয় না?
  • এটা কি গাণিতিকভাবে ভুল যে প্রতিটি যোগদানের ফলাফল সেট পরিবর্তন হয় না?

পরীক্ষিত:

  • উত্স সার্ভার সংস্করণ: এসকিউএল সার্ভার 2014 (12.0.4213)
  • উত্স ডাটাবেস ইঞ্জিন সংস্করণ: মাইক্রোসফ্ট এসকিউএল সার্ভার স্ট্যান্ডার্ড সংস্করণ
  • উত্স ডাটাবেস ইঞ্জিনের প্রকার: স্ট্যান্ডেলোন এসকিউএল সার্ভার
  • সামঞ্জস্যতা স্তর: এসকিউএল সার্ভার ২০০৮ (১০০)

ক্যোয়ারী অর্থবহ নয়; এটি আমার মনে আসল এবং আমি এখন এটি সম্পর্কে আগ্রহী।

এখানে বেহালার সঙ্গে টেবিল সৃষ্টি এবং 3 প্রশ্নের সঙ্গে inner join'দিয়ে এস, left joinগুলি ও মিশ্র। আপনি সেখানে কার্যকর করার পরিকল্পনাটিও দেখতে পারেন।

দেখে মনে হয় যে left joinফলাফলগুলি কার্যকর করার পরিকল্পনায় গুলিগুলি সরানো হয়েছে যখন inner joinনা হয়। এখনও কেন পাবেন না ।

উত্তর:


18

প্রথমে ধরে নেওয়া যাক (id)এটি টেবিলের প্রাথমিক কী key এই ক্ষেত্রে, হ্যাঁ, যোগগুলি (প্রমাণিত হতে পারে) অপ্রয়োজনীয় এবং নির্মূল করা যেতে পারে।

এখন এটি কেবল তত্ত্ব - বা গণিত। অপ্টিমাইজারটি প্রকৃত নির্মূলকরণের জন্য, তত্ত্বটি কোডে রূপান্তরিত করতে হবে এবং অপ্টিমাইজারের পুনরায় লেখা / অপসারণের অপ্টিমাইজারের স্যুটে যুক্ত করতে হবে। এটি হওয়ার জন্য, (ডিবিএমএস) বিকাশকারীদের অবশ্যই ভাবতে হবে যে এটির দক্ষতার ভাল সুবিধা হবে এবং এটি সাধারণ একটি সাধারণ ঘটনা।

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

এটি বলেছিল, এখানে অনুরূপ প্রশ্ন রয়েছে যেখানে নির্মূলকরণ ঘটে। রব ফারলে একটি খুব সুন্দর সম্পর্কিত ব্লগ পোস্ট আছে: এসকিউএল সার্ভারে সরলকরণ

আমাদের ক্ষেত্রে, যোগদানের পরিবর্তনে আমাদের যা করতে হবে তা যোগ LEFTদেয়। Dbfiddle.uk দেখুন । এই ক্ষেত্রে অপটিমাইজার জানে যে যোগদানটি সম্ভবত ফলাফলগুলি পরিবর্তন না করে নিরাপদে সরিয়ে নেওয়া যেতে পারে। (সরলকরণের যুক্তিটি বেশ সাধারণ এবং স্ব-যোগদানের জন্য এটি বিশেষ-বিশেষ নয়))

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

ALTER TABLE "Table"
    ADD FOREIGN KEY (id) REFERENCES "Table" (id) ;

এবং ভয়েলা, যোগগুলি মুছে যায়! (একই ফিডলে পরীক্ষিত): এখানে

create table docs
(id int identity primary key,
 doc varchar(64)
) ;
GO
insert
into docs (doc)
values ('Enter one batch per field, don''t use ''GO''')
     , ('Fields grow as you type')
     , ('Use the [+] buttons to add more')
     , ('See examples below for advanced usage')
  ;
GO
4 টি সারি প্রভাবিত
--------------------------------------------------------------------------------
-- Or use XML to see the visual representation, thanks to Justin Pealing and
-- his library: https://github.com/JustinPealing/html-query-plan
--------------------------------------------------------------------------------
set statistics xml on;
select d1.* from docs d1 
    join docs d2 on d2.id=d1.id
    join docs d3 on d3.id=d1.id
    join docs d4 on d4.id=d1.id;
set statistics xml off;
GO
আইডি | ডক                                      
-: | : ----------------------------------------
 1 | মাঠের জন্য একটি ব্যাচ প্রবেশ করুন, 'যান' ব্যবহার করবেন না
 2 | আপনার টাইপ করার সাথে সাথে ক্ষেত্রগুলি বৃদ্ধি পায়                  
 3 | আরও যোগ করতে [+] বোতাম ব্যবহার করুন          
 4 | উন্নত ব্যবহারের জন্য নীচের উদাহরণগুলি দেখুন    

এখানে চিত্র বর্ণনা লিখুন

--------------------------------------------------------------------------------
-- Or use XML to see the visual representation, thanks to Justin Pealing and
-- his library: https://github.com/JustinPealing/html-query-plan
--------------------------------------------------------------------------------
set statistics xml on;
select d1.* from docs d1 
    left join docs d2 on d2.id=d1.id
    left join docs d3 on d3.id=d1.id
    left join docs d4 on d4.id=d1.id;
set statistics xml off;
GO
আইডি | ডক                                      
-: | : ----------------------------------------
 1 | মাঠের জন্য একটি ব্যাচ প্রবেশ করুন, 'যান' ব্যবহার করবেন না
 2 | আপনার টাইপ করার সাথে সাথে ক্ষেত্রগুলি বৃদ্ধি পায়                  
 3 | আরও যোগ করতে [+] বোতাম ব্যবহার করুন          
 4 | উন্নত ব্যবহারের জন্য নীচের উদাহরণগুলি দেখুন    

এখানে চিত্র বর্ণনা লিখুন

alter table docs
  add foreign key (id) references docs (id) ;
GO
--------------------------------------------------------------------------------
-- Or use XML to see the visual representation, thanks to Justin Pealing and
-- his library: https://github.com/JustinPealing/html-query-plan
--------------------------------------------------------------------------------
set statistics xml on;
select d1.* from docs d1 
    join docs d2 on d2.id=d1.id
    join docs d3 on d3.id=d1.id
    join docs d4 on d4.id=d1.id;
set statistics xml off;
GO
আইডি | ডক                                      
-: | : ----------------------------------------
 1 | মাঠের জন্য একটি ব্যাচ প্রবেশ করুন, 'যান' ব্যবহার করবেন না
 2 | আপনার টাইপ করার সাথে সাথে ক্ষেত্রগুলি বৃদ্ধি পায়                  
 3 | আরও যোগ করতে [+] বোতাম ব্যবহার করুন          
 4 | উন্নত ব্যবহারের জন্য নীচের উদাহরণগুলি দেখুন    

এখানে চিত্র বর্ণনা লিখুন


2

আপেক্ষিক পদগুলিতে অ্যাট্রিবিউট নাম পরিবর্তন ব্যতীত যে কোনও স্ব স্ব যোগদানের বিষয়টি কোনও অপ-অপশন নয় এবং কার্যকরভাবে কার্যকর করার পরিকল্পনা থেকে বাদ দেওয়া যায়। দুর্ভাগ্যক্রমে এসকিউএল সম্পর্কযুক্ত নয় এবং পরিস্থিতি যেখানে অপ্টিমাইজারের মাধ্যমে স্ব-যোগদানের বিষয়টি নির্মূল করা যায় তা সংখ্যার প্রান্তের ক্ষেত্রে সীমাবদ্ধ।

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


1

প্রাথমিক কীগুলি সর্বদা স্বতন্ত্র এবং নাল মানগুলি অনুমোদিত হয় না তাই প্রাথমিক কীগুলিতে নিজের কাছে কোনও টেবিলে যোগদানের (স্ব-রেফারেন্সিং গৌণ কী দিয়ে নয় যেখানে কোনও বিবৃতি নেই) মূল টেবিলের মতো একই সংখ্যক সারি তৈরি করবে।

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

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