在Oracle SQL中选择STAR VS SELECT 1来检查是否存在

时间:2015-06-11 17:33:40

标签: java sql oracle performance

以下查询有什么更好的做法,用于检查当ABC列为1时是否退出记录以及原因:

SELECT * FROM A WHERE A.ABC = 1

SELECT 1 FROM A WHERE A.ABC = 1

稍后在应用程序端传递查询,当我们浏览结果集时(在java中)我这样做:

if (rs.next()) {
    found = true;
}

如何构建测试以证明哪个查询表现更好。

3 个答案:

答案 0 :(得分:4)

既不!两者都可能返回许多行,并且必须设置结果集。代替:

select 1
from a
where rownum <= 1;

这最多会返回一行。

如果使用*,则数据库需要将所有列都返回给应用程序。这是个坏主意。

答案 1 :(得分:2)

当您使用SELECT *时,

  1. 强制数据库找到行并获取其值(它不能依赖于仅索引查找,除非您的索引包含所有行的数据,这没有任何意义)

  2. 将其序列化以发送回Java层

  3. 在Java层反序列化

  4. ...只是为了找出那里是否有任何东西。

    SELECT 1让数据库根据索引查找行,然后 强制它获取所有行的数据等;序列化较少,反序列化较少。

    哪个更好? : - )

    请注意,如果可能有多行,您可以更进一步。我不是PL / SQL人,但是如果你使用PL / SQL使用的任何东西来限制SELECT 1到最多一行,你也会保存一些索引。 According to Gordon Linoffthis article on AskTom,Oracle通过向其添加WHERE rownum <= 1

答案 2 :(得分:1)

我更喜欢:

select count(*)
from   my_table
where  rownum = 1;

...因为即使表为空,它总是会返回一行,值为0或1.这意味着您不必处理NO_ROWS_RETURNED情况。