ওয়ান বনাম WHERE তে সূচক পারফরম্যান্স


26

আমার দুটি টেবিল আছে

@T1 TABLE
(
    Id INT,
    Date DATETIME
)

@T2 TABLE
(
    Id INT,
    Date DATETIME
)

এই টেবিলগুলির একটি ক্লাস্টারযুক্ত সূচি নেই (আইডি, তারিখ)

এবং আমি এই টেবিলগুলিতে যোগদান করি

SELECT *
FROM T1 AS t1
INNER JOIN T2 AS t2
ON 
    t1.Id = t2.Id
WHERE 
    t1.Date <= GETDATE()
    AND
    t2.Date <= GETDATE()

এটি হিসাবে লেখা যেতে পারে

SELECT *
FROM T1 AS t1
INNER JOIN T2 AS t2
ON 
    t1.Id = t2.Id
    AND
    t1.Date <= GETDATE()
    AND
    t2.Date <= GETDATE()

আমার প্রশ্ন, এই দুটি প্রশ্নের মধ্যে কোনটি আরও ভাল পারফরম্যান্স দেয় এবং কেন? না তারা সমান?


1
আপনি কি সত্যিই একটি @table একটি সঙ্গে variabled আছে অ ক্লাস্টার সূচক যে কভার সব ক্ষেত্র, এবং কোন ক্লাস্টার সূচক? নাকি কেবল সরলীকরণ?
রিমাস রুসানু

1
এটি একটি চরম
সরলকরণ

উত্তর:


32

পারফরম্যান্স একই হবে। অপ্টিমাইজার এটিকে সনাক্ত করবে এবং একই পরিকল্পনা তৈরি করবে।

অন্যদিকে আমি বলব না যে তারা সমান। প্রশ্নের প্রথম ফর্মটি অনেক বেশি পাঠযোগ্য এবং সাধারণত প্রত্যাশিত।

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

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

SELECT * FROM salestable , custtable 
WHERE salestable.custaccount = custtable.accountnum 
AND salestable.dataareaid = custtable.dataareaid

SELECT * FROM salestable 
JOIN  custtable 
ON salestable.custaccount = custtable.accountnum 
AND salestable.dataareaid = custtable.dataareaid

SELECT * FROM salestable JOIN custtable 
ON salestable.custaccount = custtable.accountnum 
WHERE salestable.dataareaid = custtable.dataareaid

এই কার্যকর করার পরিকল্পনা দেয়

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


আমি সম্মত, প্রথম ফর্মটি পড়া সহজ এবং আমি এইভাবে স্বস্তি পেয়েছি যে তারা সমান। আমি কেবল ভবিষ্যতে এই ফর্মটি ব্যবহার করব।
এরিক বার্গস্টেট

@ এরিকবার্গস্টেটেড আমি আমার উত্তরটি সম্পাদনা করেছি, যখন আপনি মৃত্যুদন্ড কার্যকর করার পরিকল্পনাগুলি দেখেন তখন আপনার নিজের ডেটাसेट এবং টেবিল কাঠামোর জন্য এটি যথাযথভাবে যাচাই করতে সক্ষম হবেন
টম ভি - টিম মনিকা

হ্যা, আমি করেছিলাম. ধন্যবাদ. আমি বিদ্যমান কোন উত্তর খুঁজে না পাওয়ায় আমি কেবল ২ য় মতামত খুঁজছিলাম।
এরিক বার্গস্টেট

দ্রষ্টব্য: যদি এটি হয় তবে তারা কেবল সমান INNER JOIN। আপনি যদি একটি OUTER JOINভিতরে ফেলে দেন তবে সেগুলি স্থিরভাবে একই হয় না।
কেনেথ ফিশার

22

তারা শব্দার্থগতভাবে অভিন্ন এবং আশাবাদী এই সত্যটি সনাক্ত করতে এবং অভিন্ন পরিকল্পনা তৈরি করতে কোনও সমস্যা হওয়া উচিত নয়।

