এসকিউএল বনাম এসকিউএল সাবকিউরিয়ান্স (পারফরম্যান্স) এ যোগ দেয়?


110

আমি জানতে চাই যে আমার কাছে এই জাতীয় কিছুতে যোগদানের কোয়েরি রয়েছে কিনা -

Select E.Id,E.Name from Employee E join Dept D on E.DeptId=D.Id

এবং একটি subquery এর মত কিছু -

Select E.Id,E.Name from Employee Where DeptId in (Select Id from Dept)

আমি যখন পারফরম্যান্স বিবেচনা করি তখন দুটি প্রশ্নের মধ্যে কোনটি দ্রুত হবে এবং কেন ?

এছাড়াও কি এমন সময় আছে যখন আমার একে অপরের চেয়ে বেশি পছন্দ করা উচিত?

দুঃখিত, এটি যদি খুব তুচ্ছ এবং এর আগে জিজ্ঞাসা করা হয় তবে আমি এটি সম্পর্কে বিভ্রান্ত। এছাড়াও, এটি দুর্দান্ত হবে যদি আপনি ছেলেরা আমাকে দুটি ক্যোয়ারের পারফরম্যান্স পরিমাপ করার জন্য আমার সরঞ্জামগুলির পরামর্শ দিতে পারেন। অনেক ধন্যবাদ!


5
@ লুসেরো, এই প্রশ্নটি স্কেল-সার্ভার -২০০। ট্যাগ করা হয়েছে, যেখানে আপনি যে পোস্টটি উল্লেখ করেছেন তা মাইএসকিউএল ট্যাগ করা আছে is আপনি উত্তরগুলি একই হতে পারে তা অনুমান করতে পারেন। দুটি আরডিবিএমএসে পারফরম্যান্স অপটিমাইজেশন আলাদাভাবে করা হয়।
ফ্রাঙ্কোইস বোথা

উত্তর:


48

দ্রুত হওয়ার জন্য প্রথম ক্যোয়ারীটি আমি এক্সপ্যাক্ট করব, মূলত আপনার সমতা এবং একটি সুস্পষ্ট যোগদানের কারণে। আমার অভিজ্ঞতায় INখুব ধীর অপারেটর, যেহেতু এসকিউএল সাধারণত এটি WHERE"ওআর" ( WHERE x=Y OR x=Z OR...) দ্বারা বিভক্ত ধারাগুলির একটি ধারা হিসাবে মূল্যায়ন করে ।

যদিও সমস্ত জিনিস এসকিউএল হিসাবে রয়েছে, আপনার মাইলেজটি বিভিন্ন রকম হতে পারে। গতি ইনডেক্সের উপর অনেক নির্ভর করবে (আপনার উভয় আইডি কলামে সূচি রয়েছে? এটি অন্যান্য জিনিসগুলির সাথে অনেক সহায়তা করবে)।

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


16
এই জবাব নিয়ে আমার গুরুতর সন্দেহ আছে, যেহেতু বেশিরভাগ ডিবিএমএস, স্পষ্টতই এসকিউএল সার্ভার ২০০৮ এবং পরবর্তী সময়ে, একক আইডি উপকৌরী (পারস্পরিক সম্পর্কযুক্ত নয়, যার অর্থ: একাধিক বহির্মুখী ক্যোয়ারী কলামগুলি উল্লেখ না করা) তুলনামূলকভাবে দ্রুত আধা-যোগে অনুবাদ করুন। এছাড়াও, আগে অন্য উত্তরে যেমন উল্লেখ করা হয়েছে, প্রথম, আসল যোগটি ডিপার্টমেন্টে ম্যাচিং আইডির প্রতিটি ঘটনার জন্য একটি সারিতে ফিরে আসবে - এটি কোনও অনন্য আইডির জন্য কোনও পার্থক্য রাখে না, তবে আপনাকে অন্য কোথাও অনেকগুলি নকল দেবে। DISTINCT বা GROUP BY এর মাধ্যমে এগুলি বাছাই করা অন্যটি, ভারী পারফরম্যান্সের বোঝা হবে। এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওতে কার্যকর করার পরিকল্পনাগুলি পরীক্ষা করুন!
এরিক হার্ট

2
OR এর সমতুল্য হিসাবে আইএন প্যারামিটার / মান তালিকার ক্ষেত্রে প্রযোজ্য, তবে সাবকিউয়েরিতে নয়, যা বেশিরভাগ যোগদানের মতো আচরণ করা হয়।
এরিক হার্ট

42

