我有以下的功能,我想在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