我想知道哪个查询更快。
例如:1
select comm
from emp
where comm is not null;
例如:2
select comm
from emp
where nvl(comm,'0') is not null;
请考虑EMP表包含数十万条记录。
答案 0 :(得分:3)
不应该提出假设性问题,而应该对实际数据进行一些基准测试。但这里有一些观察:
您的查询会执行不同的操作。您的第一个查询选择COMM不为空的所有记录。您的第二个查询选择所有记录。
在这两种情况下,它可能是两次全桌扫描:“十万分之一的记录”。没有区别。但是,鉴于它们具有相同的投影和没有排序子句,执行时间将是相同的。
除了:
EMP(COMM)
第一个结果可能会使用全速快速索引扫描,
因为你只选择COMM
所以没有必要触摸
表。索引读取会更快,因为正常的Oracle索引不会索引空值。 EMP(NVL(COMM))
上有基于函数的索引
第二个查询仍然会执行全表扫描,因为你
在投影中选择COMM
,这样查询仍然需要读取表格。答案 1 :(得分:1)
你的两个问题做了不同的事情。第一个获取非NULL值。第一个拉动所有东西。
我想你打算:
{foo?: string}
这些仍然做不同的事情,因为第二个也过滤了"自然" 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')
的索引,那么第二个会使用索引并且会更快。