对于搜索页面,我需要前 10 个结果和查询的总结果数。
那部分很简单:
SELECT TOP(10) ... FROM ... WHERE ... ORDER BY ...
SELECT COUNT(*) FROM ... WHERE ...
但它也非常缓慢。两个陈述都需要大约相同的时间。
所以我找到了这个:
SELECT TOP(10) ... FROM ... WHERE ... ORDER BY ...
SELECT @@ROWCOUNT
这将时间缩短了约 50%。伟大的。但不幸的是,返回的行数是 10。如果我删除“TOP(10)”行数是正确的,但时间跨度与原始版本中的时间跨度或多或少相同。(即使我只访问前 10 行。)
这令人沮丧,因为总行数信息必须存在,即使在 TOP(10) 版本中也是如此。(至少我是这么认为的,因为我们使用了一个非常复杂的 ORDER BY 子句,用 3 个“CASE”条件将空数据排到底)
有没有一种有效的方法来获得两者?TOP(10) 数据和总数?
如果您的 ORDER BY 和 WHERE 子句很复杂,那么建议的解决方案应该将时间缩短一半:
1. 为间歇性结果创建一个新表(它可以是临时表、表变量或带有会话 id 标记和 schema_only 设置的内存优化表) .
2. 将源查询中的所有行插入此表,包括 order by 表达式作为附加列。
3. 从这个新表中运行您的计数和前 10 个查询。