গণনা (*) বনাম গণনা (1) - এসকিউএল সার্ভার


737

আপনারা যদি কারওর Count(1)বেশি ব্যবহার করেন Count(*)এবং যদি পারফরম্যান্সে লক্ষণীয় পার্থক্য দেখা যায় বা যদি এটি কেবল কোনও উত্তরাধিকার অভ্যাস যা অতীতকাল থেকে এগিয়ে এসেছিল?

নির্দিষ্ট ডাটাবেস হয় SQL Server 2005


7
এসকিউএল সার্ভার সম্পর্কে জানেন না তবে মাইএসকিউএলে কোনও পার্থক্য নেই। অন্যদিকে COUNT (কলাম) আলাদা
গ্রেগ

118
সত্য না. COUNT (সামার কলাম) কেবল সোলকুলমের জন্য নন-নাল মান ধারণ করে এমন সারিগুলির গণনা প্রদান করবে। COUNT (*) এবং COUNT ('ফু') সারণীতে সারিগুলির মোট সংখ্যা প্রদান করবে।
স্টিভ ব্রবার্গ

1
আরও
বিশদের

4
বাহ স্টিভ এবং এখানে আমি গণনা (*) বনাম গণনা (কলামনাম) না জেনে টিএসকিউএলে 5 বছর ছিলাম। ধন্যবাদ
হরিিন্দাকা

3
COUNT(*)বনাম COUNT(1)বনামCOUNT(pk) এর উত্তরগুলিও নোট করুন - কোনটি ভাল? । এছাড়াও আছে COUNT(*)বনাম COUNT(column-name)যা প্রায়ই সঠিক - । অন্য নকল থাকতে পারে।
জোনাথন লেফলার

উত্তর:


598

এখানে কোন পার্থক্য নেই.

কারণ:

অন-লাইন বই " COUNT ( { [ [ ALL | DISTINCT ] expression ] | * } )" বলে

"1" একটি নন-নাল এক্সপ্রেশন: সুতরাং এটি একই রকম COUNT(*)। অপটিমাইজার এটি যা তা জন্য স্বীকৃতি দেয়: তুচ্ছ।

EXISTS (SELECT * ...বা হিসাবে একইEXISTS (SELECT 1 ...

উদাহরণ:

SELECT COUNT(1) FROM dbo.tab800krows
SELECT COUNT(1),FKID FROM dbo.tab800krows GROUP BY FKID

SELECT COUNT(*) FROM dbo.tab800krows
SELECT COUNT(*),FKID FROM dbo.tab800krows GROUP BY FKID

একই আইও, একই পরিকল্পনা, কাজগুলি

সম্পাদনা করুন, আগস্ট 2011

ডিবিএ.এসই তে একই প্রশ্ন

সম্পাদনা করুন, ডিসেম্বর ২০১১

COUNT(*)এএনএসআই -২২ তে বিশেষভাবে উল্লেখ করা হয়েছে (" Scalar expressions 125" দেখুন)

কেস:

ক) যদি COUNT (*) নির্দিষ্ট করা থাকে তবে ফলাফলটি টি এর কার্ডিনালিটি is

এটি হ'ল, এএনএসআই স্ট্যান্ডার্ড এটিকে আপনার রক্তাক্ত বলতে বোঝাচ্ছে obvious এই কুসংস্কারের কারণেCOUNT(1) আরডিবিএমএস বিক্রেতারা অপ্টিমাইজ করেছেন । অন্যথায় এটিএসআই অনুযায়ী মূল্যায়ন করা হবে

খ) অন্যথায়, টিএক্সকে একক কলামের টেবিল হতে দেওয়া যা টির প্রতিটি সারিতে <মান প্রকাশ> প্রয়োগ এবং নাল মানগুলি সরিয়ে ফেলার ফলাফল। যদি এক বা একাধিক নাল মান মুছে ফেলা হয়, তবে একটি সমাপ্তির শর্ত উত্থাপিত হবে: সতর্কতা-


73

এসকিউএল সার্ভারে, এই বিবৃতিগুলি একই পরিকল্পনা দেয়।

জনপ্রিয় মতামতের বিপরীতে, ওরাকলে তারাও করেন।

SYS_GUID() ওরাকল ইন বেশ গণনা নিবিড় ফাংশন।

আমার পরীক্ষার ডাটাবেসে সারি t_evenসহ একটি টেবিল1,000,000