ঠিক আছে, আমি বিশ্বাস করি এটি একটি "পুরানো তবে সোনার" প্রশ্ন। উত্তরটি হল, এটা নির্ভরশীল!". পারফরম্যান্সগুলি এমন একটি সূক্ষ্ম বিষয় যে এটি বলা খুব বেশি নির্বোধ হবে: "কখনও সাবকিউরি ব্যবহার করবেন না, সর্বদা যোগদান করুন"। নিম্নলিখিত লিঙ্কগুলিতে, আপনি কয়েকটি প্রাথমিক সেরা অনুশীলনগুলি পেয়ে যাবেন যা আমি খুব সহায়ক বলে খুঁজে পেয়েছি:

আমার 50000 উপাদান সহ একটি টেবিল রয়েছে, ফলাফলটি আমি খুঁজছিলাম .৩৯ টি উপাদান।

প্রথম আমার জিজ্ঞাসাটি ছিল:

SELECT  p.id,
    p.fixedId,
    p.azienda_id,
    p.categoria_id,
    p.linea,
    p.tipo,
    p.nome
FROM prodotto p
WHERE p.azienda_id = 2699 AND p.anno = (
    SELECT MAX(p2.anno) 
    FROM prodotto p2 
    WHERE p2.fixedId = p.fixedId 
)

এবং এটি কার্যকর করতে 7.9s সময় নিয়েছে।

শেষ পর্যন্ত আমার জিজ্ঞাসাটি হ'ল:

SELECT  p.id,
    p.fixedId,
    p.azienda_id,
    p.categoria_id,
    p.linea,
    p.tipo,
    p.nome
FROM prodotto p
WHERE p.azienda_id = 2699 AND (p.fixedId, p.anno) IN
(
    SELECT p2.fixedId, MAX(p2.anno)
    FROM prodotto p2
    WHERE p.azienda_id = p2.azienda_id
    GROUP BY p2.fixedId
)

এবং এটি 0.0256s নিয়েছিল

ভাল এসকিউএল, ভাল।


3
আকর্ষণীয়, আপনি কী ব্যাখ্যা করতে পারবেন কীভাবে গ্রুপ যোগ করার মাধ্যমে এটি সংশোধন করা হয়েছে?
cozos

6
সাবকোয়ারি দ্বারা উত্পন্ন অস্থায়ী টেবিলটি ছোট ছিল। সুতরাং চেক ইন করার জন্য ডেটা কম থাকার কারণে ফাঁসি কার্যকর হয়
স্যার্মি নিজে নিজে

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

1
SQL সার্ভার এবং মাইএসকিএল এবং ... এসকিউএল (NoSQL বাদে) অবকাঠামোগত ক্ষেত্রে একই রকম। আমাদের নীচে এক ধরণের ক্যোয়ারী অপ্টিমাইজেশন ইঞ্জিন রয়েছে যা IN (...) অনুচ্ছেদে যোগদানের জন্য রূপান্তর করে (যদি এটি সম্ভব হত)। তবে যখন আপনার একটি ভাল সূচিকৃত কলামে (এর কার্ডিনালিটির ভিত্তিতে) একটি গ্রুপ থাকবে তখন এটি আরও দ্রুত হবে much সুতরাং এটি পরিস্থিতির উপর নির্ভর করে।
অ্যালিক্স

10

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

আমি এগুলি এত ভয়াবহভাবে পৃথক হওয়ার প্রত্যাশা করব না, যেখানে আপনি পরস্পর সম্পর্কযুক্ত সাবকোয়ারি ব্যবহার করার সময় আপনি সাবকিউয়ের পরিবর্তে যোগদানের ক্ষেত্রে সত্যিকারের, বৃহত পারফরম্যান্স লাভ পেতে পারেন।

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


9

পারফরম্যান্স আপনি যে পরিমাণ ডেটা ব্যবহার করছেন তার উপর ভিত্তি করে ...

যদি এটি 20k এর কাছাকাছি কম ডেটা হয়। যোগদান করুন আরও ভাল কাজ করে।

যদি ডেটা 100k + এর মতো হয় তবে IN আরও ভাল কাজ করে।

যদি অন্য টেবিল থেকে আপনার ডেটা প্রয়োজন না হয় তবে IN ভাল, তবে এটি উপস্থিত থাকা ভাল al

এই সমস্ত মাপদণ্ড যা আমি পরীক্ষা করেছি এবং টেবিলগুলির যথাযথ সূচক রয়েছে।


4

পারফরম্যান্স একই হওয়া উচিত; আপনার টেবিলগুলিতে সঠিক সূচীপত্র এবং ক্লাস্টারিং প্রয়োগ করা আরও বেশি গুরুত্বপূর্ণ ( সেই বিষয়ে কিছু ভাল সংস্থান রয়েছে )।

(আপডেট হওয়া প্রশ্নের প্রতিফলনের জন্য সম্পাদিত)


4

