当前位置: 首页 > 知识库问答 >
问题:

PostgreSQL-如何减少select语句导出时间

米嘉禧
2023-03-14
  • 我的Postgres版本:“PostgreSQL 9.4.1,由Visual C++build 1800编译,32位”
  • 我要处理的桌子;包含列
    1. EventTime-Timestamp不带时区
    2. SerialNumber-可变字符(32)
    3. sourceid-integer

和其他4列

下面是我的select语句

SELECT eventtime, serialnumber
    FROM   t_el_eventlog
    WHERE
    eventtime at time zone 'CET'  >  CURRENT_DATE  and
    sourceid = '14';

共有1个答案

马弘和
2023-03-14

由于数值的分布对我来说是未知的,所以没有明确的方法来解决这个问题。

但是有一个问题很明显:eventtime列有一个索引,但是由于查询在该列上使用函数操作,所以不能使用索引。

eventtime in time zone 'UTC' > CURRENT_DATE

要么删除索引并用该函数重新创建,要么重写查询。

CREATE INDEX ON t_el_eventlog (timezone('UTC'::text, eventtime));
CREATE INDEX ON t_el_eventlog (timezone('UTC'::text, eventtime), sourceid);

这就是理论告诉我们的。我对此做了一些测试,使用了一个大约有1000万行的表、36小时内的eventtime分布以及只有20个不同的SourceID(1..20)。分布是非常随机的。最好的结果是在eventtime、sourceid(无函数索引)和调整查询的索引中。

CREATE INDEX ON t_el_eventlog (eventtime, sourceid);
-- make sure there is no index on source id. we need to force postgres to this index.

-- make sure, postgres learns about our index
ANALYZE; VACUUM;

-- use timezone function on current date (guessing timezone is CET)
SELECT * FROM t_el_eventlog
 WHERE eventtime > timezone('CET',CURRENT_DATE) AND sourceid = 14;

由于表有10'000'000行,该查询仅在400ms内返回大约500'000行。(而不是所有其他组合中的大约1400到1700)。

查找索引和查询之间的最佳匹配是任务。我建议做一些研究,建议是http://use-the-index-luke.com

Index Only Scan using evlog_eventtime_sourceid_idx on evlog  (cost=0.45..218195.13 rows=424534 width=0)
     Index Cond: ((eventtime > timezone('CET'::text, (('now'::cstring)::date)::timestamp with time zone)) AND (sourceid = 14))
 类似资料:
  • 问题内容: 下面的程序根据需要运行,但是如何减少if语句的数量。有人告诉我,如果您的函数包含2个或更多if语句,那么您做错了。有什么建议?我试过使用switch语句,但这没有用,因为大小写不能是布尔值。 问题答案: 如何为案例创建方法: 然后,不是一堆东西,而是两个方法的调用集。您甚至可以创建一个调用上述两个方法的单个方法。 在上面的代码中,对我来说,问题的数量比重复代码的数量少。

  • 此请求引发了一个带有PostgreSQL的语句超时。 原因:org.postgresql.util.psqlexception:错误:由于在org.postgresql.core.v3.queryexecutorimpl.receiveerrorresponse(queryexecutorimpl.java:1525)在org.postgresql.core.v3.queryexecutorimp

  • 问题内容: 我创建结合两个表的SELECT语句,和的基础上,参照表,并在一个映射到。映射到未在数据库中的任何地方出现,我想创建“关于即时”的SELECT语句中。以下是我的架构: 这是一些示例数据: 我需要从输出表中获取给定设备每个区域的关联字段。每个映射到一个。对于此示例: 处理映射的一种方法是创建一个新表 并使用以下SQL获取设备1的所有区域以及标志: 但是,我正在寻找一种创建区域编号到输出类型

  • 有没有办法在2个Select语句之间应用? 我对的其他解决方案持开放态度。 示例 或 条件1/查询1 或 条件2/查询2-显示数据 注意-在子句中,两个Select具有不同的条件

  • 我需要理解React中的导出和导入语句(可能涉及使用HOC) 因此,我有一个更高的组件,称为,如下所示 在我们的app.js中,我们做了如下操作 现在,在Export语句中,我知道他传递的是两个参数,我们的withClass函数需要这两个参数作为参数,但是他难道不应该在中导入一些东西吗?我们的如何接收这些参数? 另外,我们的返回函数(在WithClass.js中)如何访问这里的道具?(例如,我们将