এই ক্যোয়ারী:

SELECT  COUNT(SYS_GUID())
FROM    t_even

জন্য রান 48সেকেন্ড, যেহেতু ফাংশন চাহিদা প্রতিটি নির্ণয় করা SYS_GUID()এটি একটি নয় নিশ্চিত করতে ফিরে NULL

তবে এই ক্যোয়ারী:

SELECT  COUNT(*)
FROM    (
        SELECT  SYS_GUID()
        FROM    t_even
        )

2কয়েক সেকেন্ডের জন্য চলে , যেহেতু এটি মূল্যায়নের চেষ্টাও করে না SYS_GUID()( *তর্ক করার পরেও COUNT(*))


SYS_GUID()সাব-কোয়েরির ফলাফল ফেরত দেওয়ার জন্য একবারে এটি কমপক্ষে (মানে ঠিক, ঠিক) মূল্যায়ন করা উচিত , তাই না?
asgs

@ এসএসএস: আপনি কেন এমন ভাবছেন? কীভাবে COUNT(*)মূল্যবোধের উপর নির্ভর করে SYS_GUID?
কাসনসুই

এখন যে আপনি জিজ্ঞাসা, আমি নিশ্চিত না। আমি ভেবেছিলাম COUNT(*)চালানোর জন্য, এটির একটি টেবিলের প্রয়োজন, তাই সাব-কোয়েরির মতো হওয়া উচিত। অন্যথায়, আমি COUNT(*)একটি অর্থবহ মানটি ফেরত দেওয়ার কোনও উপায় দেখতে পাচ্ছি না
asgs

1
@ এসএএসএস: এই mapপদ্ধতিটি কী করে তা আপনি ধরে নিয়েছেন, আপনি কী দেখেন যে এই দুটি এক্সপ্রেশনটি কীভাবে: t_even.map(() => sys_guid()).lengthএবং t_even.lengthসর্বদা একই মানটি ফেরত দেবে? ওরাকলের অপ্টিমাইজারটি এটি দেখতে এবং mapঅংশটি অপ্টিমাইজ করার জন্য যথেষ্ট স্মার্ট ।
কাসনসুই

1
@ ঠিকঠাক কেবলমাত্র একটি ছোট্ট সংশোধন: সংগ্রহটি কী কী উপাদানগুলির উপাদানগুলির সংখ্যার উপর lengthনির্ভর করে তা পুরোপুরি নির্ভর করে না । যদি এই নম্বরটি সংগ্রহের মেটাডেটাতে সংরক্ষণ করা হয় (এটি ওরাকল বা বেশিরভাগ আধুনিক আরডিবিএমএসের ক্ষেত্রে নয় তবে এটি পুরানো মাইএসকিউএলের স্টোরেজ ইঞ্জিন, মাইআইএসএএম এর ক্ষেত্রে) তবে কেবল মেটাডেটা থেকে মানটি নেওয়া দরকার। COUNT(*)
কাসনসুই

65

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


গণনা (1) গণনা (*) এর চেয়ে ধীরে ধীরে থাকলে আমি এটিকে ত্রুটি হিসাবে বিবেচনা করব না। আপনি যদি ডিবিএমগুলিকে 1 এস উত্পাদন করতে এবং শূন্য নয় এমনগুলি গণনা করতে বলেন, তবে হ্যাঁ, এটি রেকর্ড গণনা হিসাবে উত্সাহিত হয়, তবে আপনি dbms আপনার লেখার প্রতিটি বাজে আবিষ্কার সনাক্ত করতে এবং এটি আপনার জন্য অবরুদ্ধ করার প্রত্যাশা করতে পারবেন না।
থর্স্টন কেটনার

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

46

আমি এসকিউএল সার্ভার দলে কাজ করি এবং আমি আশা করি এই থ্রেডের কয়েকটি পয়েন্টটি পরিষ্কারভাবে বলতে পারি (আমি এটি আগে দেখিনি, তাই আমি দুঃখিত যে প্রকৌশল দলটি এর আগে এতটা করেনি)।

প্রথমত, এর মধ্যে কোন শব্দার্থিক পার্থক্য নেই select count(1) from tableবনাম select count(*) from table। তারা সব ক্ষেত্রে একই ফলাফল ফেরত দেয় (এবং এটি যদি বাগ না হয় তবে)। অন্যান্য উত্তরে উল্লিখিত হিসাবে, select count(column) from tableশব্দার্থগতভাবে পৃথক এবং সর্বদা হিসাবে একই ফলাফল প্রদান করে না count(*)

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