আমি শর্তাবলী উভয় টেবিল ONরেফারেন্সিং শর্তাবলী এবং শর্তাবলী শুধুমাত্র একটি টেবিল রেফারেন্সিং প্রবণতা WHERE

জন্য OUTER JOINSশর্ত চলন্ত তবে শব্দার্থবিদ্যা প্রভাবিত করতে পারে।


7

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

WHERE table1.begindate >= @startdate AND table1.enddate < @enddate 

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


2
আপনি কি আরও বিশদ যুক্ত করতে পারেন - সম্ভবত সম্পাদনের পরিকল্পনার ডায়াগ্রামের স্ক্রিনশটগুলি - যেমন আপনার উত্তরটি অন্য সকলের সাথে বিরোধিতা করে বলে মনে হচ্ছে?
কেনি এভিট

2
পরিকল্পনাটি কী একটি অপ্টিমাইজারের সময়সীমা দেখিয়েছে?
মার্টিন স্মিথ

কীভাবে সিপিইউ লোডটি প্রায় 100% এরও বেশি কমে যেতে পারে?
মাইকেল গ্রিন

2

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

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

মাঝে মাঝে এসকিউএল বিকাশকারীকে যেখানে যেখানে ক্লজটিতে ফিল্টারগুলি স্পট করা যায় তার পক্ষে কিছুটা সহজ, তবে আমি কয়েকটি বড় টেবিলের উপর কাজ করেছি যেখানে ওপেন ক্লজে ফিল্টারগুলি চালনার সময় ছাড়িয়ে কয়েক ঘন্টা বেরিয়ে যায়।

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


1

সাধারণ পরিস্থিতিতে ফিল্টার শর্তগুলি WHERE বা JOIN ক্লজগুলিতে নির্দিষ্ট করা যেতে পারে। আমি যেখানে যোগ না দিয়ে অগ্রণীতাকে প্রভাবিত করতে না পারি (নীচে দেখুন) বা ফিল্টারটি যদি সেই টেবিলের সাথে খুব নির্দিষ্ট থাকে (যেমন, টেবিলের সারিগুলির একটি নির্দিষ্ট উপসেট নির্দিষ্ট করার জন্য TYPE = 12) তবে ফিল্টারগুলি WHERE এর অধীনে রাখি।

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

আপনি যদি OUTER ব্যবহার করে থাকেন তবে এটি একটি বিরাট পরিমাণে পার্থক্য করতে পারে। উদাহরণস্বরূপ, আপনি দুটি সারণির (টি 1 এবং টি 2) এর মধ্যে একটি বাহ্যিক যোগ নির্দিষ্ট করে থাকেন তবে তারপরে, যেখানে সারণিতে, সারণির (যেমন t1.col = t2.col) মধ্যে একটি ইজিজোয়েন সম্পর্ক নির্দিষ্ট করতে যান, আপনার ঠিক আছে OUTER join এ INNER join এ রূপান্তর করুন! এটি হ'ল কারণ যেখানে একটি ওয়ান ক্লজটি ব্যবহার না করে ইক্যুইজন (বা সম্ভবত এমনকি আউটর জয়েন, সংস্করণের উপর নির্ভর করে অবহেলিত * = সিনট্যাক্স ব্যবহার করে) নির্দিষ্ট করতে ব্যবহার করা যেতে পারে, এবং যখন টেবিলগুলির মধ্যে একটি অভ্যন্তরীণ সমতা নির্দেশ করে, তখন এটি একটি আউটরাইডকে ওভাররাইড করে যোগ দিন (উপস্থিত থাকলে)

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


-1

অভ্যন্তরীণ যোগদানের সাথে এটি একটি স্টাইল ইস্যু।

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

OUTER JOIN dbo.x ON a.ID = x.ID ... WHERE x.SomeField IS NOT NULL

হিসাবে একই

INNER JOIN dbo.x ON a.ID = x.ID AND x.SomeField IS NOT NULL

8
ফলাফলটি যদি পৃথক হয় (যা এটি অবশ্যই) তবে পারফরম্যান্সের তুলনা করার বিষয়টি কী?
ypercubeᵀᴹ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.