রেকর্ড বিদ্যমান কিনা তা নির্ধারণের দ্রুততম উপায়


143

শিরোনামের পরামর্শ অনুসারে ... আমি কোনও টেবিলে রেকর্ড রয়েছে কিনা তা নির্ধারণ করার জন্য সর্বনিম্ন ওভারহেড দিয়ে দ্রুততম উপায়টি বের করার চেষ্টা করছি।

নমুনা ক্যোয়ারী:

SELECT COUNT(*) FROM products WHERE products.id = ?;

    vs

SELECT COUNT(products.id) FROM products WHERE products.id = ?;

    vs

SELECT products.id FROM products WHERE products.id = ?;

বলুন যে ?এটির সাথে অদলবদল হয়েছে 'TB100'... প্রথম এবং দ্বিতীয় উভয় প্রশ্নেরই একই ফলাফলটি ফিরে আসবে (বলুন ... 1এই কথোপকথনের জন্য)। শেষ ক্যোয়ারী 'TB100'প্রত্যাশিত হিসাবে ফিরে আসবে, বা idটেবিলে উপস্থিত না থাকলে কিছুই হবে না।

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

কোনটি দ্রুত এবং কম ওভারহেড আছে? (এটি প্রতি প্রোগ্রাম চালুর জন্য কয়েক হাজার বার পুনরাবৃত্তি হবে, এবং দিনে বহুবার চালানো হবে)।

(জাভা থেকে এম $ সরবরাহিত জেডিবিসি ড্রাইভারের মাধ্যমে এম $ এসকিউএল সার্ভারের বিরুদ্ধে এই ক্যোয়ারী চালানো)


1
এটি ডাটাবেস নির্ভর হতে পারে। উদাহরণস্বরূপ, পোস্টগ্রিসে গণনা বরং ধীর।
মাইক ক্রিস্টেনসেন

দুঃখিত, এটি জাভা জেডিবিসি ড্রাইভারের মাধ্যমে এম $ এসকিউএল এর সাথে কথা বলছে। আমি আমার ওপি আপডেট করব।
স্নাকডোক


@ নিকোলা মার্কোভিনোভিঃ: আপনি কীভাবে এ ক্ষেত্রে এটি ব্যবহার করবেন?
zerkms

5
@zerkms প্রসঙ্গে নির্ভর করে। সঞ্চিত পদ্ধতিতে এটি হবে if exists(select null from products where id = @id); যদি কোনও ক্লায়েন্ট কর্তৃক সরাসরি জিজ্ঞাসা করা হয় select case when exists (...) then 1 else 0 end
নিকোলা মার্কোভিনোভিও

উত্তর:


170

SELECT TOP 1 products.id FROM products WHERE products.id = ?; এটি আপনার সমস্ত পরামর্শকে ছাপিয়ে দেবে কারণ এটি প্রথম রেকর্ডটি খুঁজে পাওয়ার পরে এটি কার্যকর হবে।


5
পিকে (বা অন্য কোনও অনন্য কী) এর মাধ্যমে অনুসন্ধান করার সময় কী অপ্টিমাইজার নিজেকে তা বিবেচনায় নেয় না?
zerkms

3
তিনি অবশ্য বললেন যে এটিই পিকে, তবে তা হলে হ্যাঁ অপ্টিমাইজার এটিকে বিবেচনায় নেবে।
Declan_K

3
@ ডেক্লান_ কে: মনে হচ্ছে আমার যাদু ক্ষেত্রটি এই ক্ষেত্রে ব্যর্থ হয়েছে এবং শিরোনামে একটি কলাম idপিকে নয়। সুতরাং আপনার পরামর্শ অনুযায়ী +1।
zerkms

4
যদি এটি পিকে না হয় তবে আমিও কলামটিতে একটি সূচক আছে কিনা তা নিশ্চিত করার পরামর্শ দেব। অন্যথায়, ক্যোয়ারিকে দ্রুত টেবিল সিকের পরিবর্তে একটি টেবিল স্ক্যান করতে হবে।
সিডি জর্জেনসেন

3
আমি মনে করি আমাদের এই উত্তরটির উপর @ নিনাদ-জিভকোভিক উত্তরটি বিবেচনা করা উচিত।
জিউলিও ক্যাক্সিন

192

EXISTS(বা NOT EXISTS) বিশেষভাবে কিছু উপস্থিত রয়েছে কিনা তা যাচাই করার জন্য ডিজাইন করা হয়েছে এবং তাই (এবং এটি) সেরা বিকল্প হওয়া উচিত। এটি প্রথম সারিতে মিলবে যা মিলে যায় তাই এটির জন্য কোনও TOPধারা প্রয়োজন হয় না এবং এটি আসলে কোনও ডেটা নির্বাচন করে না তাই কলামের আকারে ওভারহেড নেই। আপনি নিশ্চিন্তে ব্যবহার করতে পারেন SELECT *এখানে - চেয়ে ভিন্ন কোন SELECT 1, SELECT NULLবা SELECT AnyColumn... (আপনি এমনকি মত একটি অবৈধ অভিব্যক্তি ব্যবহার করতে পারেন SELECT 1/0এবং তা ভঙ্গ হবে না)

