![](/img/trans.png)
[英]In Postgres: What is the most concise way to use `IS DISTINCT FROM` on multiple values?
[英]Why use IS DISTINCT FROM - Postgres
在Postgres
IS DISTINCT FROM
,此功能的最佳用法是什么,使用COALESCE
試聽可以得到相同的結果,但是COALESCE
測試后所需的時間更少:
SELECT COUNT(P.id)
FROM produto P
INNER JOIN cliente CL ON P.id_cliente = CL.id_cliente
WHERE
COALESCE(CL.tp_pessoa,'') <> 'JURIDICA' -- test with COALESCE, average 610 ms
(CL.tp_pessoa <> 'JURIDICA' OR CL.tp_pessoa IS NULL) -- test with OR, average 668 ms
CL.tp_pessoa IS DISTINCT FROM 'JURIDICA' -- test with IS DISTINCT FROM, average 667 ms
OUTRO TESTE:
COALESCE(CL.tp_pessoa,'') <> COALESCE(P.observacao,'') -- test with IS DISTINCT FROM, average 940 ms
CL.tp_pessoa IS DISTINCT FROM P.observacao -- test with ```IS DISTINCT FROM```, average 930 ms, a little beter here
它具有較低的性能,並且是其他DB(例如SQL Server
找不到的功能,這也是不使用它的另一個原因。
做另一個測試,兩個條件都可以為NULL
,則IS DISTINCT FROM
稍有優勢,這就是它的用途,在更多情況下適用嗎?
編輯:
就像@hvd一樣,它是ANSI SQL
一部分,並且COALESCE(CL.tp_pessoa,'') <> COALESCE(P.observacao,'')
的結果與CL.tp_pessoa IS DISTINCT FROM P.observacao
。
COALESCE()
的問題在於,它使子句不可SARGable。 這將影響性能,因為無法使用索引。
(CL.tp_pessoa <> 'JURIDICA' OR CL.tp_pessoa IS NULL)
的問題在於它很冗長,尤其是當您比較兩個可能都為NULL的字段時:
(CL.tp_pessoa <> CL2.tp_pessoa
OR (CL.tp_pessoa IS NOT NULL AND CL2.tp_pessoa IS NULL)
OR (CL.tp_pessoa IS NULL AND CL2.tp_pessoa IS NOT NULL))
如果要進行更新以將臨時表與基本表合並,並且它們共享30個字段,並且您只想在至少一個字段不同且29個非鍵字段中的任何一個可以為NULL時進行更新。您可以了解編寫查詢的痛苦。
首先,它很方便。 其次,您需要對大量數據進行測試。 一秒鍾之內,數據庫服務器上可能發生很多事情,因此,百分之一秒的微小變化不一定表示整體性能。
從積極的方面is distinct from
,我認為Postgres將使用的索引is distinct from
。 我認為索引不一定會用於所有替代方法。
您所看到的性能差異很小。 專注於正確性。
你舉一個例子
COALESCE(CL.tp_pessoa,'') <> COALESCE(P.observacao,'')
與
CL.tp_pessoa IS DISTINCT FROM P.observacao
如果CL.tp_pessoa
為NULL
,而P.observacao
為''
,則第一個比較將它們視為相等,而第二個比較將它們視為不相等。
因此,如果要比較相等,請使用第一個版本,如果要比較不相等,請使用第二個版本。
如果有一個索引column1
喜歡CREATE INDEX "index_name" ON table1 USING btree (column1);
那么如果是IS DISTINCT FROM
sql引擎,則可以使用thet索引。 使用COALESCE
不能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.