Sql-Server
is where x = 0 or x is null 被 where isnull(x, 0) = 0 resp 替換。其中 NVL(x, 0) = 0
將 x 視為包含 null、0、1 的列。只有不到 1% 的行包含 1。0 和 Null 之間沒有邏輯差異。
堅持在這裡使用 isnull 而不是 NVL 是個好主意(性能)?
如果您純粹從性能角度來看它更好……我只是測試您的兩種方法,看看什麼對您的數據更快。
…但是由於無論如何您只有三個狀態,並且這是在 where 子句中,因此僅檢查它是否不是第三種情況可能會更快,然後您就不需要 NVL 測試:
column <> 1
或者,如果真的沒有區別(並且 NULL 不是“我們不知道,因此我們將出於所有實際目的將其視為 0,但我們偶爾需要知道它何時未知”的情況) ),只需更新表並將其設置為 0,它目前為 NULL。(並調整 NULL 中的任何內容)
這取決於但考慮到數據分佈,可能不是。
在 Oracle中使用單個表達式的性能優勢
NVL(x,0)
在於它可以使用基於函式的索引進行索引。但是由於優化器使用索引來返回表中 99% 的數據的情況很少,因此在這種情況下似乎不太可能有好處。在某些情況下,包含NVL(x,0)
和其他一些列以使其具有足夠選擇性的複合索引可能是有益的,但添加一個僅向選擇性增加一點點的表達式不太可能是淨收益。