"সমস্ত মৌলিক সংখ্যা (1-100)" মুদ্রণের দ্রুততম ও সহজতম উপায়টি হ'ল মূল সংখ্যাটি একটি পরিচিত, সীমাবদ্ধ এবং অপরিবর্তিত মানের মূল্যগুলির সেট ("পরিচিত" এবং "সীমাবদ্ধ" একটিটির মধ্যে রয়েছে তা পুরোপুরি আলিঙ্গন করা a অবশ্যই নির্দিষ্ট পরিসীমা)। স্কেলের এই ক্ষুদ্রতম সময়ে, কেন প্রতিটি সময়ই সিপিইউ নষ্ট করে দেয় যা বহুদিন ধরে জ্ঞাত ছিল এমন একগুচ্ছ মানগুলি গণনা করতে এবং সঞ্চয় করার জন্য খুব কমই কোনও স্মৃতি গ্রহণ করে?
SELECT tmp.[Prime]
FROM (VALUES (2), (3), (5), (7), (11), (13),
(17), (19), (23), (29), (31), (37), (41),
(43), (47), (53), (59), (61), (67), (71),
(73), (79), (83), (89), (97)) tmp(Prime)
অবশ্যই, যদি আপনার 1 এবং 100 এর মধ্যে মৌলিক সংখ্যাগুলি গণনা করার প্রয়োজন হয় তবে নিম্নলিখিতটি মোটামুটি দক্ষ:
;WITH base AS
(
SELECT tmp.dummy, ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS [num]
FROM (VALUES (0), (0), (0), (0), (0), (0), (0)) tmp(dummy)
), nums AS
(
SELECT (ROW_NUMBER() OVER (ORDER BY (SELECT 1)) * 2) + 1 AS [num]
FROM base b1
CROSS JOIN base b2
), divs AS
(
SELECT [num]
FROM base b3
WHERE b3.[num] > 4
AND b3.[num] % 2 <> 0
AND b3.[num] % 3 <> 0
)
SELECT given.[num] AS [Prime]
FROM (VALUES (2), (3)) given(num)
UNION ALL
SELECT n.[num] AS [Prime]
FROM nums n
WHERE n.[num] % 3 <> 0
AND NOT EXISTS (SELECT *
FROM divs d
WHERE d.[num] <> n.[num]
AND n.[num] % d.[num] = 0
);
এই ক্যোয়ারীটি কেবল বিজোড় সংখ্যাগুলির পরীক্ষা করে কারণ সংখ্যাগুলি যাইহোক প্রাইম হবে না। এটি 1 - 100 এর সীমাতেও নির্দিষ্ট।
এখন, আপনার যদি একটি গতিশীল পরিসর প্রয়োজন হয় (প্রশ্নের উদাহরণ কোডে যা দেখানো হয়েছে তার সমান) তবে নীচেরটি উপরে থাকা ক্যোয়ারীর অভিযোজন যা এখনও বরং দক্ষ (এটি 1 - 100,000 - 9592 এর পরিসীমা গণনা করেছে) এন্ট্রি - ঠিক 1 সেকেন্ডের নীচে):
DECLARE @RangeStart INT = 1,
@RangeEnd INT = 100000;
DECLARE @HowMany INT = CEILING((@RangeEnd - @RangeStart + 1) / 2.0);
;WITH frst AS
(
SELECT tmp.thing1
FROM (VALUES (0), (0), (0), (0), (0), (0), (0), (0), (0), (0)) tmp(thing1)
), scnd AS
(
SELECT 0 AS [thing2]
FROM frst t1
CROSS JOIN frst t2
CROSS JOIN frst t3
), base AS
(
SELECT TOP( CONVERT( INT, CEILING(SQRT(@RangeEnd)) ) )
ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS [num]
FROM scnd s1
CROSS JOIN scnd s2
), nums AS
(
SELECT TOP (@HowMany)
(ROW_NUMBER() OVER (ORDER BY (SELECT 1)) * 2) +
(@RangeStart - 1 - (@RangeStart%2)) AS [num]
FROM base b1
CROSS JOIN base b2
), divs AS
(
SELECT [num]
FROM base b3
WHERE b3.[num] > 4
AND b3.[num] % 2 <> 0
AND b3.[num] % 3 <> 0
)
SELECT given.[num] AS [Prime]
FROM (VALUES (2), (3)) given(num)
WHERE given.[num] >= @RangeStart
UNION ALL
SELECT n.[num] AS [Prime]
FROM nums n
WHERE n.[num] BETWEEN 5 AND @RangeEnd
AND n.[num] % 3 <> 0
AND NOT EXISTS (SELECT *
FROM divs d
WHERE d.[num] <> n.[num]
AND n.[num] % d.[num] = 0
);
আমার পরীক্ষা (ব্যবহার করে SET STATISTICS TIME, IO ON;
) দেখায় যে এই ক্যোয়ারী প্রদত্ত অন্য দুটি উত্তরের (এখনও অবধি) তুলনায় ভাল সম্পাদন করেছে:
রেঞ্জ: 1 - 100
Query Logical Reads CPU Milliseconds Elapsed Milliseconds
------- ---------------- ---------------- -----------------
Solomon 0 0 0
Dan 396 0 0
Martin 394 0 1
রেঞ্জ: 1 - 10,000
Query Logical Reads CPU Milliseconds Elapsed Milliseconds
------- ---------------- ---------------- -----------------
Solomon 0 47 170
Dan 77015 2547 2559
Martin n/a
রেঞ্জ: 1 - 100,000
Query Logical Reads CPU Milliseconds Elapsed Milliseconds
------- ---------------- ---------------- -----------------
Solomon 0 984 996
Dan 3,365,469 195,766 196,650
Martin n/a
রেঞ্জ: 99,900 - 100,000
দ্রষ্টব্য : এই পরীক্ষাটি চালানোর জন্য আমাকে ড্যানের কোডে একটি বাগ ঠিক করতে @startnum
হয়েছিল - ক্যোয়ারিতে সন্ধান করা হয়নি তাই এটি সর্বদা শুরু হয়েছিল 1
। আমি Dividend.num <= @endnum
সাথে লাইন প্রতিস্থাপন Dividend.num BETWEEN @startnum AND @endnum
।
Query Logical Reads CPU Milliseconds Elapsed Milliseconds
------- ---------------- ---------------- -----------------
Solomon 0 0 1
Dan 0 157 158
Martin n/a
রেঞ্জ: 1 - 100,000 (আংশিক পুনরায় পরীক্ষা)
99,900 - 100,000 পরীক্ষার জন্য ড্যানের ক্যোয়ারী ঠিক করার পরে, আমি লক্ষ্য করেছি যে আরও যৌক্তিক পাঠ্য তালিকাভুক্ত নেই। সুতরাং আমি এখনও এই প্রয়োগটি স্থির করে দিয়ে এই রেঞ্জটির প্রতিবেদন করেছি এবং দেখতে পেয়েছি যে লজিক্যাল রিডগুলি আবার চলে গেছে এবং সময়গুলি কিছুটা ভাল ছিল (এবং হ্যাঁ, একই সংখ্যক সারি ফিরে এসেছিল)।
Query Logical Reads CPU Milliseconds Elapsed Milliseconds
------- ---------------- ---------------- -----------------
Dan 0 179,594 180,096