পরিকল্পনাটি কীভাবে সম্ভাব্য ভিন্ন হতে পারে As এগুলি হওয়ার সম্ভাবনা খুব কম তবে বর্তমান অপ্টিমাইজারের আর্কিটেকচারে এটি সম্ভাব্য। এসকিউএল সার্ভারের অপ্টিমাইজারটি অনুসন্ধান প্রোগ্রাম হিসাবে কাজ করে (মনে করুন: কম্পিউটার প্রোগ্রামটি কোয়েরির বিভিন্ন অংশের জন্য বিভিন্ন বিকল্পের মাধ্যমে দাবা অনুসন্ধান করে এবং যুক্তিসঙ্গত সময়ে সস্তার পরিকল্পনাটি সন্ধান করার জন্য বিকল্পগুলি ব্যয় করে)। যুক্তিসঙ্গত সময়ে কোয়েরি সংকলন সমাপ্ত রাখতে এটি কীভাবে পরিচালনা করে তার এই সন্ধানটির কয়েকটি সীমা রয়েছে। সবচেয়ে তুচ্ছ ছাড়িয়ে যাওয়া প্রশ্নের জন্য, অনুসন্ধানের পর্যায়গুলি রয়েছে এবং তারা কী ব্যয়বহুলভাবে ব্যয় করে যে কোয়েরিটি সম্ভাব্যভাবে সম্পাদন করতে পারে বলে মনে করে তার উপর ভিত্তি করে প্রশ্নের সন্ধানগুলি নিয়ে কাজ করে। এখানে 3 টি মূল অনুসন্ধানের পর্যায় রয়েছে এবং প্রতিটি পর্বে যে কোনও পূর্ববর্তী সমাধানের চেয়ে সস্তা পরিকল্পনা পাওয়ার চেষ্টা করে আরও আক্রমণাত্মক (ব্যয়বহুল) তাত্পর্যপূর্ণ চালানো যেতে পারে। শেষ পর্যন্ত, প্রতিটি পর্বের শেষে একটি সিদ্ধান্ত প্রক্রিয়া রয়েছে যা এটি নির্ধারণ করার চেষ্টা করে যে এটি এখনও পর্যন্ত খুঁজে পাওয়া পরিকল্পনাটি ফিরিয়ে আনবে বা এটি অনুসন্ধান চালিয়ে যাওয়া উচিত কিনা। এই প্রক্রিয়াটি এখনও অবধি পাওয়া মোট সময় ব্যবহার করে বনাম। এখনও অবধি পাওয়া সেরা পরিকল্পনার আনুমানিক ব্যয়। সুতরাং, সিপিইউগুলির বিভিন্ন গতি সহ বিভিন্ন মেশিনে পরবর্তী পর্যায়ে একটি পরিকল্পনা বনাম একটি পরিকল্পনা সহ পূর্ববর্তী পর্যায়ে সময় নির্ধারণের কারণে বিভিন্ন পরিকল্পনা নেওয়া সম্ভব (বিরল হলেও)। শেষ পর্যায়ে সময় নির্ধারণের সাথে সম্পর্কিত এবং খুব ব্যয়বহুল ক্যোয়ারিতে মেমরির বাইরে চলে যাওয়ার সাথে সম্পর্কিত কয়েকটি অনুরূপ পরিস্থিতি রয়েছে যা মেশিনে সমস্ত স্মৃতি গ্রহণ করে (সাধারণত 64-বিটের সমস্যা হয় না তবে এটি একটি বৃহত্তর উদ্বেগ ছিল 32-বিট সার্ভারে ফিরে আসুন)। শেষ পর্যন্ত, আপনি যদি অন্য কোনও পরিকল্পনা পান তবে রানটাইমের সময়কার পারফরম্যান্সটি আলাদা হয়ে যায়। আমি না

নেট-নেট: দয়া করে আপনি দুজনের যেকোন একটিকে ব্যবহারিক আকারে ব্যবহার করুন। (এই বিষয়টিকে ছাড়িয়ে এসকিউএল-তে পারফরম্যান্সকে প্রভাবিত করে এমন অনেক বেশি বড় কারণ রয়েছে)।

