仅按部分列分组?

时间:2015-11-16 14:39:41

标签: sql-server group-by

我最近继承了一些看起来像这样的代码。

SELECT DISTINCT 
    field1, field2...(600 lines later)... field99
FROM 
    MillionRowTable
WHERE 
    EntryDate > @LastWeek

使用distinct,需要几个小时才能锁定其他人,因为它使用了100%的cpu。没有明显的它会更快但它有重复。

但是我注意到,如果field1和field2与另一行中的field1和field2相同,那么我已经知道它们是重复的,我不需要检查任何其他列。有没有办法只按这两列分组,这样我可以避免重复和4小时运行时间?

1 个答案:

答案 0 :(得分:0)

常用方法是与MAX()MIN()合并:

SELECT field1, field2, MAX(field3) AS field3,...(600 lines later)... MAX(field99) AS field99
FROM MillionRowTable
WHERE EntryDate>@LastWeek
GROUP BY field1, field2

请注意,并非所有数据类型都支持MAX()MIN()(例如,BIT不支持),这可能无法改善您的效果。

使用ROW_NUMBER()的第二种方法也适用,但我不确定它对这么大的数据集的效果如何。

;WITH CTE AS (
    SELECT field1, field2...(600 lines later)... field99
        , ROW_NUMBER() OVER (PARTITION BY field1, field2 ORDER BY (SELECT 1)) rn
    FROM MillionRowTable
    WHERE EntryDate > @LastWeek
)
SELECT field1, field2...(600 lines later)... field99
FROM CTE
WHERE rn = 1;

请注意,您必须使用ROW_NUMBER()订购某些内容。 (SELECT 1)只是不可改变的东西。

如果您因为使用过多的CPU而将人员锁定在数据库之外,那么这是一个完全不同的问题。你应该考虑修复它。