标签: postgresql-performance

PostgreSQL区别和格式最快的方法

我在表中有350万行acs_objects,我需要检索creation_date具有年份格式和不同的列.

我的第一次尝试:180~200 Sec (15 Rows Fetched)

SELECT DISTINCT to_char(creation_date,'YYYY') FROM acs_objects
Run Code Online (Sandbox Code Playgroud)

我的第二次尝试:35~40 Sec (15 Rows Fetched)

SELECT DISTINCT to_char(creation_date,'YYYY')
FROM (SELECT DISTINCT creation_date FROM acs_objects) AS distinct_date
Run Code Online (Sandbox Code Playgroud)

有没有办法让它更快? - "我需要在ADP网站上使用它"

sql postgresql aggregate distinct postgresql-performance

9
推荐指数
4
解决办法
1508
查看次数

postgresql 中的临时表是否在所有客户端会话中可见?

我想创建一个临时表,以便能够将它连接到几个表,因为将这些表与建议的临时表的内容连接起来需要很多时间(获取临时表的内容很耗时。重复它一遍又一遍地花费越来越多的时间)。当我的需要完成时,我将删除临时表。我想知道这些临时表是否在其他客户端会话中可见(我的要求是让它们仅对当前客户端会话可见)。我正在使用 postgresql。如果您能为我正在考虑的解决方案提出更好的替代方案,那就太好了。

sql postgresql performance join postgresql-performance

9
推荐指数
2
解决办法
4706
查看次数

postgresql 中的真空表

使用,在这一刻上午发现的已经dead_tuples使用下面的查询

select relname from pg_stat_user_tables where n_dead_tup > 0
Run Code Online (Sandbox Code Playgroud)

这将重新调整表名,然后我将运行

VACUUM VERBOSE ANALYZE <table_name>
Run Code Online (Sandbox Code Playgroud)

这是一个好方法还是我需要改变它,如果是这样,请给我一些方法

谢谢

sql postgresql vacuum postgresql-performance

8
推荐指数
1
解决办法
1万
查看次数

与没有函数包装器的查询相比,SQL函数非常慢

我有这个PostgreSQL 9.4查询运行速度非常快(~12ms):

SELECT 
  auth_web_events.id, 
  auth_web_events.time_stamp, 
  auth_web_events.description, 
  auth_web_events.origin,  
  auth_user.email, 
  customers.name,
  auth_web_events.client_ip
FROM 
  public.auth_web_events, 
  public.auth_user, 
  public.customers
WHERE 
  auth_web_events.user_id_fk = auth_user.id AND
  auth_user.customer_id_fk = customers.id AND
  auth_web_events.user_id_fk = 2
ORDER BY
  auth_web_events.id DESC;
Run Code Online (Sandbox Code Playgroud)

但是,如果我将它嵌入到一个函数中,查询在所有数据中运行速度非常慢,似乎是在运行每条记录,我缺少什么?,我有〜1M的数据,我想简化我的数据库层存储大型查询进入功能和观点.

CREATE OR REPLACE FUNCTION get_web_events_by_userid(int) RETURNS TABLE(
    id int,
    time_stamp timestamp with time zone,
    description text,
    origin text,
    userlogin text,
    customer text,
    client_ip inet
     ) AS
$func$
SELECT 
  auth_web_events.id, 
  auth_web_events.time_stamp, 
  auth_web_events.description, 
  auth_web_events.origin,  
  auth_user.email AS user, 
  customers.name AS customer,
  auth_web_events.client_ip
FROM 
  public.auth_web_events, 
  public.auth_user, 
  public.customers
WHERE 
  auth_web_events.user_id_fk = auth_user.id AND
  auth_user.customer_id_fk …
Run Code Online (Sandbox Code Playgroud)

postgresql function sql-execution-plan postgresql-performance

8
推荐指数
1
解决办法
6684
查看次数

Postgresql函数的执行时间比同一查询长得多

我正在使用PostgreSQL 9.2.9并且有以下问题.

有功能:

