【发布时间】:2011-02-10 14:44:59
【问题描述】:
如果你想知道COUNT(*) > 0 那么你可以使用EXISTS 来提高查询效率。当我想知道COUNT(*) > 1 时,有没有一种方法可以提高查询效率?
(需要同时兼容 SQL Server 和 Oracle。)
谢谢,杰米
编辑:
我正在尝试提高某些代码的性能。有几行类似于:
if (SQL('SELECT COUNT(*) FROM table WHERE a = b') > 0) then...
和
if (SQL('SELECT COUNT(*) FROM table WHERE a = b') > 1) then...
第一行很容易切换到EXISTS 语句,但是我可以让第二行更高效吗?从cmets和我自己的想法我有以下想法,它们中的任何一个会更有效吗?
if (SQLRecordCount('SELECT TOP 2 1 FROM table WHERE a = b') > 1) then...
(我可以将ROWNUM 用于Oracle。)
if (SQL('SELECT 1 FROM table WHERE a = b HAVING COUNT(*) > 1') = 1) then...
以下内容在 SQL Server 中不起作用:
SELECT COUNT(*) FROM (SELECT TOP 2 FROM table WHERE a = b)
但这适用于 Oracle:
SELECT COUNT(*) FROM (SELECT 1 FROM table WHERE a = b AND ROWNUM < 3)
感谢您迄今为止的所有帮助。
【问题讨论】:
-
我不确定这是否只是针对 MySQL 的优化,但您是否尝试过
COUNT(primaryKeyField) > 1或COUNT(1) > 1看看是否可以更好地利用索引? -
@Ardman - 我认为问题是关于某些基数的,比如每个组有 1,000 行,并且可以在前 2 场匹配后停止扫描,类似于
EXISTS不需要COUNT所有匹配的行。 -
我可以想到使用
TOP和CROSS APPLY的SQL Server 特定方式。 -
@Martin 也发布那个 :-)
-
@pst - 完成。我已经把它写成 cw 并且可能会在稍后删除这个问题的主题......
标签: sql performance count