إنه يوم باي! لنحسب قيمة باي باستخدام SQL
عيد Pi سعيد! راودتنا فكرة أن يكون من الممتع حساب pi باستخدام استعلامات SQL في ClickHouse. إليك ما توصّلنا إليه حتى الآن…
- يستخدم هذا المثال table function
numbers_mtفي ClickHouse لإرجاع مليار صف، ولا يستغرق تنفيذ العملية الحسابية سوى 40 مللي ثانية:
SELECT 4 * sum(if(number % 2, -1, 1) / ((number * 2) + 1)) AS pi
FROM numbers_mt(1000000000.)
┌- يعالج المثال التالي أيضًا 1B رقمًا، لكن بوتيرة أبطأ:
SELECT 3 + (4 * sum(if((number % 2) = 0, if((number % 4) = 0, -1 / ((number * (number + 1)) * (number + 2)), 1 / ((number * (number + 1)) * (number + 2))), 0))) AS pi
FROM numbers_mt(2, 10000000000)
┌- هذا بالطبع هو المفضل لدينا في ClickHouse (وهو الأدق أيضًا!):
SELECT pi()
┌- يبدو أن صاحب هذا كان يعرف حساب المثلثات جيدًا:
SELECT 2 * asin(1) AS pi
┌- إليك واجهة برمجة تطبيقات عملية تتيح لك تحديد عدد الخانات التي تريدها:
SELECT *
FROM url('https://api.pi.delivery/v1/pi?start=0&numberOfDigits=100', 'JSONEachRow')
┌- هذه الطريقة ذكية - إذ تستخدم دوال المسافة في ClickHouse:
WITH random_points AS
(
SELECT (rand64(1) / pow(2, 64), rand64(2) / pow(2, 64)) AS point
FROM numbers(1000000000)
)
SELECT (4 * countIf(L2Norm(point) < 1)) / count() AS pi
FROM random_points
┌- إذا كنتَ فيزيائيًا، فستكتفي بهذا:
SELECT 22 / 7
┌- طريقة غير مباشرة أخرى (هذه من Alexey Milovidov) دقيقة حتى 7 منازل عشرية، وهي سريعة:
WITH
10 AS length,
(number / 1000000000.) * length AS x
SELECT pow((2 * length) * avg(exp(-(x * x))), 2) AS pi
FROM numbers_mt(1000000000.)
┌