দুটি প্রশ্নের শব্দার্থগতভাবে সমতুল্য নাও হতে পারে। যদি কোনও কর্মী একাধিক বিভাগের জন্য কাজ করেন (আমি যে এন্টারপ্রাইজটিতে কাজ করি এটি সম্ভব; এটি স্বীকার করবে যে আপনার টেবিলটি পুরোপুরি স্বাভাবিক করা হয়নি) তবে প্রথম ক্যোয়ারী সদৃশ সারিগুলিতে ফিরে আসবে তবে দ্বিতীয় কোয়েরিটি তা করবে না। এই ক্ষেত্রে প্রশ্নের সমতুল্য করতে, DISTINCTকীওয়ার্ডটি SELECTক্লজটিতে যুক্ত করতে হবে , যা কার্য সম্পাদনে প্রভাব ফেলতে পারে।

মনে রাখবেন থাম্বের একটি নকশার নিয়ম রয়েছে যাতে বলা হয়েছে যে একটি সারণীতে একটি সত্তা / শ্রেণি বা সত্তা / শ্রেণির মধ্যে সম্পর্ক তৈরি করা উচিত তবে উভয়ই নয়। অতএব, আমি আপনাকে OrgChartকর্মীদের এবং বিভাগের মধ্যে সম্পর্কের মডেল করার জন্য , একটি তৃতীয় টেবিল তৈরি করার পরামর্শ দিচ্ছি ।


4

আমি জানি এটি একটি পুরানো পোস্ট, তবে আমি মনে করি এটি একটি খুব গুরুত্বপূর্ণ বিষয়, বিশেষত আজকাল যেখানে আমাদের 10M + রেকর্ড রয়েছে এবং ডেটা টেরাবাইট সম্পর্কে কথা হয়।

নিম্নলিখিত পর্যবেক্ষণগুলি সহ আমি ওজন করব। আমার টেবিলে আমার প্রায় 45M রেকর্ড রয়েছে ([ডেটা]), এবং আমার [বিড়ালদের] টেবিলে প্রায় 300 টি রেকর্ড রয়েছে। আমি যে সমস্ত প্রশ্নের বিষয়ে কথা বলছি তার সবগুলির জন্য আমার বিস্তৃত সূচী রয়েছে।

উদাহরণ 1 বিবেচনা করুন:

UPDATE d set category = c.categoryname
FROM [data] d
JOIN [cats] c on c.id = d.catid

বনাম উদাহরণ 2:

UPDATE d set category = (SELECT TOP(1) c.categoryname FROM [cats] c where c.id = d.catid)
FROM [data] d

উদাহরণ 1 চালাতে প্রায় 23 মিনিট সময় নিয়েছিল। উদাহরণ 2 প্রায় 5 মিনিট সময় নিয়েছে।

সুতরাং আমি উপসংহারে পৌঁছে যাব যে এই ক্ষেত্রে সাব-কোয়েরিটি অনেক দ্রুত। অবশ্যই মনে রাখবেন যে আমি এম 2 এসএসডি ড্রাইভগুলি i / o @ 1GB / সেকেন্ডে সক্ষম (ব্যাটস বাইটস বিটস নয়) সক্ষম, তাই আমার সূচকগুলিও খুব দ্রুত। সুতরাং এটি আপনার পরিস্থিতিতে গতিতেও প্রভাব ফেলতে পারে

যদি এটি এক-অফ ডেটা ক্লিনজিং হয় তবে সম্ভবত এটি চালানো এবং শেষ করা ভাল। আমি টপ (10000) ব্যবহার করি এবং বড় ক্যোরিয়াকে আঘাত করার আগে আমি দেখতে পাই যে এটি কতক্ষণ সময় নেয় এবং রেকর্ড সংখ্যায় গুণ করে।

আপনি যদি প্রোডাকশন ডেটাবেসগুলিকে অনুকূল করে তুলছেন তবে আমি প্রসেসিং প্রাক ডেটাগুলি দৃ strongly়ভাবে প্রস্তাব করব, অর্থাত অ্যাসিঙ্ক আপডেট রেকর্ডগুলিতে ট্রিগার বা জব-ব্রোকার ব্যবহার করুন, যাতে রিয়েল-টাইম অ্যাক্সেস স্থিতিশীল ডেটা পুনরুদ্ধার করে।


0

উদ্দেশ্যমূলক উত্তর পেতে আপনি একটি ব্যাখ্যা পরিকল্পনা ব্যবহার করতে পারেন।

আপনার সমস্যার জন্য, একটি উপস্থিত ফিল্টার সম্ভবত দ্রুততম সঞ্চালন করবে।


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

এটি কি শেষ দৃশ্যে ধীর হয়ে চলবে?
স্নেকস

এটি অপটিমাইজারের উপর নির্ভর করবে - নির্দিষ্ট পরিস্থিতিতে এটি হতে পারে তবে সাধারণত আমি খুব অনুরূপ পারফরম্যান্স আশা করব।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.