SAMPLE permite el procesamiento aproximado de consultas SELECT.
Cuando el muestreo de datos está habilitado, la consulta no se ejecuta sobre todos los datos, sino solo sobre una fracción determinada de ellos (muestra). Por ejemplo, si necesita calcular estadísticas de todas las visitas, basta con ejecutar la consulta sobre 1/10 de todas las visitas y luego multiplicar el resultado por 10.
El procesamiento aproximado de consultas puede ser útil en los siguientes casos:
- Cuando tiene requisitos estrictos de latencia (por ejemplo, inferiores a 100 ms), pero no puede justificar el coste de recursos de hardware adicionales para cumplirlos.
- Cuando sus datos brutos no son precisos, por lo que la aproximación no degrada de forma apreciable la calidad.
- Cuando los requisitos del negocio exigen resultados aproximados (por rentabilidad o para ofrecer resultados exactos a usuarios premium).
Solo puede usar muestreo con tablas de la familia MergeTree, y solo si la expresión de muestreo se especificó durante la creación de la tabla (consulte motor MergeTree).
- El muestreo de datos es un mecanismo determinista. El resultado de la misma consulta
SELECT .. SAMPLEsiempre es el mismo. - El muestreo funciona de forma coherente entre distintas tablas. En tablas con una única clave de muestreo, una muestra con el mismo coeficiente siempre selecciona el mismo subconjunto de datos posibles. Por ejemplo, una muestra de ID de usuario toma filas con el mismo subconjunto de todos los ID de usuario posibles de distintas tablas. Esto significa que puede usar la muestra en subconsultas dentro de la cláusula IN. Además, puede combinar muestras con la cláusula JOIN.
- El muestreo permite leer menos datos del disco. Tenga en cuenta que debe especificar correctamente la clave de muestreo. Para obtener más información, consulte Creación de una tabla MergeTree.
SAMPLE se admite la siguiente sintaxis:
| Sintaxis de la cláusula SAMPLE | Descripción |
|---|---|
SAMPLE k | Aquí, k es un número entre 0 y 1. La consulta se ejecuta sobre una fracción k de los datos. Por ejemplo, SAMPLE 0.1 ejecuta la consulta sobre el 10 % de los datos. Más información |
SAMPLE n | Aquí, n es un entero suficientemente grande. La consulta se ejecuta sobre una muestra de al menos n filas (pero no significativamente más que eso). Por ejemplo, SAMPLE 10000000 ejecuta la consulta sobre un mínimo de 10 000 000 filas. Más información |
SAMPLE k OFFSET m | Aquí, k y m son números entre 0 y 1. La consulta se ejecuta sobre una muestra de una fracción k de los datos. Los datos utilizados para la muestra se desplazan en una fracción m. Más información |
SAMPLE K
k es un número entre 0 y 1 (se admiten tanto la notación fraccionaria como la decimal). Por ejemplo, SAMPLE 1/2 o SAMPLE 0.5.
En una cláusula SAMPLE k, la muestra se toma de la fracción k de los datos. A continuación se muestra un ejemplo:
count() se multiplica manualmente por 10.
SAMPLE N
n es un entero lo bastante grande. Por ejemplo, SAMPLE 10000000.
En este caso, la consulta se ejecuta sobre una muestra de al menos n filas (pero no de muchas más). Por ejemplo, SAMPLE 10000000 ejecuta la consulta sobre un mínimo de 10,000,000 filas.
Como la unidad mínima de lectura de datos es un gránulo (su tamaño se define mediante la configuración index_granularity), tiene sentido establecer una muestra mucho mayor que el tamaño del gránulo.
Al usar la cláusula SAMPLE n, no se sabe qué porcentaje relativo de los datos se procesó. Por lo tanto, no se sabe por qué coeficiente deben multiplicarse las funciones de agregación. Use la columna virtual _sample_factor para obtener un resultado aproximado.
La columna _sample_factor contiene coeficientes relativos que se calculan dinámicamente. Esta columna se crea automáticamente cuando crea una tabla con la clave de muestreo especificada. A continuación se muestran ejemplos de uso de la columna _sample_factor.
Consideremos la tabla visits, que contiene estadísticas sobre las visitas al sitio. El primer ejemplo muestra cómo calcular el número de páginas vistas:
SAMPLE K OFFSET M
k y m son números entre 0 y 1. A continuación se muestran ejemplos.
Ejemplo 1
[++------------]
Ejemplo 2
[------++------]