আমি কি এসকিউএল যোগ বা ক্লোজ ইন ব্যবহার করা উচিত?


13

আমার সেরা পদ্ধতির বিষয়ে একটি প্রশ্ন আছে। যখন ডেটা আকারে পরিবর্তনশীল হিসাবে বিবেচনা করা হয় তখন কোন পদ্ধতিটি সেরা তা আমি নিশ্চিত নই।

নিম্নলিখিত 3 টেবিল বিবেচনা করুন:

কর্মচারী

EMPLOYEE_ID, EMP_NAME

প্রকল্প

PROJECT_ID, PROJ_NAME

EMP_PROJ (উপরের দুটি টেবিলের অনেকের কাছে)

EMPLOYEE_ID, PROJECT_ID

সমস্যা : একজন কর্মচারী দেওয়া, সমস্ত প্রকল্পের সমস্ত কর্মচারীর সন্ধান করুন যা এই কর্মচারীর সাথে জড়িত।

আমি এটি দুটি উপায়ে চেষ্টা করেছি .. উভয় পন্থা মাত্র কয়েক মিলি সেকেন্ডের দ্বারা পৃথক হয় যা আকারের ডেটা ব্যবহার করা যায় না।

SELECT EMP_NAME FROM EMPLOYEE
WHERE EMPLOYEE_ID IN (
    SELECT EMPLOYEE_ID FROM EMP_PROJ    
    WHERE PROJECT_ID IN (
        SELECT PROJECT_ID FROM EMP_PROJ p, EMPLOYEE e
        WHERE p.EMPLOYEE_ID = E.EMPLOYEE_ID 
        AND  E.EMPLOYEE_ID = 123)

যাওয়া

select c.EMP_NAME FROM
(SELECT PROJECT_ID FROM EMP_PROJ
WHERE EMPLOYEE_ID = 123) a
JOIN 
EMP_PROJ b
ON a.PROJECT_ID = b.PROJECT_ID
JOIN 
EMPLOYEE c
ON b.EMPLOYEE_ID = c.EMPLOYEE_ID

এখন অবধি, আমি প্রত্যেকে প্রায় 5000 কর্মচারী এবং প্রকল্প প্রত্যাশা করছি .. তবে বহু সম্পর্ক কতটা বিদ্যমান তা সম্পর্কে কোনও ধারণা নেই। আপনি কোন পদ্ধতির সুপারিশ করবেন? ধন্যবাদ!

সম্পাদনা: এক্সিকিউশন পরিকল্পনা কার্যকর করার পরিকল্পনা 1

"Hash Join  (cost=86.55..106.11 rows=200 width=98)"
"  Hash Cond: (employee.employee_id = emp_proj.employee_id)"
"  ->  Seq Scan on employee  (cost=0.00..16.10 rows=610 width=102)"
"  ->  Hash  (cost=85.07..85.07 rows=118 width=4)"
"        ->  HashAggregate  (cost=83.89..85.07 rows=118 width=4)"
"              ->  Hash Semi Join  (cost=45.27..83.60 rows=118 width=4)"
"                    Hash Cond: (emp_proj.project_id = p.project_id)"
"                    ->  Seq Scan on emp_proj  (cost=0.00..31.40 rows=2140 width=8)"
"                    ->  Hash  (cost=45.13..45.13 rows=11 width=4)"
"                          ->  Nested Loop  (cost=0.00..45.13 rows=11 width=4)"
"                                ->  Index Scan using employee_pkey on employee e  (cost=0.00..8.27 rows=1 width=4)"
"                                      Index Cond: (employee_id = 123)"
"                                ->  Seq Scan on emp_proj p  (cost=0.00..36.75 rows=11 width=8)"
"                                      Filter: (p.employee_id = 123)"

পদ্ধতির কার্যকরকরণ পরিকল্পনা 2:

"Nested Loop  (cost=60.61..112.29 rows=118 width=98)"
"  ->  Index Scan using employee_pkey on employee e  (cost=0.00..8.27 rows=1 width=4)"
"        Index Cond: (employee_id = 123)"
"  ->  Hash Join  (cost=60.61..102.84 rows=118 width=102)"
"        Hash Cond: (b.employee_id = c.employee_id)"
"        ->  Hash Join  (cost=36.89..77.49 rows=118 width=8)"
"              Hash Cond: (b.project_id = p.project_id)"
"              ->  Seq Scan on emp_proj b  (cost=0.00..31.40 rows=2140 width=8)"
"              ->  Hash  (cost=36.75..36.75 rows=11 width=8)"
"                    ->  Seq Scan on emp_proj p  (cost=0.00..36.75 rows=11 width=8)"
"                          Filter: (employee_id = 123)"
"        ->  Hash  (cost=16.10..16.10 rows=610 width=102)"
"              ->  Seq Scan on employee c  (cost=0.00..16.10 rows=610 width=102)"

দেখে মনে হচ্ছে অ্যাপ্রোচ 2 এর এক্সিকিউশন প্ল্যানটি কিছুটা ভাল, কারণ 'ব্যয়' 85 টি পদ্ধতির 85 এর বিপরীতে 60 হয় 1. এটি কি এটি বিশ্লেষণ করার সঠিক উপায়?

কীভাবে কেউ জানতে পারে যে এটি বহু ধরণের বহু সংমিশ্রণের ক্ষেত্রেও সত্য হয়ে উঠবে?


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

আমি জিজিলার সাথে একমত: explain analyzeপরিকল্পনার মধ্যে আরও পার্থক্য প্রকাশ করতে পারে
a_horse_with_no_name

উত্তর:


14

এসকিউএল সার্ভারে, "সেই ক্ষেত্রগুলি NULLs ধারণ করতে পারে না" এর মতো কয়েকটি অনুমান সহ, এই প্রশ্নের প্রায় একই পরিকল্পনা দেওয়া উচিত।

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


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

6
@ গ্রম্পিমনকি - এসকিউএল সার্ভার ২০০৫+ এ INএবং EXISTSসর্বদা আমার অভিজ্ঞতাতে একই পরিকল্পনা দিন। NOT INএবং পছন্দের NOT EXISTSসাথে তবে আলাদা NOT EXISTS- কিছু পারফরম্যান্সের তুলনা এখানে
মার্টিন স্মিথ

8

আপনার জিজ্ঞাসাটি যা সন্ধান করছে তা ন্যায়সঙ্গত

SELECT EMP_NAME 
FROM EMPLOYEE e
WHERE E.EMPLOYEE_ID = 123
and exists (select * from EMP_PROJ  where  EMPLOYEE_ID = 123);

অথবা

SELECT EMP_NAME 
FROM EMPLOYEE e
WHERE E.EMPLOYEE_ID = 123
and exists (select * from EMP_PROJ ep where  ep.EMPLOYEE_ID = E.EMPLOYEE_ID );

সাব-কোয়েরির SELECT 1পরিবর্তে এটি কি দ্রুত হবে না SELECT *?
ড্যানিয়েল সেরোদিও

ডিবিএমএসের উপর নির্ভর করতে পারে। আমি নিশ্চিত জানি যে এসকিউএল-সার্ভার নির্বাচন করুন * অনুকূলিত করছে। (সিএফ। মাইক্রোসফ্ট এসকিউএল
সার্ভার®

0

আপনি এই ক্যোয়ারী চেষ্টা করতে পারেন:


select distinct e2.employee_id, ep.project_id 
from employee e, employee e2, emp_proj ep
where
e.employee_id = 123
and e.employee_id = ep.employee_id
and e2.project_id = ep.project_id;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.