Una respuesta literalmente loca, pero si tienes algún tipo de sistema de replicación configurado (para un sistema con mil millones de filas, espero que lo hagas), puedes usar un estimador aproximado (como MAX(pk)
), divide ese valor por el número de esclavos tienes, ejecuta varias consultas en paralelo.
En su mayor parte, dividiría las consultas entre esclavos en función de la mejor clave (o la clave principal, supongo), de esa manera (vamos a utilizar 250000000 como nuestras filas / esclavos):
-- 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
Pero solo necesita SQL. Que busto. Ok, digamos que eres un sadomasoquista. En el maestro (o esclavo más cercano) lo más probable es que necesite crear una tabla para esto:
CREATE TABLE counter_table (minpk integer, maxpk integer, cnt integer, slaveid integer)
Entonces, en lugar de solo tener las selecciones ejecutándose en sus esclavos, tendría que hacer una inserción, similar a esto:
INSERT INTO counter_table VALUES (I*25000000, (I+1)*250000000, (SELECT COUNT(pk) FROM ... ), @@SLAVE_ID)
Puede tener problemas con los esclavos que escriben en una tabla en master. Es posible que necesite obtener aún más sadis, quiero decir, creativo:
-- A table per slave!
INSERT INTO counter_table_slave_I VALUES (...)
Al final, debe tener un esclavo que exista en último lugar en la ruta recorrida por el gráfico de replicación, en relación con el primer esclavo. Ese esclavo ahora debería tener todos los demás valores de contador, y debería tener sus propios valores. Pero para cuando haya terminado, probablemente haya filas agregadas, por lo que tendría que insertar otra que compense el max pk registrado en su counter_table y el max pk actual.
En ese punto, tendrías que hacer una función de agregado para determinar cuáles son las filas totales, pero eso es más fácil ya que lo estarías ejecutando en la mayoría de las filas de "número de esclavos que tienes y cambias".
Si se encuentra en una situación en la que tiene tablas separadas en los esclavos, puede UNION
obtener todas las filas que necesita.
SELECT SUM(cnt) FROM (
SELECT * FROM counter_table_slave_1
UNION
SELECT * FROM counter_table_slave_2
UNION
...
)
O ya sabe, sea un poco menos loco y migre sus datos a un sistema de procesamiento distribuido, o tal vez use una solución de Data Warehousing (que también le proporcionará una increíble capacidad de procesamiento de datos en el futuro).
Tenga en cuenta que esto depende de qué tan bien esté configurada su replicación. Dado que el cuello de botella principal probablemente sea el almacenamiento persistente, si tiene un almacenamiento inadecuado o almacenes de datos mal segregados con un fuerte ruido vecino, esto probablemente lo hará más lento que solo esperar un soloSELECT COUNT(*) ...
Pero si tiene una buena replicación, sus ganancias de velocidad deben estar directamente relacionadas con el número o los esclavos. De hecho, si lleva solo 10 minutos ejecutar la consulta de conteo y tiene 8 esclavos, reduciría su tiempo a menos de un par de minutos. Tal vez una hora para resolver los detalles de esta solución.
Por supuesto, nunca obtendría una respuesta increíblemente precisa, ya que esta solución distribuida introduce un poco de tiempo en el que las filas se pueden eliminar e insertar, pero puede intentar obtener un bloqueo distribuido de filas en la misma instancia y obtener un recuento preciso de las filas en la tabla para un momento particular en el tiempo.
En realidad, esto parece imposible, ya que básicamente está atrapado con una solución solo de SQL, y no creo que haya proporcionado un mecanismo para ejecutar una consulta fragmentada y bloqueada a través de múltiples esclavos, instantáneamente. Tal vez si tuviera el control del archivo de registro de replicación ... lo que significa que literalmente estaría haciendo girar esclavos para este propósito, lo que sin duda es más lento que simplemente ejecutar la consulta de conteo en una sola máquina de todos modos.
Así que ahí están mis dos centavos de 2013.