Se eu tiver duas colunas, uma com cardinalidade muito alta e outra com cardinalidade muito baixa (número único de valores), faz diferença em que ordem eu agrupo?
Aqui está um exemplo:
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
Existem situações em que é importante?
sql
sql-server
group-by
Jeff Meatball Yang
fonte
fonte
Respostas:
Não, a ordem não importa para a cláusula GROUP BY.
MySQL e SQLite são os únicos bancos de dados que conheço que permitem selecionar colunas que são omitidas do grupo por (não padrão, não portátil), mas a ordem também não importa.
fonte
SQL é declarativo.
Nesse caso, você disse ao otimizador como deseja que os dados sejam agrupados e ele sabe como fazer isso.
Ele não avaliará linha por linha (procedural) e olhará para uma coluna primeiro
O principal lugar que a ordem das colunas importa são os índices.
col1, col2
não é o mesmo quecol2, col1
. Em absoluto.fonte
Existe um recurso legado e não padrão do Microsoft SQL Server chamado ROLLUP. ROLLUP é uma extensão da sintaxe GROUP BY e, quando usada, a ordem das colunas GROUP BY determina quais colunas devem ser agrupadas no resultado. ROLLUP está obsoleto no entanto. A alternativa do SQL padrão é usar conjuntos de agrupamento, que são suportados pelo SQL Server 2008 e versões posteriores.
fonte
Uma vez que isso não foi mencionado aqui. As respostas acima estão corretas, ou seja, a ordem das colunas após a cláusula "agrupar por" não afetará a exatidão da consulta (ou seja, o valor da soma).
No entanto, a ordem das linhas que estão sendo recuperadas variará com base na ordem das colunas especificadas após a cláusula "agrupar por". Por exemplo, considere a Tabela
A
com as seguintes linhas:SELECT *, SUM(Col3) FROM A GROUP BY Col2, Col1
irá recuperar as linhas ordenadas porCol2
ordem crescente.Agora mude a ordem da coluna no grupo por para
Col1, Col2
. As linhas recuperadas são ordenadas asc porCol1
.ie
select *, sum(Col3) from A group by Col1, Col2
Nota: O valor da soma (ou seja, a exatidão da consulta) permanece exatamente o mesmo.
fonte
Se eu tiver duas colunas, uma com cardinalidade muito alta e outra com cardinalidade muito baixa (número único de valores), faz diferença em que ordem eu agrupo?
Query-1
SELECT spec_id, catid, spec_display_value, COUNT(*) AS cnt FROM tbl_product_spec GROUP BY spec_id, catid, spec_display_value ;
Query-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 são iguais, a ordem não funciona em grupo por cláusula.
fonte