CREATE OR REPLACE FUNCTION report_children_without_place(text, date, date, integer)
RETURNS TABLE (department_name character varying, kindergarten_name character varying, a1 bigint) AS $BODY$
BEGIN
    RETURN QUERY WITH rh AS (
        SELECT (array_agg(status ORDER BY date DESC))[1] AS status, request
        FROM requeststatushistory
        WHERE date <= $3
        GROUP BY request
    )
    SELECT
        w.name,
        kgn.name,
        COUNT(*)
    FROM kindergarten_request_table_materialized kr
    JOIN rh ON rh.request = kr.id
    JOIN requeststatuses s ON s.id = rh.status AND s.sysname IN ('confirmed', 'need_meet_completion', 'kindergarten_need_meet')
    JOIN workareas kgn ON kr.kindergarten …
Run Code Online (Sandbox Code Playgroud)

postgresql optimization function postgresql-performance

8
推荐指数
1
解决办法
1314
查看次数

PostgreSQL查询耗时太长

我有几亿行的数据库.我正在运行以下查询:

select * from "Payments" as p
inner join "PaymentOrders" as po
on po."Id" = p."PaymentOrderId"
inner join "Users" as u
On u."Id" = po."UserId"
INNER JOIN "Roles" as r
on u."RoleId" = r."Id"
Where r."Name" = 'Moses'
LIMIT 1000
Run Code Online (Sandbox Code Playgroud)

当where子句在数据库中找到匹配项时,我会在几毫秒内得到结果,但如果我修改查询并r."Name"在where子句中指定不存在,则需要花费太多时间才能完成.我猜PostgreSQL正在对Payments表(包含最多行)进行顺序扫描,逐行比较每一行.

是不是postgresql足够聪明,如果Roles表包含任何行,首先检查Name 'Moses'

角色表仅包含15行,而付款包含约3.5亿行.

我正在运行PostgreSQL 9.2.1.

顺便说一下,对同一模式/数据的相同查询在MS SQL Server上需要0.024ms才能完成.

我将在几个小时内更新问题并发布EXPLAIN ANALYZE数据.


这里解释分析结果:http://explain.depesz.com/s/7e7


这是服务器配置:

version PostgreSQL 9.2.1, compiled by Visual C++ build 1600, 64-bit
client_encoding UNICODE
effective_cache_size    4500MB
fsync   on
lc_collate …
Run Code Online (Sandbox Code Playgroud)

postgresql performance postgresql-performance

7
推荐指数
2
解决办法
1万
查看次数

选择 * 与选择所有列名称

我一直在阅读这一点,我知道最好明确列出列名称,我仍然有一个问题。

让我们假设以下场景(非常接近我的现实生活场景):

  1. 永远不会添加新列

  2. 我没有使用任何 blob 数据

  3. 我实际上确实想返回所有列

  4. 我有一个大约有 1.4 亿行的表

  5. 我实际上并不需要全部 1.4 亿行,但为了便于讨论,我们假设我需要

  6. 我没有使用任何连接,其他人也不会

  7. 下面的查询实际上正是我运行查询的方式。

以下查询之间是否存在性能差异:

SELECT * FROM <table_name>
Run Code Online (Sandbox Code Playgroud)

VS

SELECT <every_column_name...> FROM <table_name>
Run Code Online (Sandbox Code Playgroud)

编辑:我知道关于这个主题有一百万个问题。但对于这种特定的场景,是否存在任何性能差异?是select *糟糕还是两个查询具有相同的性能?

据我所知,根据使用的结果explain,对于这种特殊情况,没有区别。

database postgresql select query-optimization postgresql-performance

7
推荐指数
1
解决办法
5468
查看次数

Postgresql 查询耗时超过 5 分钟

我有一个包含 5 亿多行的大表。我试图找到最好的索引替代方法来稍微加快查询时间。我想根据时间戳排序会大大减慢查询时间。该表中有 15 列。

MyTable@ManyToOne与 other_table有关系。用户也可以定义最大结果。代码如下所示:

