我有两个表,其中有数百万条记录。我需要在这些表上应用排序、分页(最多 100 条记录)和联接。查询需要 3-8 秒才能给出结果。请建议更好的方法
这是我的询问:
; WITH TempResult AS ( SELECT ROW_NUMBER() OVER( ORDER BY col1 desc ) AS Row, col12 FROM table1 po WITH (NOLOCK) INNER JOIN table2 PV WITH(NOLOCK) on po.col2=PV.col3 WHERE PV.col1 = 70 AND PV.col4 in(11, 73, 74, 75, 76, 77, 79, 80) AND PV.col5 IN (23) ) SELECT *,4910093 AS TotalRows FROM TempResult WHERE Row >= 1 AND Row <=100
使用您目前提供的内容...
从
IN
中删除了 PV.col5
并更改为 =
。
在第二个 WHERE 子句中添加了
BETWEEN
。
; WITH TempResult AS (
SELECT ROW_NUMBER() OVER(ORDER BY col1 DESC) AS Row, col12
FROM table1 po WITH (NOLOCK)
INNER JOIN table2 PV WITH(NOLOCK) ON po.col2 = PV.col3
WHERE PV.col1 = 70
AND PV.col4 IN (11, 73, 74, 75, 76, 77, 79, 80)
AND PV.col5 = 23)
SELECT *, 4910093 AS TotalRows
FROM TempResult
WHERE Row BETWEEN 1 AND 100
在表中使用索引。时间可能会急剧下降。
关于以下几点我有2点要与您分享。
更多的索引也可能会影响您的性能。请识别并删除表中未使用的索引。
如果您使用索引视图,那么您可以将结果集存储在 tempdb 中,并且当用户再次执行查询时可以非常快速地使用和检索结果集。
请参考此链接: http://www.codeproject.com/Articles/199058/SQL-Server-Indexed-Views-Speed-Up-Your-Select-Quer