首页 > 解决方案 > SQL Server:按所有列分组

问题描述

我有一个包含 16 列和超过一百万条记录的表(每月将一次性添加大约 20 万条)。

像这样的东西:

+----+------+------+-----+--------+----------------+
| Id | Col2 | Col3 | ... | Col 15 | Numeric Column |
+----+------+------+-----+--------+----------------+
|  1 | xxx  | xxx  | ... | xxx    |             10 |
|  2 | yyy  | yyy  | ... | yyy    |             20 |
|  3 | zzz  | zzz  | ... | zzz    |             30 |
|  4 | xxx  | xxx  | ... | xxx    |             40 |
+----+------+------+-----+--------+----------------+

大多数记录都是唯一的,但也有重复。考虑到每一列,我需要在此表上创建一个聚合这些重复行的视图。汇总记录时,我需要显示最后一个数字列的 SUM。例如,我的视图需要聚合记录 1 和 4。预期结果是(注意 SUM 为 50 (10+40)):

+------+------+-----+--------+-----------------------+------------------------------+
| Col2 | Col3 | ... | Col 15 | Sum Of Numeric Column | Amount Of Aggregated Records |
+------+------+-----+--------+-----------------------+------------------------------+
| xxx  | xxx  | ... | xxx    |                    50 |                            2 |
| yyy  | yyy  | ... | yyy    |                    20 |                            1 |
| zzz  | zzz  | ... | zzz    |                    30 |                            1 |
+------+------+-----+--------+-----------------------+------------------------------+

我通过以下查询完成了此操作:

SELECT
    [Column 2],
    [Column 3],
    ...,
    [Column 15],
    SUM([Numeric Column]) AS [Sum Of Numeric Column],
    COUNT(*) AS [Amount Of Aggregated Records]
FROM dbo.MyLargeTable WITH (NOLOCK)
GROUP BY [Column 2],
    [Column 3],
    ...,
    [Column 15]

此视图将作为其他视图的基础视图,这些视图需要聚合数据。这意味着它需要非常快。我的问题很简单:知道这个视图需要为其他视图提供数据,这是要走的路吗?有没有办法优化这个查询?我可以用索引来安排一些事情吗?

谢谢你。

标签: sql-server

解决方案


据我说,您的查询已经优化,不需要任何进一步的优化。在您的情况下,使用 CTE 只会降低性能。


推荐阅读