Kelimenin tam anlamıyla deli bir cevap, ancak bir çeşit çoğaltma sistemi kurduysanız (milyar satırlık bir sistem için, umarım yaparsınız), kaba bir tahminci (örneğin MAX(pk)
) kullanabilirsiniz, bu değeri köle sayısına bölebilirsiniz birkaç sorguyu paralel olarak çalıştırın.
Çoğunlukla, sorguları en iyi anahtara (veya tahmin ettiğim birincil anahtara) dayalı olarak slave'ler arasında bölümlendirirsiniz (Satırlarımız / Kölelerimiz olarak 250000000 kullanacağız):
-- 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
Ancak yalnızca SQL'e ihtiyacınız var. Ne baskın. Tamam, diyelim ki sen bir sadomasochistsin. Master'da (veya en yakın köle), büyük olasılıkla bunun için bir tablo oluşturmanız gerekir:
CREATE TABLE counter_table (minpk integer, maxpk integer, cnt integer, slaveid integer)
Bu yüzden, sadece seçimlerin kölelerinizde çalışması yerine, buna benzer bir ek yapmanız gerekir:
INSERT INTO counter_table VALUES (I*25000000, (I+1)*250000000, (SELECT COUNT(pk) FROM ... ), @@SLAVE_ID)
Efendide bir tabloya yazılan kölelerle ilgili sorunlarla karşılaşabilirsiniz. Daha da üzülmeniz gerekebilir - yani yaratıcı:
-- A table per slave!
INSERT INTO counter_table_slave_I VALUES (...)
Sonunda, ilk slave'e göre çoğaltma grafiğinin kat ettiği yolda en son var olan bir köle olmalıdır. Bu köle artık diğer tüm sayaç değerlerine sahip olmalı ve kendi değerlerine sahip olmalıdır. Ancak bitirdiğinizde, muhtemelen satırlar eklenir, bu nedenle counter_table cihazınıza ve geçerli max pk'nize kaydedilen maksimum pk'yi telafi eden başka bir satır eklemeniz gerekir.
Bu noktada, toplam satırların ne olduğunu bulmak için bir toplama işlevi yapmanız gerekir, ancak bunu en fazla "sahip olduğunuz köle sayısı ve değiştirme" satırlarında çalıştırdığınız için daha kolaydır.
Kölelerde ayrı tabloların olduğu durumdaysanız, UNION
ihtiyacınız olan tüm satırları alabilirsiniz.
SELECT SUM(cnt) FROM (
SELECT * FROM counter_table_slave_1
UNION
SELECT * FROM counter_table_slave_2
UNION
...
)
Ya da, biraz daha az deli olun ve verilerinizi dağıtılmış bir işleme sistemine taşıyın ya da belki de Veri Depolama çözümünü kullanın (bu da gelecekte müthiş veri çöküşü sağlayacaktır).
Unutmayın, bu, çoğaltmanızın ne kadar iyi ayarlandığına bağlıdır. Birincil darboğaz büyük olasılıkla kalıcı depolama olacağından, eğer kirli depolama alanınız veya ağır komşu gürültüsü olan zayıf ayrılmış veri depolarınız varsa, bu muhtemelen tek bir beklemekten daha yavaş çalışacaktırSELECT COUNT(*) ...
Ancak iyi bir çoğaltmanız varsa, hız kazançlarınız doğrudan sayı veya kölelerle ilişkili olmalıdır. Aslında, sayma sorgusunu tek başına çalıştırmak 10 dakika alırsa ve 8 köle varsa, zamanınızı birkaç dakikadan daha kısa bir sürede kesersiniz. Bu çözümün ayrıntılarını ütülemek için belki bir saat.
Tabii ki, asla gerçekten inanılmaz doğru bir cevap alamazsınız çünkü bu dağıtılmış çözme, satırların silinebileceği ve eklenebileceği biraz zaman tanıtır, ancak aynı örnekte dağıtılmış bir satır kilidi elde etmeye ve kesin bir sayı elde etmeye çalışabilirsiniz. tablodaki satırların belirli bir an için
Aslında, bu sadece imkansız görünüyor, çünkü temelde sadece SQL çözümüyle sıkışıp kaldınız ve anında birden fazla köle arasında parçalanmış ve kilitli bir sorgu çalıştırmak için bir mekanizma sağlandığınızı düşünmüyorum. Belki çoğaltma günlük dosyasını denetlemiş olsaydınız ... bu da tam anlamıyla köleleri bu amaçla döndürdüğünüz anlamına gelir, bu da hiç kuşkusuz tek bir makinede sayım sorgusunu çalıştırmaktan daha yavaştır.
Benim iki 2013 peni var.