Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在postgres中使用EXECUTE和重写类似查询之间进行选择_Sql_Postgresql_Query Optimization - Fatal编程技术网

Sql 在postgres中使用EXECUTE和重写类似查询之间进行选择

Sql 在postgres中使用EXECUTE和重写类似查询之间进行选择,sql,postgresql,query-optimization,Sql,Postgresql,Query Optimization,实际上,我有相同的联接查询,(>2)查询之间的差异是在其中一个表上进行联接。就性能而言,最好是: 1) 重写查询(在一个存储过程中?)或 2) 在存储过程(用plpgsql BTW编写)中将连接作为参数传递给该表,并使用EXECUTE运行查询 我假设2)更优雅,但有人说,使用EXECUTE无法从查询优化中获益 还有,当我有不同数量的条件时呢。如何确保查询在最佳时间运行?(我认为重写查询10次以上不是一个好办法:D)执行是动态的,需要一个最低限度的新解析,因此开销更大。如果你想从查询优化中获益,你

实际上,我有相同的联接查询,(>2)查询之间的差异是在其中一个表上进行联接。就性能而言,最好是: 1) 重写查询(在一个存储过程中?)或 2) 在存储过程(用plpgsql BTW编写)中将连接作为参数传递给该表,并使用EXECUTE运行查询

我假设2)更优雅,但有人说,使用EXECUTE无法从查询优化中获益


还有,当我有不同数量的条件时呢。如何确保查询在最佳时间运行?(我认为重写查询10次以上不是一个好办法:D)

执行是动态的,需要一个最低限度的新解析,因此开销更大。

如果你想从查询优化中获益,你一定要重写查询

它确实会导致代码变得不那么优雅和冗长,这很难维护,但这有时是为性能付出的必要代价

1) 重写查询(在一个存储 程序?)

如果您能够缓存查询计划,请这样做。动态执行SQL意味着后端每次都需要重新规划查询。查看更多关于此的详细信息

2) 传递连接所在的表 在存储库中作为参数生成 过程(用plpgsql BTW编写)和 使用EXECUTE运行查询

没必要!为你。这是使用Pl/PGSQL可以获得的主要速度增益之一。修辞:您认为生成中所示的计划是便宜还是容易?如果可能的话,缓存那块工作

还有,如果我有一个 条件的数量。我该怎么做 确定查询在最佳时间运行吗? (我认为它需要更多地重写查询 超过10倍不是最好的办法:D)


使用单个
PREPARE
ed语句是优化查询执行的一种方法,也是最“裸机”的方法。您可以做一些奇怪的事情,比如使用一个集合返回PL函数,将不同的参数传递给它,然后它有条件地执行不同的SQL,但我不推荐这样做。为了获得最佳性能,请坚持使用
PREPARE
/
EXECUTE
并管理应用程序中的哪个命名语句。

由于重复计划执行的查询,使用
EXECUTE
会有一些开销

为了获得最佳结果和可维护性,请编写一个函数来编写所需的各种函数。例如:


确保每次都使用索引,不要担心有重复的SQLi,我听说pgscript类似于预处理器;这是推荐使用pgscript的情况吗?是的,但要澄清,PL/pgsql中的
EXECUTE
与PostgreSQL的原生SQL环境中的
EXECUTE
不同EXECUTE执行一个字符串(例如“EXECUTE'SELECT…”),但SQL中的
EXECUTE
发送一个
PREPARE
”查询(例如“PREPARE some_statement;EXECUTE some_statement…;EXECUTE some_statement…))。