我有以下的功能,我想在SQL查詢中使用哪個(Postgres的9.3):糟糕的表現上存在子句在功能
SELECT * FROM test_table tt WHERE has_access(tt.id, tt.login)
CREATE OR REPLACE FUNCTION has_access(integer, integer)
RETURNS boolean AS
$BODY$
SELECT
EXISTS (SELECT true
FROM test_read_access
WHERE id = $1 and login = $2
)
AND
NOT EXISTS (SELECT true
FROM test_no_read_access
WHERE id = $1 and login = $2
)
$BODY$
這,只要我有工作細到只有關注關於功能的正確性。由於查詢分析器告訴我,必須對每行進行函數評估,因此EXISTS子句無法按預期進行優化。事實上,相比於以下查詢查詢是很慢(內聯EXISTS子句而不SELECT子句):
SELECT * FROM test_table tt WHERE
EXISTS (SELECT true
FROM test_read_access
WHERE id = tt.id and login = tt.login
)
AND
NOT EXISTS (SELECT true
FROM test_no_read_access
WHERE id = tt.id and login = tt.login
)
功能has_access(ID,登錄)的目的是將一些訪問規則的函數,然後在不同的查詢中使用它。我的意思是,這是可以做到這樣的事情來獲得良好的性能:
SELECT * FROM test_table tt WHERE EXISTS (select has_access(tt.id, tt.login))
CREATE OR REPLACE FUNCTION has_access(integer, integer)
RETURNS SETOF boolean AS
$BODY$
SELECT true
FROM test_read_access
WHERE id = $1 and login = $2
$BODY$
但現在我只有在功能一個表一個子查詢,這是不是在我的情況非常有用。有關如何正確執行此操作以避免遇到性能問題的任何建議?
謝謝!
EXISTS趨向於導致相關子查詢,這是數據庫管理系統,以優化硬;使用IN/NOT IN往往更有效率。 – okaram 2014-11-04 00:39:10
@okaram:完全錯誤。請注意,在這種情況下,沒有相關的子查詢,因爲沒有主查詢。 – wildplasser 2014-11-04 00:52:19
@wildplasser,該函數中的查詢是不相關的,但上面的是(但我沒有明白,當我發表評論時,問題是函數:) – okaram 2014-11-04 01:43:26