IF EXISTS (SELECT * FROM Products WHERE id = ?)
BEGIN
--do what you need if exists
END
ELSE
BEGIN
--do what needs to be done if not
END

এটির জন্য প্রথমে নির্বাচন নির্বাচন বিবরণী কার্যকর করতে হবে না, তারপরে যদি উপস্থিতি বিবৃতি কার্যকর করা হয় ... অতিরিক্ত ওভারহেড এবং ফলে আরও প্রক্রিয়াজাতকরণের কারণ?
স্নাকডোক

7
@SnakeDoc নং Existsসাথে কাজ করে selectএই ধরনের একটি ফ্যাশন এটি যত তাড়াতাড়ি এক সারি পাওয়া যায় প্রস্থান করে। অধিক উপস্থিত রয়েছে কেবল রেকর্ডের অস্তিত্বকেই নোট করে, রেকর্ডের প্রকৃত মান নয়, ডিস্ক থেকে সারিটি লোড করার প্রয়োজনীয়তা সংরক্ষণ করে (ধরে নিচ্ছেন অনুসন্ধানের মানদণ্ডটি অবশ্যই সূচিকৃত)। ওভারহেড হিসাবে if- আপনি যাইহোক এই বিয়োগকাল সময় ব্যয় করতে হবে।
নিকোলা মার্কোভিনোভিও

1
@ নিকোলা মার্কোভিনোভিć আকর্ষণীয় বিষয়। আমি নিশ্চিত না এই ক্ষেত্রটিতে কোনও সূচক বিদ্যমান কিনা এবং আমার নতুন বিবিএস এসকিউএল কীভাবে এটি সন্ধান করতে জানে না। আমি জেডিবিসির মাধ্যমে জাভা থেকে এই ডিবি নিয়ে কাজ করছি এবং ডাটাবেসটি কোথাও কোথাও কোথাও অবস্থিত। আমাকে কেবলমাত্র একটি "ডাটাবেস সারসংক্ষেপ" সরবরাহ করা হয়েছে যা প্রতিটি টেবিলের মধ্যে কোন ক্ষেত্রের উপস্থিতি, তাদের প্রকার এবং যে কোনও এফকে বা পিকে এর বিশদ বিবরণ দেয়। এটি কি কিছু পরিবর্তন করে?
স্নাকডোক

3
@SnakeDoc টেবিল কাঠামো সম্পর্কে জানতে, বিদেশী কী ও ইনডেক্স, রান সহ sp_help TABLE_NAME । সূচকগুলি অত্যাবশ্যক যখন অনেকের মধ্যে কয়েক সারি পুনরুদ্ধার করতে আসে, তবে ব্যবহার করে select topবা ব্যবহার করে exists; তারা উপস্থিত না থাকলে স্কিল ইঞ্জিনটি টেবিল স্ক্যান করতে হবে। এটি সর্বনিম্ন পছন্দসই টেবিল অনুসন্ধান বিকল্প। আপনি যদি সূচী তৈরির জন্য অনুমোদিত না হন তবে আপনাকে সেগুলি স্বয়ংক্রিয়ভাবে সামঞ্জস্য করে কিনা তারা আপনাকে সূচী প্রস্তাব দেওয়ার জন্য প্রত্যাশা করতে হবে অন্য দিকে কারিগরি কর্মীদের সাথে যোগাযোগ করতে হবে।
নিকোলা মার্কোভিনোভিć

1
@ কনস্টান্টিন আপনি এর মতো কিছু করতে পারেনSELECT CASE WHEN EXISTS(..) THEN 1 ELSE 0 END;
নেনাড জিভকোভিচ

21

কিছুই মারতে পারে না -

SELECT TOP 1 1 FROM products WHERE id = 'some value';

টেবিলে কোনও ডেটা আছে কিনা তা জানতে আপনার গুনতে হবে না। এবং যখন প্রয়োজন হবে না তখন উপনাম ব্যবহার করবেন না।


5
এর নাম সত্ত্বেও idপ্রাথমিক কী নয়। সুতরাং, আপনি গণনা না করা সত্ত্বেও আপনার এখনও সব মিলিয়ে রেকর্ডগুলি খুঁজে পাওয়া দরকার, সম্ভবত তাদের হাজার হাজার। এলিয়াসিং সম্পর্কে - কোডটি ধারাবাহিকভাবে কাজ চলছে। কখনই আপনাকে ফিরে যেতে হবে তা আপনি জানেন না। আলিয়াজিং বোকা রানটাইম ত্রুটি প্রতিরোধে সহায়তা করে; উদাহরণস্বরূপ, অনন্য কলামের নাম যেটির একটি এলিফের দরকার নেই তা আর অনন্য নয় কারণ কেউ অন্য একটিতে একই নামের কলাম তৈরি করেছে, টেবিলে যোগদান করেছে।
নিকোলা মার্কোভিনোভিয় ć

হ্যাঁ, আপনি একেবারে সঠিক। এলিয়াসিং অনেক সাহায্য করে তবে আমি মনে করি না যে যোগদান করে না যখন এটি কোনও পার্থক্য করে। সুতরাং, আমি বলেছি এটি প্রয়োজনীয় না হলে ব্যবহার করবেন না। :) এবং আপনি অস্তিত্ব যাচাইয়ের বিষয়ে এখানে একটি দীর্ঘ আলোচনা খুঁজে পেতে পারেন । :)
এজেন্ট এসকিউএল

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

1
এখন তা উপেক্ষা করা যাবে না। ধন্যবাদ !! :)
এজেন্ট এসকিউএল

15
SELECT CASE WHEN EXISTS (SELECT TOP 1 *
                         FROM dbo.[YourTable] 
                         WHERE [YourColumn] = [YourValue]) 
            THEN CAST (1 AS BIT) 
            ELSE CAST (0 AS BIT) END

এই পদ্ধতির আপনার জন্য একটি বুলিয়ান দেয়।


1
এটিকে কিছুটা আরও দ্রুত করার জন্য শীর্ষস্থানীয় বিবৃতি এবং * বিবৃতিটি সম্ভবত বাদ দিতে পারে, যেমন একটি রেকর্ড সন্ধানের পরে অস্তিত্বটি প্রস্থান করবে, সুতরাং এর মতো কিছু: ক্যাসিটি উপস্থিত থাকলে নির্বাচন করুন (ডিবো থেকে 1 টি নির্বাচন করুন Your [আপনার টেবিল] যেখানে [আপনার কলাম]] = [আপনার মূল্য]] তিনটি কাস্ট (বিট হিসাবে 1 টি) এলএসএই কাস্ট (0 টি বিট হিসাবে) শেষ
স্টেফান জাভোনার

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

8

আপনি ব্যবহার করতে পারেন

 If EXISTS (SELECT 1 FROM dbo.T1 WHERE T1.Name='Scot')
    BEGIN
         --<Do something>
    END 

ELSE    
     BEGIN
       --<Do something>
     END

7

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

SELECT CASE WHEN EXISTS (SELECT 1 
                     FROM dbo.[YourTable] WITH (NOLOCK)
                     WHERE [YourColumn] = [YourValue]) 
        THEN CAST (1 AS BIT) 
        ELSE CAST (0 AS BIT) END

3
SELECT COUNT(*) FROM products WHERE products.id = ?;

এটি ক্রস রিলেশনাল ডাটাবেস সমাধান যা সমস্ত ডাটাবেসে কাজ করে।


7
তবে আপনার বড় টেবিলের উপর সকল রেকর্ড উপর লুপ ডিবি বাধ্য, খুব ধীর
AMD

@ কেন যত্ন করবেন তা বোঝাতে?
উমনিওব

আপনার মন্তব্যটি মোটামুটি বুঝে গেছেন। এই কোয়েরিটি অন্য যে কোনও অনুসন্ধানের চেয়ে আরও বেশি কিছু খুঁজে পাওয়া যায়।
উমনিওব

1

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

SELECT distinct 1 products.id FROM products WHERE products.id = ?;

0
create or replace procedure ex(j in number) as
i number;
begin
select id into i from student where id=j;
if i is not null then
dbms_output.put_line('exists');
end if;
exception
   when no_data_found then
        dbms_output.put_line(i||' does not exists');

end;

2
সম্ভবত আপনার কোডটি দুর্দান্ত কাজ করে তবে আপনি কিছু অতিরিক্ত তথ্য যুক্ত করেন তবে এটি আরও ভাল is
আইডেমিয়ান

0

আমি এটি অতীতে ব্যবহার করেছি এবং এটির কোনও অস্তিত্ব আছে কিনা তা দেখার জন্য পুরো টেবিল স্ক্যানের প্রয়োজন হয় না। এটি সুপার দ্রুত ...

UPDATE TableName SET column=value WHERE column=value
IF @@ROWCOUNT=0
BEGIN
     --Do work
END             

0

মাইএসকিউএল বা ওরাকল ব্যাকগ্রাউন্ড থেকে যারা এ নিয়ে হোঁচট খাচ্ছে তাদের জন্য - মাইএসকিউএল সীমিত সংখ্যক রেকর্ড নির্বাচন করতে লিমিটের ধারাটিকে সমর্থন করে, যখন ওরাকল রাউনুম ব্যবহার করে।

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