编写在行存在时返回的命名SQL查询的最佳方法?

编写在行存在时返回的命名SQL查询的最佳方法?,sql,oracle,hibernate,Sql,Oracle,Hibernate,我有一个SQL查询 <named-query name="NQ::job_exists"> <query> select 0 from dual where exists (select * from job_queue); </query> </named-query> 为什么不干脆做: select count(*) as JobCount from job_queue 如果JobCount=0,那么这就是您的答案 为什么不干脆做: sel

我有一个SQL查询

<named-query name="NQ::job_exists">
<query>
select 0 from dual where exists (select * from job_queue);
</query>
</named-query>
为什么不干脆做:

select count(*) as JobCount from job_queue
如果JobCount=0,那么这就是您的答案

为什么不干脆做:

select count(*) as JobCount from job_queue

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

如果您执行exists,则它将在找到匹配项后立即停止查找。这可以阻止它执行完整的表扫描。如果您没有订单,则与TOP 1相同。如果您使用前1个ID,并且ID位于索引中,那么它可能会使用该索引,甚至根本不会转到表。停止全表扫描是最大的性能节约

另一个小的节省是,如果选择1或选择COUNT1而不是选择*或选择COUNT*,则可以节省获取表结构的工作

因此,我同意:

SELECT TOP 1 1 AS Found
FROM job_queue
然后: 回来结果:i空白

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

对于甲骨文而言,这将是:

SELECT 1 
FROM job_queue
WHERE rownum<2;

如果你做了一个exists,那么它会在找到匹配项后立即停止查找。这可以阻止它执行完整的表扫描。如果您没有订单,则与TOP 1相同。如果您使用前1个ID,并且ID位于索引中,那么它可能会使用该索引,甚至根本不会转到表。停止全表扫描是最大的性能节约

另一个小的节省是,如果选择1或选择COUNT1而不是选择*或选择COUNT*,则可以节省获取表结构的工作

因此,我同意:

SELECT TOP 1 1 AS Found
FROM job_queue
然后: 回来结果:i空白

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

对于甲骨文而言,这将是:

SELECT 1 
FROM job_queue
WHERE rownum<2;
如果您使用的是EXISTS Oracle,我建议使用null:

以下是Oracle成本较低的版本:

select null
  from job_queue
 where rownum = 1;
更新:若要在表中没有行时包含该情况,可以运行以下查询:

select count(*)
  from (select null
          from job_queue
          where rownum = 1);
通过此查询,您有一个最佳计划,只有两个可能的结果:如果有行,则为1;如果没有行,则为0。

如果您使用的是EXISTS Oracle,建议使用null:

以下是Oracle成本较低的版本:

select null
  from job_queue
 where rownum = 1;
更新:若要在表中没有行时包含该情况,可以运行以下查询:

select count(*)
  from (select null
          from job_queue
          where rownum = 1);

通过此查询,您有一个最佳计划,只有两个可能的结果:如果有行,则为1;如果没有行,则为0。

此调用对性能非常关键,我想利用EXSISTS的性能优势。.此调用对性能非常关键,我想利用EXSISTS的性能优势。.嗯。。这听起来很干净。非常感谢。如果使用FASTFIRSTROW从作业队列中找到的SELECT TOP 1,则SQL Server特定于此会更好-后命令会告诉SQL Server优化计划,以便尽快返回第一个匹配行。TOP在Oracle中无效语法。在这种情况下,Oracle将以相同的方式处理SELECT 1或SELECT*。选择count1或count*会更慢,因为它是一个聚合函数,将处理所有行+1到1。在Oracle.Hmm.中,认为selectcount1比selectcount*好是完全错误的。。这听起来很干净。非常感谢。如果使用FASTFIRSTROW从作业队列中找到的SELECT TOP 1,则SQL Server特定于此会更好-后命令会告诉SQL Server优化计划,以便尽快返回第一个匹配行。TOP在Oracle中无效语法。在这种情况下,Oracle将以相同的方式处理SELECT 1或SELECT*。选择count1或count*会更慢,因为它是一个聚合函数,将处理所有行+1到1。在Oracle中,认为SELECT COUNT1比SELECT COUNT*好是完全不正确的。对于其中的rownum=1,它是使用本地Oracle语法的最具表现力的解决方案。Concur。只需确保表中至少有一列是强制的非null和索引列。在EXISTS子查询中,选择*、null或某个文本值并不重要。我自己更喜欢空值,但有些人喜欢通过少键入3个字符来节省时间:+1表示其中rownum=1,这是使用本地Oracle语法的最具表现力的解决方案。只需确保表中至少有一列是强制的非null和索引列。在EXISTS子查询中,选择*、null或某个文本值并不重要。我自己更喜欢空值,但有些人喜欢通过少键入3个字符来节省手指: