A = 0 এবং b = 0 এবং… z = 0 বনাম a + b + c + d = 0 এর পারফরম্যান্স


20

এটি একটি সাধারণ প্রশ্ন যার উত্তর আমি খুঁজে পাচ্ছি না।

পারফরম্যান্সের ক্ষেত্রে, আমার যদি এর মতো একটি WHEREধারা a=0 and b=0 and ... z=0থাকে তবে আমি যদি এই শর্তটি প্রতিস্থাপন করি তবে আমি কি কোনও সম্পাদন করতে পারি a+b+...+z=0?

অন্য কথায়, নিম্নলিখিতগুলি প্রতিস্থাপন করে কোনও কার্যকারিতা লাভ আছে কি?

Select * 
From MyTable 
Where A=0 and B=0 and C=0 and D=0...

সঙ্গে

Select * 
From MyTable 
Where A+B+C+D=0...

আমি জানি এটি সূচকের উপর নির্ভর করতে পারে তবে এই উদ্দেশ্যে, আসুন আমরা বলি যে কোনও সূচকের অস্তিত্ব নেই। পাটিগণিত অপারেটর (+) একটি "ওআর" বা "এবং" লজিকাল অপারেটরের চেয়ে ভাল সম্পাদন করে?

আমি এই ধারণাটির আওতায় আছি যে সংযোজনগুলি ANDs বা OR এর সাথে একাধিক শর্তের চেয়ে আরও ভাল সম্পাদন করে।

পরীক্ষার ফলাফল

4.2 মিলিয়ন সারিগুলির একটি সারণীতে

সারিগুলি যেখানে A = 0 বি = 0 এবং সি = 0 -> 351748 সারিতে ফিরছে

সংযোজন (A + B + C = 0) 5 সেকেন্ড সময় নিয়েছে যখন লজিকাল পরিস্থিতি A = 0 এবং B = 0 এবং C = 0 11 সেকেন্ড নিয়েছিল।

অন্য দিকে

সারিগুলি যেখানে A <> 0 বি <> 0 বা সি <> 0 -> 3829750 সারি 58 সেকেন্ডে ফিরে আসছে

সারিগুলি ফিরছে যেখানে F65 + F67 + f64 <> 0 -> 3829750 সারি 57 সেকেন্ড

OR এর জন্য, মনে হয় এটির কোনও উল্লেখযোগ্য পার্থক্য নেই।

আমি জিবিএন এর সাথে একমত:

যদি A -1 এবং B হয় 1, A + B = 0 তবে A = 0 এবং B = 0 মিথ্যা is

এবং AMtwo সঙ্গে:

ABS (A) + ABS (B) + ABS (C) + ABS (D) ... এমনকি যদি আপনি কেবল ইতিবাচক মানগুলি আশা করেন, যদি কলামটি নেতিবাচক মানগুলি গ্রহণ করে, আপনার ধরে নেওয়া উচিত যে আপনি একটির মুখোমুখি হতে পারেন

ফলাফলগুলি খুব চিত্তাকর্ষক, যেমনটি আমি ভেবেছিলাম, মনে হয় যুক্তিযুক্ত অপারেটরগুলির চেয়ে যোগটি আরও দ্রুত।

এ = ফ্লোট, বি = মানি এবং সি = ফ্লোট। ব্যবহৃত ক্যোয়ারীটি দেখানো হয়েছে। আমার ক্ষেত্রে, সবগুলি ইতিবাচক সংখ্যা। কোনও সূচী নেই। এটি আমার মনে কেবল যৌক্তিক যে যুক্তিযুক্ত শর্তের চেয়ে সংযোজন দ্রুত হবে!


এই বুলিয়ান হয়? আপনি 4 টি (উদাহরণগুলিতে) বা 26 (শিরোনামে) সম্পর্কে কয়টি কলামের কথা বলছেন? এটি একটি পার্থক্য করে। এসকিউএল সার্ভারের কোন সংস্করণ? ফ্লোট এবং অর্থ কোথায় খেলতে আসে? আমরা কয়টি সারি অনুমান করছি? এই প্রশ্নের অনেকগুলি কারণ রয়েছে।
ইভান ক্যারল 21

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

উত্তর:


46

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

প্রথমত, আপনাকে নিশ্চিত করতে হবে যে আপনি এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিও (বা আপনি যে কোনও ক্লায়েন্ট ব্যবহার করছেন) পরীক্ষা করছেন না। উদাহরণস্বরূপ, আপনি যদি SELECT *3 মিলিয়ন সারি নিয়ে কোনও টেবিল থেকে চালাচ্ছেন তবে আপনি বেশিরভাগ এসএসকিউএল সার্ভার থেকে সারিগুলি টানতে এবং সেগুলি অন স্ক্রিনে রেন্ডার করার জন্য এসএসএমএসের দক্ষতার পরীক্ষা করছেন। SELECT COUNT(1)নেটওয়ার্ক জুড়ে কয়েক মিলিয়ন সারি টানতে এবং এগুলি স্ক্রিনে রেন্ডার করার প্রয়োজনীয়তা উপেক্ষা করে এমন কিছু ব্যবহার করার জন্য আপনি অনেক বেশি ভাল ।

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

