首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用参数/变量以及如何在一起解释

如何使用参数/变量以及如何在一起解释
EN

Stack Overflow用户
提问于 2016-07-14 03:39:50
回答 1查看 2K关注 0票数 0

我的函数只有一个参数carAzimuth

代码语言:javascript
运行
复制
CREATE OR REPLACE FUNCTION map.get_near_link(x numeric, y numeric, carAzimuth numeric)

在里面我有一些计算和这个查询

代码语言:javascript
运行
复制
SELECT *
FROM map.vzla_seg S
WHERE
    S.azimuth > carAzimuth - 30  and   
    S.azimuth < carAzimuth + 30  or
    S.azimuth < carAzimuth - 330 or 
    S.azimuth > carAzimuth + 330;

我要分析查询性能。所以我必须把变量替换为常数。并且工作正常,EXPLAIN PLAN告诉我是否使用了正确的索引。

代码语言:javascript
运行
复制
EXPLAIN ANALYZE    
 SELECT *
 FROM map.vzla_seg S
 WHERE
    S.azimuth > 345 - 30  and   
    S.azimuth < 345 + 30  or
    S.azimuth < 345 - 330 or 
    S.azimuth > 345 + 330;

但麻烦的是,如果要测试不同的值,则更改每个变量。如果你试着

代码语言:javascript
运行
复制
EXPLAIN ANALYZE  
  WITH param(carAzimuth) as (select 345) 
  SELECT *
  FROM vzla_seg S, param 
  WHERE
      S.azimuth > carAzimuth- 30 and   
      S.azimuth < carAzimuth + 30 or
      S.azimuth < carAzimuth - 330 or 
      S.azimuth > carAzimuth + 330;

工作,但停止使用索引和更改的FULL SCAN

代码语言:javascript
运行
复制
"Nested Loop  (cost=0.01..208990.91 rows=2328905 width=4) (actual time=0.146..4138.882 rows=642115 loops=1)"
"  Join Filter: (((s.azimuth > (p.carazimuth - 30)) AND (s.azimuth < (p.carazimuth + 30))) OR (s.azimuth < (p.carazimuth - 330)) OR (s.azimuth > (p.carazimuth + 330)))"
"  Rows Removed by Join Filter: 3207719"
"  CTE parameter"
"    ->  Result  (cost=0.00..0.01 rows=1 width=0) (actual time=0.002..0.002 rows=1 loops=1)"
"  ->  CTE Scan on parameter p  (cost=0.00..0.02 rows=1 width=4) (actual time=0.009..0.012 rows=1 loops=1)"
"  ->  Seq Scan on vzla_seg s  (cost=0.00..93496.22 rows=3849822 width=4) (actual time=0.072..1380.356 rows=3849834 loops=1)"
"Total runtime: 4253.113 ms"

那么,我是否可以在没有函数的情况下创建变量并在解释中使用它呢?

我使用pgAdmin上的SQL编辑器来运行我的查询。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-14 06:43:16

假设WITH子句是等价函数,这是错误的。子句WITHhttps://www.postgresql.org/docs/current/static/queries-with.html相关,与函数的关系为零。当您希望从函数中看到计划时,有两种可能性:

  1. 使用https://www.postgresql.org/docs/current/static/auto-explain.html扩展--使用此扩展可以记录任何嵌套计划--只需启用一个选项auto_explain.log_nested_statements
  2. 您可以使用准备好的语句--在PLpgSQL中,任何SQL都可以透明地转换为准备语句。 准备xx(int)作为select *从foo,其中a= $1::text;解释分析执行xx(10);┌───────────────────────────────────────────────────────────────────────────────────────────────┐│查询计划╞═════════════════════════════════════════════════════════════════════════════════════════════│对foo (cost=0.00..21.00 rows=4 width=64) (实际time=0.019..0.019 rows=0 loops=1)││过滤器的══╡│Seq扫描:(a = '10'::text)由过滤器删除的││行:2└─────────────────────────────────────────────────────────────执行时间: 0.052 ms││──────────────────────────────────┘ 注意:第一个5次执行--计划总是新鲜的(不重复使用,而是一次又一次地生成)。在5次执行之后,该计划可以是通用的和可重用的。请参阅相关文件中的计划缓存一章。
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38365064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档