Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.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
Database 无法理解解释计划中成本关键字与时间的关系_Database_Postgresql_Postgresql 8.4_Sql Execution Plan - Fatal编程技术网

Database 无法理解解释计划中成本关键字与时间的关系

Database 无法理解解释计划中成本关键字与时间的关系,database,postgresql,postgresql-8.4,sql-execution-plan,Database,Postgresql,Postgresql 8.4,Sql Execution Plan,当我在下面运行查询时 explain select count(*) over() as t_totalcnt, max(hits) over() as t_maxhits, max(bytes) over() as t_maxbytes, * from ( select category,sum(hits) as hits,sum(bytes) as bytes from ( select "5mintime",category,hits,bytes,

当我在下面运行查询时

explain
select count(*) over() as t_totalcnt,  max(hits) over() as t_maxhits,  max(bytes) over() as t_maxbytes, * 
from 
(
    select category,sum(hits) as hits,sum(bytes) as bytes 
    from (
        select "5mintime",category,hits,bytes,appid, 0 as tmpfield
       from web_categoryutfv1_24hr_ts_201209 
       where "5mintime" >='2012-09-12 00:00:00' and "5mintime" < '2012-09-19 00:00:00'
    ) as tmp  
    where "5mintime" >='2012-09-12 00:00:00' 
    and "5mintime" <= '2012-09-18 23:59:59' 
    and appid in ('') group by category order by hits desc 
) as foo 
limit 10;
我得到下面的输出

  Limit  (**cost=31.31..31.61** rows=10 width=580)
  ->  WindowAgg  (**cost=31.31..32.03** rows=24 width=580)   
  ->  Subquery Scan foo  (cost=31.31..31.61 rows=24 width=580)
     ->  Sort  (**cost=31.31..31.37** rows=24 width=31)
        Sort Key: (sum(web_categoryutfv1_24hr_ts_201209.hits))
               ->  HashAggregate  (**cost=30.39..30.75** rows=24 width=31)
                    ->  Seq Scan on web_categoryutfv1_24hr_ts_201209  (cost=0.00..27.60 rows=373 width=31)
            Filter: (("5mintime" >= '2012-09-12 00:00:00'::timestamp without time zone) 
                   AND ("5mintime" < '2012-09-19 00:00:00'::timestamp without time zone)
                   AND ("5mintime" >= '2012-09-12 00:00:00'::timestamp without time zone)
                   AND ("5mintime" <= '2012-09-18 23:59:59'::timestamp without time zone)
                   AND ((appid)::text = ''::text))
当我在没有explain标记的情况下运行上述查询时。我在1秒内得到输出,而这里的成本=31.31..31.61


有谁能帮我理解解释计划中的成本关键字是什么意思?我是指解释计划中的成本关键字单位?

成本是查询计划员对操作难度或执行时间的估计。它基于一些机器级参数(例如,磁盘搜索与流式读取相比需要多长时间),以及表级信息,如每行有多大、有多少行或每列中的值分布。没有单位,因此产生的成本值是任意的。成本是PostgreSQL用来计算如何执行查询的指标;它将考虑执行你的查询的无数方法,并以最低的成本选择计划。有关成本计算的更多详细信息,请参阅

假设您使用的是默认设置,那么顺序扫描的成本如此之低,对我来说意味着PostgreSQL认为该表中没有多少行。运行它需要整整一秒钟的时间这一事实表明,实际上,该表中有很多行。您可以告诉PostgreSQL在该表上收集新的统计数据,方法是说ANALYZE web_categoryutfv1_24hr_ts_201209。pg_autovacuum进程应该定期收集统计数据,但可能您使用的是较旧版本的PostgreSQL,或者它已经有一段时间没有运行了,或者谁知道呢;不管怎样,用手再做一次也没有坏处

如果PostgreSQL认为表很小,那么它更喜欢顺序扫描而不是使用索引,因为对整个表进行顺序读取要比在索引扫描之后进行一系列随机读取快。另一方面,如果PostgreSQL认为表很大,那么在5mintime和/或appid上引用索引可能会更快,前提是该索引允许它排除许多行。如果没有这样的索引,请考虑创建一个。


最后一件事:解释有一个叫解释分析的老大哥。EXPLAIN向您展示PostgreSQL将选择的查询计划以及指导其决策的成本,EXPLAIN ANALYZE实际执行查询并向您展示每个组件运行所需的时间。有关更多信息,请参阅。

做一些事情,让您的问题更易于回答。感谢您的评论我已经阅读了postgresql中与解释计划相关的文档,但我无法理解其功能。