// Im showing the query itself here instead of the name of @NamedQuery inside the entity class.
TypedQuery<MyTable> query = em.createNamedQuery("SELECT m FROM my_table m WHERE m.other_table.id = :id AND m.city in :cities ORDER BY m.timestamp DESC", MyTable.class);
query.setParameter("id", id);
query.setParameter("cities", cities);
query.setMaxResults(number);
return query.getResultList();
Run Code Online (Sandbox Code Playgroud)

这种类型的查询的最佳替代方法是什么?综合指数?哪种索引类型最适合这种情况?

我们有一个这样的索引,但正如我所说,这需要很长时间。

CREATE INDEX my_table_idx ON my_schema.my_table USING btree (other_table_id, timestamp DESC NULLS LAST, city)
Run Code Online (Sandbox Code Playgroud)

编辑:

这是执行计划:

// Im showing the query itself here instead of …
Run Code Online (Sandbox Code Playgroud)

sql postgresql indexing named-query postgresql-performance

7
推荐指数
1
解决办法
268
查看次数

如何在加入/推送到外部服务器之前强制评估子查询

假设我想查询一个带有几个WHERE过滤器的大表。我正在使用 Postgres 11 和外部表;外部数据包装器 (FDW) 是clickhouse_fdw. 但我也对通用解决方案感兴趣。

我可以这样做:

SELECT id,c1,c2,c3 from big_table where id=3 and c1=2
Run Code Online (Sandbox Code Playgroud)

我的 FDW 能够对远程外部数据源进行过滤,确保上述查询快速并且不会拉取太多数据。

如果我写的话上面的效果是一样的:

SELECT id,c1,c2,c3 from big_table where id IN (3,4,5) and c1=2
Run Code Online (Sandbox Code Playgroud)

即所有的过滤都被发送到下游。

但是,如果我尝试执行的过滤稍微复杂一些:

SELECT bt.id,bt.c1,bt.c2,bt.c3
from big_table bt
join lookup_table l on bt.id=l.id
where c1=2 and l.x=5
Run Code Online (Sandbox Code Playgroud)

然后查询规划器决定远程过滤c1=2,但在本地应用另一个过滤器。

在我的用例中,先计算哪些ids 有l.x=5,然后将其发送出去进行远程过滤会快得多,所以我尝试按以下方式编写:

SELECT id,c1,c2,c3
from big_table
where c1=2
and id IN (select id from lookup_table where x=5)
Run Code Online (Sandbox Code Playgroud)

big_table然而,查询规划器仍然决定在本地对satisfy的所有结果执行第二个过滤器c1=2,这非常慢。

有什么方法可以“强制”(select …

sql postgresql sql-execution-plan postgresql-performance foreign-data-wrapper

7
推荐指数
1
解决办法
1948
查看次数

SELECT DISTINCT 在我的 PostgreSQL 表上比预期的要慢

这是我的表架构:

CREATE TABLE tickers (
    product_id TEXT NOT NULL,
    trade_id INT NOT NULL,
    sequence BIGINT NOT NULL,
    time TIMESTAMPTZ,
    price NUMERIC NOT NULL,
    side TEXT NOT NULL,
    last_size NUMERIC NOT NULL,
    best_bid NUMERIC NOT NULL,
    best_ask NUMERIC NOT NULL,
    PRIMARY KEY (product_id, trade_id)
);
Run Code Online (Sandbox Code Playgroud)

我的应用程序在“ticker”频道上订阅了 Coinbase Pro 的 websocket,并在收到消息时在行情表中插入一行。

该表现在有近 200 万行。

我认为运行SELECT DISTINCT product_id FROM tickers会很快,但它需要大约 500 到 600 毫秒。这是来自的输出EXPLAIN ANALYZE

HashAggregate  (cost=47938.97..47939.38 rows=40 width=8) (actual time=583.105..583.110 rows=40 loops=1)
  Group Key: product_id
  ->  Seq Scan …
Run Code Online (Sandbox Code Playgroud)

sql postgresql query-optimization database-performance postgresql-performance

7
推荐指数
1
解决办法
478
查看次数