我最近继承了一些看起来像这样的代码。
SELECT DISTINCT
field1, field2...(600 lines later)... field99
FROM
MillionRowTable
WHERE
EntryDate > @LastWeek
使用distinct
,需要几个小时才能锁定其他人,因为它使用了100%的cpu。没有明显的它会更快但它有重复。
但是我注意到,如果field1和field2与另一行中的field1和field2相同,那么我已经知道它们是重复的,我不需要检查任何其他列。有没有办法只按这两列分组,这样我可以避免重复和4小时运行时间?
答案 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而将人员锁定在数据库之外,那么这是一个完全不同的问题。你应该考虑修复它。