2015-11-20 23 views
1

什麼是PostgresIS DISTINCT FROM最好使用這個功能,試聽了使用COALESCE相同的結果,但在更短的時間,以下測試:爲什麼要使用有別於 - Postgres的

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 

其具有較低的性能和是在其他數據庫中找不到的函數,如SQL Server,另一個不使用它的原因。

做一套測試中,兩個標準可以NULL,該IS DISTINCT FROM有微弱的優勢,這將是它的使用,其中更適用?

編輯:

像@hvd說是它的一部分ANSI SQLCOALESCE(CL.tp_pessoa,'') <> COALESCE(P.observacao,'')的結果是不一樣的CL.tp_pessoa IS DISTINCT FROM P.observacao

+1

「並且是在其他DB中找不到的函數」 - 值得一提的是它是ANSI SQL的一部分,所以其他DB不包含它的事實是其他DB可能會看到的事實與其他數據庫的問題。 – hvd

+0

@ hvd,@Gordon Linoff,@Bacon Bits,@ Gabriel的Messanger:對於我的測試,我比較了'''tp_pessoa'''不應該使用''''index'''幫助? –

回答

2

首先,它很方便。其次,您需要對大量數據進行測試。一秒鐘內就可能在數據庫服務器上發生很多事情,因此百分之一秒的小變化並不一定表示整體性能。

從積極的方面來看,我認爲Postgres會使用is distinct from的索引。我認爲索引不一定會用於所有的選擇。

+0

在我的本地機器上對更大的銀行進行了進一步測試,因此沒有軟件競爭,並且差異在2230 - 2240毫秒之間最小,那麼性能沒有問題 –

1

如果在column1上有一個索引像CREATE INDEX "index_name" ON table1 USING btree (column1);那麼在IS DISTINCT FROM的情況下sql引擎可以使用thet索引。用COALESCE它不能。

2

您看到的性能差異很小。關注正確性。

您舉一個例子

COALESCE(CL.tp_pessoa,'') <> COALESCE(P.observacao,'') 

CL.tp_pessoa IS DISTINCT FROM P.observacao 

如果CL.tp_pessoaNULL,和P.observacao'',則第一比較將它們視爲相等,而第二比較將它們視爲不相等的。

所以使用第一個版本,如果你想比較他們作爲平等,第二個版本,如果你想比較他們不平等。

3

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)) 

如果你正在做一個UPDATE合併臨時表與你基表和它們共享30個字段,並且只有當至少一個字段不同並且29個非關鍵字字段中的任何一個都可以爲NULL時,您才希望進行更新...您可以瞭解寫入時可能會產生多大的痛苦查詢。

相關問題