শীতল-ক্যাশে পরীক্ষার জন্য, আপনাকে পরীক্ষার প্রতিটি রান করার আগে চালানো CHECKPOINTএবং DBCC DROPCLEANBUFFERSআগে চালানো দরকার ।

আপনি আপনার প্রশ্নে যে পরীক্ষার বিষয়ে জিজ্ঞাসা করেছেন তার জন্য, আমি নিম্নলিখিত পরীক্ষার শয্যা তৈরি করেছি:

IF COALESCE(OBJECT_ID('tempdb..#SomeTest'), 0) <> 0
BEGIN
    DROP TABLE #SomeTest;
END
CREATE TABLE #SomeTest
(
    TestID INT NOT NULL
        PRIMARY KEY 
        IDENTITY(1,1)
    , A INT NOT NULL
    , B FLOAT NOT NULL
    , C MONEY NOT NULL
    , D BIGINT NOT NULL
);

INSERT INTO #SomeTest (A, B, C, D)
SELECT o1.object_id, o2.object_id, o3.object_id, o4.object_id
FROM sys.objects o1
    , sys.objects o2
    , sys.objects o3
    , sys.objects o4;

SELECT COUNT(1) 
FROM #SomeTest;

এটি আমার মেশিনে 260,144,641 এর একটি গণনা দেয়।

"সংযোজন" পদ্ধতিটি পরীক্ষা করতে, আমি চালিত:

CHECKPOINT 5;
DBCC FREEPROCCACHE;
DBCC DROPCLEANBUFFERS;

SET STATISTICS IO, TIME ON;
GO
SELECT COUNT(1)
FROM #SomeTest st
WHERE (st.A + st.B + st.C + st.D) = 0;
GO
SET STATISTICS IO, TIME OFF;

বার্তা ট্যাব দেখায়:

সারণী '#SomeTest'। স্ক্যান গণনা 3, যৌক্তিক পাঠ 1322661, শারীরিক 0 0, পঠন-এগিয়ে 1313877, লব লজিকাল রিড 0, লব ফিজিকাল 0, লব রিড-ফরোয়ার্ড 0

এসকিউএল সার্ভার এক্সিকিউশন টাইমস: সিপিইউ সময় = 49047 এমএস, অতিবাহিত সময় = 173451 এমএস।

"পৃথক কলাম" পরীক্ষার জন্য:

CHECKPOINT 5;
DBCC FREEPROCCACHE;
DBCC DROPCLEANBUFFERS;

SET STATISTICS IO, TIME ON;
GO
SELECT COUNT(1)
FROM #SomeTest st
WHERE st.A = 0
    AND st.B = 0
    AND st.C = 0
    AND st.D = 0;
GO

SET STATISTICS IO, TIME OFF;

আবার, বার্তা ট্যাব থেকে:

সারণী '#SomeTest'। স্ক্যান গণনা 3, যৌক্তিক পাঠ 1322661, শারীরিক 0 0, পঠন-এগিয়ে 1322661, লব লজিকাল 0, লব শারীরিক 0, লব পঠন-এগিয়ে 0 0

এসকিউএল সার্ভার এক্সিকিউশন টাইমস: সিপিইউ সময় = 8938 এমএস, অতিবাহিত সময় = 162581 এমএস।

উপরের পরিসংখ্যানগুলি থেকে আপনি দ্বিতীয় বৈকল্পটি দেখতে পারবেন, 0 এর সাথে তুলনায় পৃথক কলামগুলির সাথে, অতিবাহিত সময়টি প্রায় 10 সেকেন্ডের চেয়ে কম হয়, এবং সিপিইউ সময়টি প্রায় 6 গুণ কম হয়। উপরের আমার পরীক্ষাগুলির দীর্ঘ সময়কালগুলি বেশিরভাগ ডিস্ক থেকে প্রচুর সারি পড়ার ফলাফল। যদি আপনি সারির সংখ্যা 3 মিলিয়নে ফেলে দেন তবে আপনি অনুপাতটি একইরকম দেখতে পান তবে অতিবাহিত সময়গুলি লক্ষণীয়ভাবে হ্রাস পায়, যেহেতু ডিস্ক I / O এর প্রভাব খুব কম রয়েছে।

"সংযোজন" পদ্ধতি সহ:

সারণী '#SomeTest'। স্ক্যান কাউন্ট 3, লজিকাল 15155 রিডিজ, ফিজিকাল রিড 0, রিড-ফরোয়ার্ড 0 পড়ছে, লব লজিকাল রিড 0, লব ফিজিকাল রিড 0, লব রিড-ফরোয়ার্ড 0 0

এসকিউএল সার্ভার এক্সিকিউশন টাইমস: সিপিইউ সময় = 499 এমএস, অতিবাহিত সময় = 256 এমএস।

"পৃথক কলাম" পদ্ধতি সহ:

সারণী '#SomeTest'। স্ক্যান কাউন্ট 3, লজিকাল 15155 রিডিজ, ফিজিকাল রিড 0, রিড-ফরোয়ার্ড 0 পড়ছে, লব লজিকাল রিড 0, লব ফিজিকাল রিড 0, লব রিড-ফরোয়ার্ড 0 0

এসকিউএল সার্ভার এক্সিকিউশন টাইমস: সিপিইউ সময় = 94 এমএস, অতিবাহিত সময় = 53 এমএস।

কি এই পরীক্ষার জন্য সত্যিই বড় পার্থক্য করতে হবে? একটি উপযুক্ত সূচক, যেমন:

CREATE INDEX IX_SomeTest ON #SomeTest(A, B, C, D);

"সংযোজন" পদ্ধতি:

সারণী '#SomeTest'। স্ক্যান কাউন্ট 3, লজিকাল পড়ছে 14235, শারীরিক পাঠ 0, রিড-ফরোডড 0, লব লজিকাল রিড 0, লব ফিজিকাল 0, লব রিড-ফরোডড 0

এসকিউএল সার্ভার এক্সিকিউশন টাইমস: সিপিইউ সময় = 546 এমএস, অতিবাহিত সময় = 314 এমএস।

"পৃথক কলাম" পদ্ধতি:

সারণী '#SomeTest'। স্ক্যান কাউন্ট 1, লজিকাল রিডস 3, ফিজিকাল রিড 0, রিড-ফরোয়ার্ড রিড 0, লব লজিকাল রিড 0, লব ফিজিকাল 0, লব রিড-ফরোয়ার্ড 0

এসকিউএল সার্ভার এক্সিকিউশন টাইমস: সিপিইউ সময় = 0 এমএস, অতিবাহিত সময় = 0 এমএস।

প্রতিটি ক্যোয়ারির জন্য কার্যনির্বাহী পরিকল্পনা (উপরের ইনডেক্সে ইনডেক্স) বেশ কিছু বলছে।

"সংযোজন" পদ্ধতি, যা অবশ্যই পুরো সূচকের স্ক্যান সম্পাদন করে:

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

এবং "স্বতন্ত্র কলামগুলি" পদ্ধতিটি সূচকটির প্রথম সারিতে সন্ধান করতে পারে যেখানে শীর্ষস্থানীয় সূচক কলামটি Aশূন্য:

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


24

ধরা যাক আপনার A, B, C এবং D. তে একটি সূচক আছে খুব ফিল্টারও করা যায়।

এরপরে সূচকটি ব্যবহার করার সম্ভাবনা বেশি।

Where A=0 and B=0 and C=0 and D=0

অন্যান্য খবরে, যদি A -1 হয় এবং B 1 A+B=0হয় তবে সত্য তবে A=0 and B=0এটি মিথ্যা।


7

(দয়া করে নোট করুন যে প্রশ্নটিতে উল্লিখিত কোনও পরীক্ষার আগে এই উত্তরটি জমা দেওয়া হয়েছিল: পরীক্ষার ফলাফল বিভাগের ঠিক উপরে প্রশ্নের পাঠ্য শেষ হয়েছে ।)

আমি অনুমান করব যে পৃথক ANDশর্তগুলি অগ্রাধিকার পাবে যেহেতু অপ্টিমাইজারটি অপারেশনটি শর্ট সার্কিট করার সম্ভাবনা বেশি থাকে যদি তাদের মধ্যে একটিও প্রথমে গণনা করার প্রয়োজন ছাড়াই 0 এর সমান হয় না

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


3

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

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


2

এটি একটি সাধারণ প্রশ্ন

না এটা না. এই (ধরণের) প্রশ্নটি হ'ল বহু দিনের ডিবিএ এবং সফ্টওয়্যার বিকাশকারীরা দিনের পর দিন আক্রান্ত হয় এবং এগুলি কেবল তুচ্ছ।

যে আমি উত্তর খুঁজে পেতে পারে না।

হ্যাঁ, আপনি না। কমপক্ষে কোনও সাধারণ উত্তর নয়। প্রথমত, এটি নির্ভর করবে আপনি কোন আরডিবিএমএস ব্যবহার করছেন তার উপর (ঠিক আছে, আপনি ব্যবহার করছেন তবে এখনও)। এমনকি আপনি যখন নিজের আরডিবিএমএসের একটি সংস্করণ থেকে অন্য সংস্করণে যেতে পারেন তখন এটি পরিবর্তনও হতে পারে।

তারপরে, এটি অন্যান্য ছোট ছোট পরিমাণের কোনও পরিমাণের উপর নির্ভর করতে পারে, উদাহরণস্বরূপ, আপনার ডিবি কীভাবে ডেটা সঞ্চয় করে, যদি আপনার উপ-বাছাই / যোগদান করে যা পরিকল্পনা অপ্টিমাইজার ইত্যাদির জন্য সমস্যাটিকে বিভ্রান্ত করে .. আপনার কত সারি আছে ...

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


0

এই সুস্পষ্ট হতে পারে, কিন্তু কলাম যদি INT, তারপর a+b+cশূন্য এমনকি সমান পারা গেলে কেউই তাদের আসলে শূন্য হয়। আপনি দুটি ভিন্ন জিনিস পরীক্ষা করছেন!


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