在NVL操作的条件下,ORACLE不为NULL

时间:2017-03-28 11:56:22

标签: sql oracle performance query-optimization

我想知道哪个查询更快。

例如:1

select comm
from emp
where comm is not null;

例如:2

select comm
from emp
where nvl(comm,'0') is not null;

请考虑EMP表包含数十万条记录。

2 个答案:

答案 0 :(得分:3)

不应该提出假设性问题,而应该对实际数据进行一些基准测试。但这里有一些观察:

您的查询会执行不同的操作。您的第一个查询选择COMM不为空的所有记录。您的第二个查询选择所有记录。

在这两种情况下,它可能是两次全桌扫描:“十万分之一的记录”。没有区别。但是,鉴于它们具有相同的投影和没有排序子句,执行时间将是相同的。

除了:

  1. 渲染输出的时间会有所不同,因为第二个 结果集可能比第一个大。
  2. 如果有索引 EMP(COMM)第一个结果可能会使用全速快速索引扫描, 因为你只选择COMM所以没有必要触摸 表。索引读取会更快,因为正常的Oracle索引不会索引空值。
  3. 即使在EMP(NVL(COMM))上有基于函数的索引 第二个查询仍然会执行全表扫描,因为你 在投影中选择COMM,这样查询仍然需要读取表格。

答案 1 :(得分:1)

你的两个问题做了不同的事情。第一个获取非NULL值。第一个拉动所有东西。

我想你打算:

{foo?: string}

这些仍然做不同的事情,因为第二个也过滤了&#34;自然&#34; select comm from emp where comm is not null; select comm from emp where nvl(comm, '0') <> '0' 值。但它们更接近。

第一个更简单,并使用一个内置运算符。第二个运行一个函数并使用相同的内置运算符。第一个应该永远不会慢于第二个 - 除了一个例外。

Oracle允许对表达式进行索引。如果您碰巧在'0' 上有索引,则大多数值为&#39; 0&#39; 你没有nvl(comm, '0')的索引,那么第二个会使用索引并且会更快。