以下查询有什么更好的做法,用于检查当ABC列为1时是否退出记录以及原因:
SELECT * FROM A WHERE A.ABC = 1
SELECT 1 FROM A WHERE A.ABC = 1
稍后在应用程序端传递查询,当我们浏览结果集时(在java中)我这样做:
if (rs.next()) {
found = true;
}
如何构建测试以证明哪个查询表现更好。
答案 0 :(得分:4)
既不!两者都可能返回许多行,并且必须设置结果集。代替:
select 1
from a
where rownum <= 1;
这最多会返回一行。
如果使用*
,则数据库需要将所有列都返回给应用程序。这是个坏主意。
答案 1 :(得分:2)
当您使用SELECT *
时,
强制数据库找到行并获取其值(它不能依赖于仅索引查找,除非您的索引包含所有行的数据,这没有任何意义)
将其序列化以发送回Java层
在Java层反序列化
...只是为了找出那里是否有任何东西。
SELECT 1
让数据库根据索引查找行,然后 强制它获取所有行的数据等;序列化较少,反序列化较少。
你哪个更好? : - )
请注意,如果可能有多行,您可以更进一步。我不是PL / SQL人,但是如果你使用PL / SQL使用的任何东西来限制SELECT 1
到最多一行,你也会保存一些索引。 According to Gordon Linoff和this article on AskTom,Oracle通过向其添加WHERE rownum <= 1
。
答案 2 :(得分:1)
我更喜欢:
select count(*)
from my_table
where rownum = 1;
...因为即使表为空,它总是会返回一行,值为0或1.这意味着您不必处理NO_ROWS_RETURNED情况。