Er is geen verschil.
Alle belangrijke engines (dat is MySQL
, SQL Server
, Oracle
en PostgreSQL
) zal deze predikaten samenvoegen in de parseerfase en er identieke plannen van maken.
Het omgaan met deze voorwaarden is ingewikkelder dan het toepassen van operators in een of andere volgorde.
Bijvoorbeeld in Oracle
, een IS NOT NULL
(of NOT IS NULL
) voorwaarde impliceert een mogelijkheid om een index te gebruiken, dus een zoekopdracht als deze:
SELECT column
FROM mytable
WHERE column IS NOT NULL
zal hoogstwaarschijnlijk worden uitgevoerd met een index fast full scan
, zonder extra controles tijdens runtime (sinds de NULL
waarden komen gewoon niet in de index, dus het heeft geen zin om ze te controleren).
Zelfs als elk record zou moeten worden gecontroleerd, wordt de volgorde van controles bepaald door de optimizer (en niet door de volgorde waarin de predikaten en operators verschijnen in de WHERE
clausule).
Hier is bijvoorbeeld een plan voor een Oracle
vraag:
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)
Zoals je kunt zien, is het filter
werd intern vertaald in een IS NOT NULL
(die Oracle
samen met de meeste commentatoren lijkt te geloven dat dit een meer geschikte vorm is)
Bijwerken:
Zoals Jonathan Leffler opmerkte, zijn dit verschillen bij het evalueren van tuples (in tegenstelling tot enkele kolommen).
Een tuple bestaande uit gemengde NULL
en niet-NULL
waarden is geen NULL
noch een NOT NULL
.
In PostgreSQL
(die dit predikaat tegen tupels ondersteunt), beide uitdrukkingen:
SELECT (1, NULL) IS NULL
SELECT (1, NULL) IS NOT NULL
evalueren naar onwaar.