【发布时间】:2016-07-25 06:29:50
【问题描述】:
我有这样的观点vMobileHistory_MobileRegion,就像:
strUnitID strDate strTime iMobileHistory isValidRegion
---------------------------------------------------------------
352848028160311 1394/11/01 10:35:16 33029937 0
352848028160311 1394/11/01 10:35:17 33029938 0
352848028160311 1394/11/01 10:35:18 33029939 1
352848028160311 1394/11/01 10:35:19 33029940 1
352848028160311 1394/11/01 10:35:20 33029941 1
352848028160311 1394/11/01 10:35:22 33029942 0
352848028160311 1394/11/01 10:35:25 33029943 0
352848028160311 1394/11/01 10:35:28 33029944 0
352848028160311 1394/11/01 10:35:34 33029945 1
352848028160311 1394/11/01 10:35:35 33029946 1
索引是:
ClusterdIndex, strUnitID ASC, strDate DESC, strTime DESC
NonClusterdIndex, iMobileHistory ASC
NonClusterdIndex, strDate ASC, strTime ASC
NonClusterdIndex, strUnitID ASC, strDate ASC
我有这个查询是对基于连续值“isValidRegion”的行进行分组
SELECT
strUnitID,
strDate,
strTime,
isValidRegion,
iMobileHistory,
(ROW_NUMBER () OVER (PARTITION BY strUnitId ORDER BY strDate, strTime)
-
ROW_NUMBER () OVER (PARTITION BY strUnitId, isValidRegion ORDER BY strDate, strTime)
) AS grp
FROM
vMobileHistory_MobileRegion
GROUP BY
strUnitID, strDate, isValidRegion, grp
问题是vMobileHistory_MobileRegion 有超过 100M 的行,并且在其上使用 ROW_NUMBER() 会导致计算所有行的 ROW_NUMBER(),这真的很慢,并导致在 tempdb 中排序数据,因为大数据不适合在记忆中。
不使用ROW_NUMBER()还有其他方法吗?
实际上,我需要isValidRegion的每个连续值的持续时间
【问题讨论】:
-
你想用 row_number 函数计算什么?
-
这是计算两个不同分区的RowNumber的差异,以了解“isValidRegion”是否连续
-
你有索引吗?主要性能问题不是
ROW_NUMBER(),排序100M记录很慢。 -
其实我需要isValidRegion的每个连续值的持续时间
-
Paweł Dyl:是的,我有索引,问题是排序 100M 记录会导致操作员将数据溢出到 tempdb,这真的很慢。如果有帮助,我可以发布实际执行计划
标签: sql-server performance common-table-expression