我在表中有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网站上使用它"
我想创建一个临时表,以便能够将它连接到几个表,因为将这些表与建议的临时表的内容连接起来需要很多时间(获取临时表的内容很耗时。重复它一遍又一遍地花费越来越多的时间)。当我的需要完成时,我将删除临时表。我想知道这些临时表是否在其他客户端会话中可见(我的要求是让它们仅对当前客户端会话可见)。我正在使用 postgresql。如果您能为我正在考虑的解决方案提出更好的替代方案,那就太好了。
使用PostgreSQL的-9.2,在这一刻上午发现的表已经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)
这是一个好方法还是我需要改变它,如果是这样,请给我一些方法
谢谢
我有这个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
我正在使用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) 我有几亿行的数据库.我正在运行以下查询:
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) 我一直在阅读这一点,我知道最好明确列出列名称,我仍然有一个问题。
让我们假设以下场景(非常接近我的现实生活场景):
永远不会添加新列
我没有使用任何 blob 数据
我实际上确实想返回所有列
我有一个大约有 1.4 亿行的表
我实际上并不需要全部 1.4 亿行,但为了便于讨论,我们假设我需要
我没有使用任何连接,其他人也不会
下面的查询实际上正是我运行查询的方式。
以下查询之间是否存在性能差异:
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
我有一个包含 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) 假设我想查询一个带有几个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
这是我的表架构:
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
postgresql ×10
sql ×6
function ×2
performance ×2
aggregate ×1
database ×1
distinct ×1
indexing ×1
join ×1
named-query ×1
optimization ×1
select ×1
vacuum ×1