首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果行存在,编写返回的命名SQL查询的最佳方法是什么?

如果行存在,编写返回的命名SQL查询的最佳方法是什么?
EN

Stack Overflow用户
提问于 2010-02-13 12:17:55
回答 3查看 1.6K关注 0票数 1

所以我有这个SQL查询,

代码语言:javascript
复制
<named-query name="NQ::job_exists">
<query>
select 0 from dual where exists (select * from job_queue);
</query>
</named-query>

我计划这样使用它:

代码语言:javascript
复制
Query q = em.createNamedQuery("NQ::job_exists");
        List<Integer> results = q.getResultList();
        boolean exists = !results.isEmpty();
        return exists;

然而,我对SQL/JPA不是很在行,我想知道是否有更好的方法(或改进它的方法)。例如,我应该写(从job_queue jq中选择jq.id )而不是使用星号吗??

编辑:此调用在我们的应用程序中是非常关键的性能。

编辑:做了一些性能测试,虽然差异几乎可以忽略不计,但我最终决定:

代码语言:javascript
复制
select distinct null
    from dual 
       where exists (
               select null from job_queue
       );
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-02-13 18:05:13

如果您正在使用EXISTS Oracle,我建议您使用null

代码语言:javascript
复制
select null 
  from dual where exists (select null from job_queue);

以下是Oracle上成本较低的一个:

代码语言:javascript
复制
select null
  from job_queue
 where rownum = 1;

更新:要包括当表中没有行时的情况,您可以运行以下查询:

代码语言:javascript
复制
select count(*)
  from (select null
          from job_queue
          where rownum = 1);

对于这个查询,您有一个最优的计划,并且只有两种可能的结果:如果有行,则为1;如果没有行,则为0

票数 5
EN

Stack Overflow用户

发布于 2010-02-13 13:41:25

如果你做了一个"exists“,那么一旦找到匹配,它就会停止查找。这可以阻止它执行全表扫描。如果没有ORDER BY,TOP 1也是如此。如果您使用前1个ID,并且ID在索引中,它可能会使用索引,甚至根本不会转到表中。停止全表扫描是性能上最大的节省。

另一个小节省是,如果您使用"SELECT 1“或"SELECT COUNT(1)”而不是"SELECT *“或"SELECT COUNT(*)”,则可以省去获取表结构的工作。

所以我会这么说:

代码语言:javascript
复制
SELECT TOP 1 1 AS Found
FROM job_queue

然后:

代码语言:javascript
复制
    return !results.isEmpty();          

这是我能想到的最少的工作量。

对于Oracle,它将是:

代码语言:javascript
复制
SELECT 1 
FROM job_queue
WHERE rownum<2;

或者:

代码语言:javascript
复制
Set Rowcount 1
SELECT 1 
FROM job_queue
票数 3
EN

Stack Overflow用户

发布于 2010-02-13 12:20:55

为什么不干脆这样做:

代码语言:javascript
复制
select count(*) as JobCount from job_queue

如果JobCount = 0,那么这就是你的答案!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2256447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档