加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

最快速的PostgreSQL方式与格式不一样

发布时间:2020-12-13 16:33:22 所属栏目:百科 来源:网络整理
导读:我在表acs_objects中有350万行,我需要以年份格式和不同的方式检索列creation_date. 我的第一次尝试:180?200秒(15排) SELECT DISTINCT to_char(creation_date,'YYYY') FROM acs_objects 我的第二次尝试:35?40秒(15排) SELECT DISTINCT to_char(creation_dat
我在表acs_objects中有350万行,我需要以年份格式和不同的方式检索列creation_date.

我的第一次尝试:180?200秒(15排)

SELECT DISTINCT to_char(creation_date,'YYYY') FROM acs_objects

我的第二次尝试:35?40秒(15排)

SELECT DISTINCT to_char(creation_date,'YYYY')
FROM (SELECT DISTINCT creation_date FROM acs_objects) AS distinct_date

有没有办法让它更快? – “我需要在ADP网站上使用”

在第二次尝试中,您会从子查询中获取不同的日期,然后您将所有日期转换为字符串表示,然后选择不同的日期.这是相当低效的.最好是从子查询中的creation_date中提取不同的年份,并将其简单地转换为主查询中的文本:
SELECT year::text
FROM (
  SELECT DISTINCT extract(year FROM creation_date) AS year FROM acs_objects
) AS distinct_years;

如果在表上创建一个INDEX,查询运行速度要快得多:

CREATE INDEX really_fast ON acs_objects((extract(year FROM creation_date)));

但是,这可能会影响您的表的其他用途,特别是如果您有许多修改语句(插入,更新,删除).而且只有在creation_date具有日期或时间戳的数据类型(特别是不带时区的时间戳)的情况下,这才有效.

下面的选项看起来很有前途,因为它不使用子查询,但实际上要慢得多(见下面的注释),可能是因为DISTINCT子句被应用于一个字符串:

SELECT DISTINCT extract(year FROM creation_date)::text
FROM acs_objects;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读