在PostgreSQL中处理碎片的最佳实践是什么?
示例:
我有一个多租户数据库,其工作负载包括报告的实时聚合。
CREATE TABLE account (
id serial PRIMARY KEY,
name text NOT NULL
);
CREATE TABLE widget (
id bigserial PRIMARY KEY,
account_id int NOT NULL REFERENCES account (id),
length numeric NOT NULL,
weight numeric NOT NULL,
我们在PostgreSQL数据库中有一个表,它正在以每天数百万行的速度增长。
每一行包括:
ID
Foreign user ID
Date and time
Other data
在ID中,日期和时间并不是严格单调的,但是它们是接近的。
在查询此表时,我们只对获取给定的外部用户ID的行感兴趣,其中包含最后两周的日期和时间。超过两个星期的行将永远不会被查询,但是我们希望将它们保存在存档的目的。
鉴于这一特殊用例:
我们应该在日期和时间列上索引吗?
有没有任何提示,我们可以给出日期和时间是(几乎)单调增长的ID。
我们是否应该试着从表中删除两个星期以上的行,这样会提高性能吗?
我在Big query中使用计划查询,它将前一天的数据附加到Big Query表中。当我的查询运行时,前一天的数据并不总是可用的,因此,为了确保我拥有所有的数据,我需要计算我的Big query表中的最后一个可用日期。
我的第一个尝试是编写以下查询:
SELECT *
FROM sourceTable
WHERE date >= (SELECT Max(date) from destinationTable)
当我运行这个查询时,只有date >= max(date)被正确导出。但是,查询将处理整个sourceTable,而不仅仅是J-max(日期)。因此,成本比预期的要高。
我还
我有这样一个场景:
SELECT * FROM PACKAGE WHERE PACKAGE_TYPE IN ('BOX','CARD')
表由PACKAGE_TYPE字段进行分区。假设PACKAGE_TYPE字段有20个可能的值。因此有20个分区,包括BOX、CARD和DEFAULT分区。当运行上述查询时,分区消除将正确进行,并且只扫描BOX和CARD分区。结果很快。
但是,当这样编写相同的查询时:
SELECT * FROM PACKAGE WHERE PACKAGE_TYPE IN (SELECT PACKAGE_TYPE FROM PACKAGE_LIST
CREATE TABLE IF NOT EXISTS tasks
(
id bigint not null,
created_date timestamp not null,
status_code integer,
target_identity varchar(255),
updated_date timestamp,
UNIQUE (created_date, target_identity)
) PARTITION BY RANGE (created_date);
CREATE TABLE IF NOT EXISTS tasks2020
当我使用标准SQL在BQ上运行下面的查询时,它表示在运行时它将处理76.6TB
SELECT
event_time, user_id, activity_id,dbm_insertion_order_id, dbm_total_media_cost_usd
FROM `raw.5295.activity_*`
WHERE _PARTITIONTIME >(SELECT * FROM `analytics-dwh.autobidding.activity_list` )
AND timestamp_micros(event_time) > (SELECT timestamp_m
我在PostgreSQL中创建了一个按received列分区的表(参见)。让我们以一个玩具为例:
CREATE TABLE measurement (
received timestamp without timezone PRIMARY KEY,
city_id int not null,
peaktemp int,
unitsales int
);
几年来,我已经为每个月创建了一个分区(measurement_y2012m01 . measurement_y2016m03)。
我注意到postgresq
假设我有一个包含2000万行的表,我想这样索引如下:
CREATE INDEX fruit_color
ON fruits
USING btree
(color);
现在让我们说,只有2%的水果有颜色,休息将是NULL。我的查询将不会希望找到带有颜色NULL (无颜色)的水果,所以问题是,如果我将索引更改为:
CREATE INDEX fruit_color
ON fruits
USING btree
(color)
WHERE color IS NOT NULL;
我不太了解postgresql处理索引的内部方式,所以我就问这个问题。
PS postgresql
我读过很多关于Azure表存储性能的文章。我的拿走是,如果只使用部分键Azure表存储是闪电般的速度。为了测试它,我创建了两个场景。
一个包含1300万行的基本价格层上的SQL服务器。所有列都被编入索引。有120000行的表存储器。具有相同实体的:
public class Item
{
[Key]
public int Id { get; set; }
public string Path { get; set; }
public bool Deleted { get; set; }
public int JobId { get; set; }
我有两个分别正确的查询,但是一起出现了一个错误:
WITH minimum_time AS
(
SELECT DATE (min(_PARTITIONTIME)) AS minimums
FROM `Day`
WHERE DATE (_PARTITIONTIME) = "2020-11-20"
)
SELECT *
FROM `Day`
WHERE DATE (_PARTITIONTIME) > (SELECT minimums
FROM minimum_time)
我得到了一个错误:
我注意到DolphinDB查询中的链式比较比预期的要慢得多。 例如,对于超过20亿行的分布式表"quotes“,查询 timer select avg(bid) as bid, avg(ofr) as ofr from quotes where 2020.12.07<=date<=2020.12.11 group by date, minute(time) as minute 远远慢于 timer select avg(bid) as bid, avg(ofr) as ofr from quotes where date>=2020.12.07, date<=
我们有一个查询,它从主细节简单模式中检索一些数据。WHERE子句如下:
-- These are just random numbers
Where ticket.type_id in ( 2, 3, 4, 5, 7 ) and
(
ticket.color_id is null or
ticket.color_id in ( 1, 2 , 8 )
)
我们已经在列中有索引: ticket.type_id和ticket.color_id,无论如何,查询解释分析仍然显示Postgresql正在进行顺序扫描以满足查询。
这个查询在系统中非
我在PostgreSQL 11有一张桌子:
CREATE TABLE A (id bigint PRIMARY KEY, text text)
现在,我想获取符合某些条件(如ctid )的行的id = 123。
然而,即使使用pg_hint_plan提示PostgreSQL只使用索引扫描,它也总是会给我索引扫描:
/*+ IndexOnlyScan(a) */ explain analyze select ctid from a where id = 823977776533426178;
QUER
我在查询多个连接在一起的表
SELECT a.column, b.column, c.column
FROM t1 AS a, t2 AS b, t3 AS c
WHERE a.column = b.column AND a.column = b.column AND a.column = b.column
是否有任何方法限制扫描的数据量,使其不查询整个数据集?注不存在按日期/时间或其他条件进行筛选的可能性。
我知道,如果你把极限100,它仍然可以查询整个结果集。有没有一种方法可以简单地查询100行随机集并返回它们(减少查询时间和工作负载)?
我有一个postgresql表,我在其中存储"session“记录。这些会话有时创建得非常快(有时高达每秒几百个)。我显然不能让表无限期地增长。因此,我有一个守护进程,它定期清扫表,对大小施加外部可配置的限制。
当记录数量超过限制时,我想取出最旧的记录(使用限制值),以文本形式将它们写入单独的(非关系)日志文件,然后从表中删除它们。我目前所做的工作是有效的,但是对于高限制,它是非常慢的。我现在的查询是这样的:
SELECT * FROM sessions ORDER BY modified DESC OFFSET 1000000 LIMIT 10000;
然后,我的程序将这些最近最少修
我有一个按以下方式分区的表:
HASH(timestamp DIV 43200 )
当我执行此查询时
SELECT max(id)
FROM messages
WHERE timestamp BETWEEN 1581708508 AND 1581708807
它扫描所有分区,而它们之间的两个编号1581708508 & 1581708807& numbers在同一个分区中,我如何才能使其仅扫描该分区?
我想将count(*)查询的结果分组到值存储桶中。我在dellstore2 postgresql示例数据库上对此进行了测试。下面的查询返回正确的答案,但对表中的每一行都返回一次(几千个相同的结果)。我可以通过在查询的末尾添加LIMIT 1来解决这个问题,但我想理解为什么我要获得重复项,以防它指出我的方法存在更广泛的问题。查询为:
SELECT
(SELECT count(*)
FROM
orders
WHERE
totalamount > 0 AND totalamount <= 100) AS