আশা করি এটা কাজে লাগবে. অপ্টিমাইজার কীভাবে কাজ করে সে সম্পর্কে আমি একটি বইয়ের অধ্যায় লিখেছিলাম তবে এটি এখানে পোস্ট করা উপযুক্ত কিনা তা আমি জানি না (যেহেতু আমি এটি থেকে ক্ষুদ্র রয়্যালটি পাই এখনও আমি বিশ্বাস করি)। সুতরাং, পোস্ট দেওয়ার পরিবর্তে আমি ইউ কেতে এসকিউএলবিটসে যে আলাপটি দিয়েছি সে সম্পর্কে একটি লিঙ্ক পোস্ট করব যে কীভাবে উচ্চতর স্তরে অপ্টিমাইজার কাজ করে যাতে আপনি অনুসন্ধানের বিভিন্ন প্রধান পর্যায়গুলি আরও কিছুটা বিশদে দেখতে পারবেন যদি আপনি চান যে সম্পর্কে জানতে। ভিডিও লিঙ্কটি এখানে: https://sqlbit.com/Sessions/Event6/inside_t__ql_server_query_optimizer


2
আমার বিশ্বাস 1এটিও একই সম্প্রসারণের মধ্য দিয়ে যায়। আমি এটিকে পারফেক্ট টেস্টগুলিতে এখানে ভিত্তি করে রেখেছি stackoverflow.com/questions/1597442/…1 কলামের স্তরের অনুমতিগুলি খেলতে গিয়ে অপ্রত্যাশিতভাবে ব্যর্থ হয়ে কোনও প্রশ্নের উত্তরটির উদাহরণও দেখুন
মার্টিন স্মিথ

21

