当我只需要知道是不是超过 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 好 @FLICKERExists
在检查是否存在满足某些条件的 一个 或多个行时比 Count
更有效。您如何建议使用它来检查 两个 或更多行?
如果Person
在vchLastName
和vchFirstName
上具有单个 索引,则应快速识别所需的行。如果您查询top (2) Id
并检查@@RowCount
,您将得到答案:0
、1
或2
(表示两个或更多)。这是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 时,如何优化获取结果计数?的主要内容,如果未能解决你的问题,请参考以下文章