Oracle (';xyz';!=';xyz';)和非(';xyz';=';xyz';)之间有什么区别
Oracle (';xyz';!=';xyz';)和非(';xyz';=';xyz';)之间有什么区别,oracle,performance,optimization,query-optimization,Oracle,Performance,Optimization,Query Optimization,('xyz'!='xyz')和之间有什么区别吗('xyz'='xyz') 虽然我是在Oracle DB的上下文中询问的,但我也想知道其他语言中的相同情况 差异主要包括处理速度和所有的背景材料。你看到有什么不同吗 测试用例: SQL> SELECT * FROM dual 2 WHERE ('xyz' != 'xyz'); no rows selected SQL> SQL> SELECT * FROM dual 2 WHERE NOT ('xyz' = 'xyz
('xyz'!='xyz')
和之间有什么区别吗('xyz'='xyz')
虽然我是在Oracle DB的上下文中询问的,但我也想知道其他语言中的相同情况
差异主要包括处理速度和所有的背景材料。你看到有什么不同吗 测试用例:
SQL> SELECT * FROM dual
2 WHERE ('xyz' != 'xyz');
no rows selected
SQL>
SQL> SELECT * FROM dual
2 WHERE NOT ('xyz' = 'xyz');
no rows selected
SQL> EXPLAIN PLAN FOR
2 SELECT * FROM dual
3 WHERE ('xyz' != 'xyz');
Explained.
SQL>
SQL> SELECT * FROM TABLE(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 3752461848
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 2 | 0 (0)| |
|* 1 | FILTER | | | | | |
| 2 | TABLE ACCESS FULL| DUAL | 1 | 2 | 2 (0)| 00:00:01 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
---------------------------------------------------
1 - filter(NULL IS NOT NULL)
14 rows selected.
SQL>
SQL> EXPLAIN PLAN FOR
2 SELECT * FROM dual
3 WHERE NOT ('xyz' = 'xyz');
Explained.
SQL>
SQL> SELECT * FROM TABLE(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 3752461848
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 2 | 0 (0)| |
|* 1 | FILTER | | | | | |
| 2 | TABLE ACCESS FULL| DUAL | 1 | 2 | 2 (0)| 00:00:01 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
---------------------------------------------------
1 - filter(NULL IS NOT NULL)
14 rows selected.
SQL>
在上述两个查询中,应用的筛选器都是相同的筛选器(NULL不是NULL)
执行计划:
SQL> SELECT * FROM dual
2 WHERE ('xyz' != 'xyz');
no rows selected
SQL>
SQL> SELECT * FROM dual
2 WHERE NOT ('xyz' = 'xyz');
no rows selected
SQL> EXPLAIN PLAN FOR
2 SELECT * FROM dual
3 WHERE ('xyz' != 'xyz');
Explained.
SQL>
SQL> SELECT * FROM TABLE(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 3752461848
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 2 | 0 (0)| |
|* 1 | FILTER | | | | | |
| 2 | TABLE ACCESS FULL| DUAL | 1 | 2 | 2 (0)| 00:00:01 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
---------------------------------------------------
1 - filter(NULL IS NOT NULL)
14 rows selected.
SQL>
SQL> EXPLAIN PLAN FOR
2 SELECT * FROM dual
3 WHERE NOT ('xyz' = 'xyz');
Explained.
SQL>
SQL> SELECT * FROM TABLE(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 3752461848
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 2 | 0 (0)| |
|* 1 | FILTER | | | | | |
| 2 | TABLE ACCESS FULL| DUAL | 1 | 2 | 2 (0)| 00:00:01 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
---------------------------------------------------
1 - filter(NULL IS NOT NULL)
14 rows selected.
SQL>
没有区别。Hmmm。。。您似乎假设OP询问的是文本值
'xyz'
,这没有多大意义(显然'xyz'
等于'xyz'
)。在您的例子中,优化程序能够完全消除谓词,但这只是因为表达式只有文字值。无可否认,这个问题措辞拙劣,我完全同意你的看法。OP对这个问题的措辞过于笼统。只要证明1=1
总是正确的,就不难了;-)我希望这个问题在一个更具体的用例中是具体的。这就是我添加解释计划的原因。这就是为什么我倾向于在开始回答之前先问清楚问题:)嗯……有时并非所有的日子都是一样的;-)有几天,我的手指在我的思想前面。正如你所看到的,从Lalit的回答中,答案显然是“不”,因为你的文字值是相同的。我怀疑你实际上指的是更一般的情况,例如,(:bind1!=:bind1)
vs不是(:bind1=:bind1)
-我说的对吗?是的,实际上我指的是更一般的情况。答案是一样的:如果:bind不是null,那么两个表达式的结果都是TRUE。如果:bind为null,则两个表达式的结果都是未知的。我的回答针对这个问题,并且非常针对所涉及的文本。总的来说,这是一个过于宽泛的问题,因此总体而言,我的回答足以满足OP的需要。无论如何,如果它在问题的范围内回答,我希望它被标记为已回答。对于这个问题,好的,你的回答足以解释,但正如你也说过的,我也希望它被认为是广义的。谢谢