এসকিউএল -২২ স্ট্যান্ডার্ডে COUNT(*)নির্দিষ্টভাবে "টেবিলের এক্সপ্রেশনটির কার্ডিনালিটি" (একটি বেস টেবিল, `ভিউ, উত্পন্ন টেবিল, সিটিই ইত্যাদি) হতে পারে means

আমার ধারণা ধারণাটি COUNT(*)পার্স করা সহজ। অন্য কোনও এক্সপ্রেশন ব্যবহার করার জন্য এটি কোনও কলামের রেফারেন্স না দেয় তা নিশ্চিত করার জন্য পার্সার প্রয়োজন ( COUNT('a')যেখানে aআক্ষরিক এবং COUNT(a)কোথায় aএকটি কলামটি বিভিন্ন ফলাফল দিতে পারে)।

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

এছাড়াও, বিশেষ ক্ষেত্রে SELECT COUNT(*) FROM MyPersistedTable;, চিন্তাভাবনাটি হ'ল ডিবিএমএস সম্ভবত সারণির কার্ডিনালটির জন্য পরিসংখ্যান ধারণ করবে।

সুতরাং, কারণ COUNT(1)এবং COUNT(*)শব্দার্থগতভাবে সমতুল্য, আমি ব্যবহার করি COUNT(*)


1
ডিবিএ.এসইতে আমার উত্তর থেকে এসকিউএল -২২ পাঠ্য লিঙ্ক করা হয়েছে: dba.stackexchange.com/questions/2511/…
gbn


12

আমি আশা করি আশা করি আশা করা যায় যে অদ্ভুত প্রান্তের ক্ষেত্রে সত্যিকারের কোনও পার্থক্য নেই।

যে কোনও কিছুর সাথেই বলার একমাত্র আসল উপায় হল আপনার নির্দিষ্ট কেসগুলি পরিমাপ করা।

বলেছিল, আমি সবসময় ব্যবহার করেছি COUNT(*)


গৃহীত উত্তর অনুযায়ী, এমএস এসকিউএল-র ক্ষেত্রে এটি সত্য নয় - দুজনের মধ্যে আসলে কোনও পার্থক্য নেই।
ডেভিড ম্যানহিম

10

এই প্রশ্নটি বার বার আসার সাথে সাথে এখানে আরও একটি উত্তর দেওয়া হল। আমি এখানে "সেরা অনুশীলন" সম্পর্কে অবাক হয়ে নতুনদের জন্য কিছু যুক্ত করার আশাবাদী।

SELECT COUNT(*) FROM something রেকর্ড গণনা করা যা একটি সহজ কাজ।

SELECT COUNT(1) FROM something রেকর্ড প্রতি 1 জন পুনরুদ্ধার করে এবং 1 টি যে শূন্য নয় তা গণনা করে যা মূলত রেকর্ড গণনা করা হয় কেবল আরও জটিল।

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

তবে পাঠযোগ্যতার দিক থেকে আপনার প্রথম বক্তব্যটি ব্যবহার করা উচিত। আপনি রেকর্ডগুলি গণনা করতে চান, তাই রেকর্ডগুলি গণনা করুন, অভিব্যক্তি নয়। আপনি যখন কোনও কিছুর অকার্যকর ঘটনাগুলি গণনা করতে চান কেবল তখনই COUNT (এক্সপ্রেশন) ব্যবহার করুন।


8

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

আমার টেবিল স্কিমা:

CREATE TABLE [dbo].[employee](
    [Id] [bigint] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](50) NOT NULL,
 CONSTRAINT [PK_employee] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

Employeeসারণীতে রেকর্ডের মোট সংখ্যা : 178090131 (178 মিলিয়ন ডলার সারি)

প্রথম প্রশ্ন:

Set Statistics Time On
Go    
Select Count(*) From Employee
Go    
Set Statistics Time Off
Go

প্রথম প্রশ্নের ফলাফল:

 SQL Server parse and compile time: 
 CPU time = 0 ms, elapsed time = 35 ms.

 (1 row(s) affected)

 SQL Server Execution Times:
   CPU time = 10766 ms,  elapsed time = 70265 ms.
 SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.

দ্বিতীয় প্রশ্ন:

    Set Statistics Time On
    Go    
    Select Count(1) From Employee
    Go    
    Set Statistics Time Off
    Go

দ্বিতীয় প্রশ্নের ফলাফল:

 SQL Server parse and compile time: 
   CPU time = 14 ms, elapsed time = 14 ms.

(1 row(s) affected)

 SQL Server Execution Times:
   CPU time = 11031 ms,  elapsed time = 70182 ms.
 SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 0 ms.

আপনি দেখতে পাচ্ছেন 83 (= 70265 - 70182) মিলিসেকেন্ডের পার্থক্য রয়েছে যা সহজেই সময় অনুসন্ধানের সময় সঠিক সিস্টেমের শর্তে দায়ী করা যেতে পারে। এছাড়াও আমি একটি রান করেছি, তাই আমি যদি বেশ কয়েকটি রান করি এবং কিছু গড় গড় করি তবে এই পার্থক্যটি আরও সঠিক হয়ে উঠবে। যদি এত বড় ডেটা-সেট করার জন্য পার্থক্যটি 100 মিলিসেকেন্ডের চেয়ে কম আসে তবে আমরা সহজেই উপসংহারে পৌঁছাতে পারি যে দুটি প্রশ্নের জন্য এসকিউএল সার্ভার ইঞ্জিন দ্বারা প্রদর্শিত পারফরম্যান্সের পার্থক্য নেই।

দ্রষ্টব্য : র‌্যাম উভয় রানেই 100% ব্যবহারের কাছাকাছি চলেছে। দুটি রান শুরু করার আগেই আমি এসকিউএল সার্ভার পরিষেবা পুনরায় চালু করেছি।


7
SET STATISTICS TIME ON

select count(1) from MyTable (nolock) -- table containing 1 million records. 

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

select count(*) from MyTable (nolock) -- table containing 1 million records. 

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

আমি এই কয়েকবার দৌড়েছি, প্রতিবার ক্যাশে সাফ করে দিয়েছি .. ফলাফলগুলি সময়ে সময়ে সার্ভারের লোডের পরিবর্তনের সাথে পরিবর্তিত হয়, তবে প্রায়শই সবসময় count(*)সিপিইউর বেশি সময় থাকে।


14
আমি এটি পুনরুত্পাদন করতে পারি না। count(*)এবং count(1)আমার এসকিউএল ২০০৮ উদাহরণস্বরূপ, 4.5 মিলিয়ন সারি দিয়ে একটি সারণী গণনা করার সময়ও একে অপরের কয়েক এমএসের মধ্যে ফলাফলগুলি ফেরত পাঠান।
জেফ আতউড

2
কখনও কখনও, কিছু সিস্টেমে, বিবৃতিটি সর্বদা দ্রুত চালিত হয় ... আপনি যে ক্রমটি চালিত সেটিকে আপনি এলোমেলো করে দিয়েছেন?
জোসেফডোগি

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

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

3

একটা হল নিবন্ধ দেখাচ্ছে যে COUNT(1)উপর ওরাকল শুধু উপনাম হল COUNT(*), একটি সঙ্গে প্রমাণ যে সম্পর্কে।

আমি কিছু অংশ উদ্ধৃত করব:

ডাটাবেস সফ্টওয়্যারটির একটি অংশ রয়েছে যার নাম "দি অপটিমাইজার", যা অফিসিয়াল ডকুমেন্টেশনে "বিল্ট-ইন ডাটাবেস সফটওয়্যার হিসাবে সংজ্ঞায়িত করা হয়েছে যা এসকিউএল স্টেটমেন্ট কার্যকর করার সবচেয়ে কার্যকর উপায় নির্ধারণ করে"।

অপ্টিমাইজারের অন্যতম উপাদানকে বলা হয় "ট্রান্সফরমার", যার ভূমিকাটি নির্ধারণ করার জন্য যে মূল এসকিউএল বিবৃতিটি শব্দার্থগত সমতুল্য এসকিউএল বিবৃতিতে আরও দক্ষ হতে পারে তা আবার লিখতে সুবিধাজনক কিনা determine

আপনি কি COUNT (1) ব্যবহার করে কোনও ক্যোয়ারী লেখার সময় অপ্টিমাইজারটি কী করবেন তা দেখতে চান?

সঙ্গে একটি ব্যবহারকারীর সাথে ALTER SESSIONবিশেষাধিকার, আপনি একটি লাগাতে পারেন tracefile_identifier, অপটিমাইজার হদিশ সক্ষম এবং চালানোর COUNT(1)নির্বাচন মত: SELECT /* test-1 */ COUNT(1) FROM employees;

এর পরে, আপনার ট্রেস ফাইলগুলি স্থানীয়করণ করা দরকার, কী কী করা যায় SELECT VALUE FROM V$DIAG_INFO WHERE NAME = 'Diag Trace';। পরে ফাইলটিতে আপনি পাবেন:

SELECT COUNT(*) COUNT(1)” FROM COURSE”.”EMPLOYEES EMPLOYEES

আপনি দেখতে পাচ্ছেন, এটির জন্য কেবল একটি উপনাম COUNT(*)

আরেকটি গুরুত্বপূর্ণ মন্তব্য: ওরাকল 7.৩ এর আগে ওরাকলে দুই দশক আগেCOUNT(*) সত্যই দ্রুত ছিল :

গণনা (1) count.৩ থেকে গণনাতে (*) পুনর্লিখন করা হয়েছে কারণ ওরাকল পৌরাণিক বিবৃতিগুলিকে অটো-টিউন করতে পছন্দ করে। পূর্বের ওরাকল In-এ, ওরাকলকে DETERMINISTIC এবং NON-DETERMINISTIC এর অস্তিত্বের আগে প্রতিটি ক্রমের জন্য (1) মূল্যায়ন করতে হয়েছিল।

সুতরাং দুই দশক আগে, গণনা (*) দ্রুত ছিল

এসকিএল সার্ভার হিসাবে অন্য ডাটাবেসের জন্য, এটি প্রত্যেকের জন্য পৃথকভাবে গবেষণা করা উচিত।

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


1

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

আমি চলমান অবস্থায় 1M সারিগুলির জন্য 10% পারফরম্যান্সের পার্থক্য পেয়েছি:

-- Faster
SELECT COUNT(*) FROM t;

-- 10% slower
SELECT COUNT(1) FROM t;

0

COUNT (1) মোটেও COUNT (*) থেকে আলাদা নয়। ন্যূন্য কলামগুলি গণনা করার প্রশ্নে, এটি COUNT (*) এবং COUNT (<কিছু কল>) এর মধ্যে পার্থক্যগুলি ডেমো করার জন্য সোজা হতে পারে -

USE tempdb;
GO

IF OBJECT_ID( N'dbo.Blitzen', N'U') IS NOT NULL DROP TABLE dbo.Blitzen;
GO

CREATE TABLE dbo.Blitzen (ID INT NULL, Somelala CHAR(1) NULL);

INSERT dbo.Blitzen SELECT 1, 'A';
INSERT dbo.Blitzen SELECT NULL, NULL;
INSERT dbo.Blitzen SELECT NULL, 'A';
INSERT dbo.Blitzen SELECT 1, NULL;

SELECT COUNT(*), COUNT(1), COUNT(ID), COUNT(Somelala) FROM dbo.Blitzen;
GO

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