Няма разлика.
Всички основни машини (това е MySQL
, SQL Server
, Oracle
и PostgreSQL
) ще обедини тези предикати на етапа на синтактичен анализ, като направи идентични планове от тях.
Обработката на тези условия е по-сложна от простото прилагане на оператори в един или друг ред.
Например в Oracle
, IS NOT NULL
(или IS NOT NULL
) условието предполага възможност за използване на индекс, така че заявка като тази:
SELECT column
FROM mytable
WHERE column IS NOT NULL
най-вероятно ще се изпълни с index fast full scan
, без допълнителни проверки, направени по време на изпълнение (тъй като NULL
стойностите просто няма да влязат в индекса, така че няма смисъл да ги проверявате).
Дори ако всеки запис трябва да бъде проверен, редът на проверките ще бъде дефиниран от оптимизатора (а не от реда, в който предикатите и операторите се появяват в WHERE
клауза).
Например, ето план за Oracle
заявка:
SQL> EXPLAIN PLAN FOR
2
2 SELECT *
3 FROM t_test
4 WHERE NOT column IS NULL
5 /
Explained
SQL> SELECT *
2 FROM TABLE(DBMS_XPLAN.display())
3 /
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 958699830
----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 30 | 1260 | 3 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| T_TEST | 30 | 1260 | 3 (0)| 00:00:01 |
----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("COLUMN" IS NOT NULL)
Както можете да видите, filter
е преведен вътрешно в IS NOT NULL
(което Oracle
заедно с повечето коментиращи изглежда смятат, че е по-подходяща форма)
Актуализация:
Както Джонатан Лефлър посочи, това е разлика при оценката на кортежи (за разлика от единичните колони).
Кортеж, състоящ се от смесени NULL
и не-NULL
стойности не е нито NULL
нито NOT NULL
.
В PostgreSQL
(което поддържа този предикат срещу кортежи), и двата израза:
SELECT (1, NULL) IS NULL
SELECT (1, NULL) IS NOT NULL
оценка на false.