คำตอบที่บ้าอย่างแท้จริง แต่ถ้าคุณมีระบบการจำลองแบบบางประเภท (สำหรับระบบที่มีพันล้านแถวฉันหวังว่าคุณจะทำ) คุณสามารถใช้ตัวประมาณคร่าวๆได้ (เช่น MAX(pk)
) หารค่านั้นด้วยจำนวนทาส คุณมีให้เรียกใช้แบบสอบถามหลายขนาน
ส่วนใหญ่คุณจะแบ่งการค้นหาข้ามทาสโดยใช้คีย์ที่ดีที่สุด (หรือคีย์หลักที่ฉันเดา) ในลักษณะนี้ (เราจะใช้ 250000000 เป็น Rows / Slaves ของเรา):
-- First slave
SELECT COUNT(pk) FROM t WHERE pk < 250000000
-- Ith slave where 2 <= I <= N - 1
SELECT COUNT(pk) FROM t WHERE pk >= I*250000000 and pk < (I+1)*250000000
-- Last slave
SELECT COUNT(pk) FROM t WHERE pk > (N-1)*250000000
แต่คุณต้องการ SQL เท่านั้น ช่างเป็นอะไร เอาล่ะสมมติว่าคุณเป็นนักทำโทษด้านจิตใจ ในต้นแบบ (หรือทาสที่ใกล้เคียงที่สุด) คุณอาจต้องการสร้างตารางสำหรับสิ่งนี้:
CREATE TABLE counter_table (minpk integer, maxpk integer, cnt integer, slaveid integer)
ดังนั้นแทนที่จะมีตัวเลือกที่ทำงานอยู่ในทาสของคุณคุณจะต้องทำการแทรกคล้ายกับสิ่งนี้:
INSERT INTO counter_table VALUES (I*25000000, (I+1)*250000000, (SELECT COUNT(pk) FROM ... ), @@SLAVE_ID)
คุณอาจพบปัญหาเกี่ยวกับทาสที่เขียนลงในตารางบนต้นแบบ คุณอาจต้องเศร้ามากขึ้น - ฉันหมายถึงความคิดสร้างสรรค์:
-- A table per slave!
INSERT INTO counter_table_slave_I VALUES (...)
ในที่สุดคุณควรมีทาสที่มีอยู่ล่าสุดในเส้นทางผ่านกราฟการจำลองที่เกี่ยวข้องกับทาสคนแรก ทาสนั้นควรมีค่าตัวนับอื่นทั้งหมดและควรมีค่าของตัวเอง แต่เมื่อคุณทำเสร็จอาจมีการเพิ่มแถวดังนั้นคุณต้องแทรกอีกอันเพื่อชดเชย max pk ที่บันทึกไว้ใน counter_table ของคุณและ max pk ปัจจุบัน
ณ จุดนี้คุณจะต้องทำฟังก์ชั่นรวมเพื่อหาว่าแถวรวมคืออะไร แต่จะง่ายกว่าเนื่องจากคุณจะเรียกใช้งานได้มากที่สุดในแถว "จำนวนทาสที่คุณมีและเปลี่ยน"
หากคุณอยู่ในสถานการณ์ที่คุณมีตารางแยกกันในทาสคุณสามารถUNION
รับแถวทั้งหมดที่คุณต้องการ
SELECT SUM(cnt) FROM (
SELECT * FROM counter_table_slave_1
UNION
SELECT * FROM counter_table_slave_2
UNION
...
)
หรือคุณรู้ว่าเป็นบ้าน้อยลงและย้ายข้อมูลของคุณไปยังระบบประมวลผลแบบกระจายหรืออาจใช้โซลูชันคลังข้อมูล (ซึ่งจะทำให้คุณมีข้อมูลที่น่าประทับใจในอนาคตเช่นกัน)
โปรดทราบว่าสิ่งนี้ขึ้นอยู่กับการตั้งค่าการจำลองแบบของคุณเป็นอย่างดี เนื่องจากคอขวดหลักมักจะเป็นที่จัดเก็บข้อมูลแบบถาวรถ้าคุณมีที่เก็บข้อมูลที่ไม่สะดวกหรือที่เก็บข้อมูลที่แยกจากกันด้วยเสียงเพื่อนบ้านที่หนักหน่วงSELECT COUNT(*) ...
แต่ถ้าคุณมีการจำลองแบบที่ดีการเพิ่มความเร็วของคุณควรเกี่ยวข้องโดยตรงกับจำนวนหรือทาส อันที่จริงถ้าใช้เวลา 10 นาทีในการเรียกใช้คิวรีการนับเพียงอย่างเดียวและคุณมี 8 ทาสคุณจะต้องลดเวลาของคุณให้เหลือน้อยกว่าสองนาที อาจใช้เวลาหนึ่งชั่วโมงเพื่อรีดรายละเอียดของโซลูชันนี้
แน่นอนว่าคุณจะไม่ได้รับคำตอบที่ถูกต้องอย่างน่าอัศจรรย์เพราะการแก้ปัญหาแบบกระจายนี้แนะนำเวลาเล็กน้อยที่สามารถลบและแทรกแถวได้ แต่คุณสามารถลองรับการล็อคแบบกระจายแถวในเวลาเดียวกันและรับจำนวนที่แม่นยำ ของแถวในตารางสำหรับช่วงเวลาเฉพาะ
ที่จริงดูเหมือนว่าเป็นไปไม่ได้เนื่องจากโดยทั่วไปแล้วคุณติดอยู่กับโซลูชัน SQL เท่านั้นและฉันไม่คิดว่าคุณมีกลไกในการเรียกใช้คิวรีที่มีการแบ่งส่วนและถูกล็อกในหลาย ๆ ทาสทันที บางทีถ้าคุณควบคุมไฟล์บันทึกการจำลองข้อมูล ... ซึ่งหมายความว่าคุณกำลังปั่นทาสเพื่อจุดประสงค์นี้ซึ่งไม่ต้องสงสัยเลยว่าช้ากว่าการเรียกใช้คิวรีการนับบนเครื่องเดียวต่อไป
ดังนั้นมีสองเพนนีปี 2013 ของฉัน