簡體   English   中英

為什么使用IS DISTINCT FROM-Postgres

[英]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_pessoaNULL ,而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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM