Si tengo dos columnas, una con cardinalidad muy alta y otra con cardinalidad muy baja (número único de valores), ¿importa en qué orden agrupe?
He aquí un ejemplo:
select
dimensionName,
dimensionCategory,
sum(someFact)
from SomeFact f
join SomeDim d on f.dimensionKey = d.dimensionKey
group by
d.dimensionName, -- large number of unique values
d.dimensionCategory -- small number of unique values
¿Hay situaciones en las que importa?
sql
sql-server
group-by
Jeff Albóndiga Yang
fuente
fuente
Respuestas:
No, el orden no importa para la cláusula GROUP BY.
MySQL y SQLite son las únicas bases de datos que conozco que le permiten seleccionar columnas que se omiten del grupo por (no estándar, no portátil) pero el orden tampoco importa allí.
fuente
SQL es declarativo.
En este caso, le ha dicho al optimizador cómo desea que se agrupen los datos y éste resuelve cómo hacerlo.
No evaluará línea por línea (procedimiento) y verá una columna primero
El orden de las columnas del lugar principal es para los índices.
col1, col2
no es lo mismo quecol2, col1
. En absoluto.fuente
Existe una característica heredada y no estándar de Microsoft SQL Server llamada ROLLUP. ROLLUP es una extensión de la sintaxis GROUP BY y cuando se usa, el orden de las columnas GROUP BY determina qué columnas deben agruparse en el resultado. Sin embargo, ROLLUP está en desuso. La alternativa estándar de SQL es utilizar conjuntos de agrupación, que es compatible con SQL Server 2008 y versiones posteriores.
fuente
Dado que esto no se ha mencionado aquí. Las respuestas anteriores son correctas, es decir, el orden de las columnas después de la cláusula "agrupar por" no afectará la exactitud de la consulta (es decir, el monto total).
Sin embargo, el orden de las filas que se recuperan variará según el orden de las columnas especificadas después de la cláusula "agrupar por". Por ejemplo, considere la tabla
A
con las siguientes filas:SELECT *, SUM(Col3) FROM A GROUP BY Col2, Col1
recuperará filas ordenadas por elCol2
en orden ascendente.Ahora cambie el orden de la columna en el grupo por a
Col1, Col2
. Las filas recuperadas se ordenan asc porCol1
.es decir
select *, sum(Col3) from A group by Col1, Col2
Nota: El monto total (es decir, la exactitud de la consulta) permanece exactamente igual.
fuente
Si tengo dos columnas, una con cardinalidad muy alta y otra con cardinalidad muy baja (número único de valores), ¿importa en qué orden agrupe?
Consulta-1
SELECT spec_id, catid, spec_display_value, COUNT(*) AS cnt FROM tbl_product_spec GROUP BY spec_id, catid, spec_display_value ;
Consulta-2
SELECT spec_id, catid, spec_display_value, COUNT(*) AS cnt FROM tbl_product_spec FORCE INDEX(idx_comp_spec_cnt) GROUP BY catid, spec_id,spec_display_value;
Ambos son iguales, el orden no funciona en grupo por cláusula.
fuente