当我只需要知道是不是超过 1 时,如何优化获取结果计数?

Posted

技术标签:

【中文标题】当我只需要知道是不是超过 1 时,如何优化获取结果计数?【英文标题】:How do I optimize getting the result count when I just need to know if there is more than 1?当我只需要知道是否超过 1 时,如何优化获取结果计数? 【发布时间】:2019-07-03 17:24:05 【问题描述】:

我有一个流程需要知道表上是否有 1 个符合各种标准的匹配项。我可以通过一个简单的查询来获得计数,但我希望我可以优化它,因为我不在乎是否有 2 个匹配项或 2000 个匹配项。一旦我知道我有超过 1 个查询就可以停止。

“TOP 2”不适用于“COUNT”,因为它只返回 1 个结果,而不管它计算了多少。我正在查询的表上没有任何索引(也无法控制),所以我不希望能够使用循环和游标获得更好的结果。子查询也至少会执行 1 个完整查询。我已经没有选择了吗?我应该研究自定义聚合函数吗?


--Just a generic example. Only interested in knowing if @NumPerson = 1
DECLARE @NumPerson int
SELECT @NumPerson = COUNT(id) FROM Person 
WHERE vchLastName = <Last Name,varchar,> 
AND vchFirstName = <First Name,varchar,>

我并不期望获得巨大的收益,但我们使用的查询已经足够我想确保它被拨入。

【问题讨论】:

使用 EXISTS,它的性能会比 count 好 @FLICKER Exists 在检查是否存在满足某些条件的 一个 或多个行时比 Count 更有效。您如何建议使用它来检查 两个 或更多行? 如果PersonvchLastNamevchFirstName 上具有单个 索引,则应快速识别所需的行。如果您查询top (2) Id 并检查@@RowCount,您将得到答案:012(表示两个或更多)。这是order by 无关紧要的罕见情况之一。 看起来不错!谢谢! 你尝试过exists、count(*)和have的组合吗? 【参考方案1】:

这会起作用 - 不确定窗口函数的性能:

;cte 为 (

SELECT COUNT(id) over (partition by id order by id) as cnt, id

来自人

) select * from cte where cnt = 1

【讨论】:

以上是关于当我只需要知道是不是超过 1 时,如何优化获取结果计数?的主要内容,如果未能解决你的问题,请参考以下文章

当我只知道部分名称时检查是不是存在临时表?

优化超过 200,000 条记录的查询

为啥我的 MongoDB 聚合查询这么慢

当我只知道集合名称时,如何使用 Mongoid 动态调用模型?

为了安全起见,在获取所有结果时是不是需要绑定结果?

当我使用谷歌你管 API 获取搜索结果时,它给出 403 错误