我想对一个非常大的 PostgreSQL 8.3 数据库进行分区。引用手册,
分区可以提供几个好处:
...
很少使用的数据可以迁移到更便宜、速度更慢的存储介质。
将表重新定位到其他媒体或计算机的正确方法是什么?亚当
我跟着这篇文章: http://www.mssqltips.com/sqlservertip/1796/creating-a-table-with-horizontal-partitioning-in-sql-server/ 这在本质上执行以下操作:
我想执行这样的查询(请原谅我的伪代码)
select * from SalesArchival
where data in filegroup('A')
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点,或者如果没有,我该怎么做呢.
我想要完成的是每天运行批量运行,将超过90天的数据移动到不同的文件组,并仅在"当前"文件组上执行我的前端查询.
鉴于这种 :
delimiter //
create procedure setup()
begin
declare d datetime;
set d = rounddate(now());
create table s_time (req_id int not null,
ser_id int not null,
hel_id int not null,
posted int unsigned not null,
completed int unsigned not null default 0
)
partition by range (completed) (partition p0 values less than ( unix_timestamp(d) ),
partition p1 values less than ( unix_timestamp(d + interval 1 day) )
);
end//
Run Code Online (Sandbox Code Playgroud)
我明白了:
ERROR 1064 (42000) : Constant, random, or timezone-dependent expression in …
我有下表
CREATE TABLE "METRIC_VALUE_RAW"
(
"SUBELEMENT_ID" INTEGER NOT NULL ,
"METRIC_METADATA_ID" INTEGER NOT NULL ,
"METRIC_VALUE_INT" INTEGER,
"METRIC_VALUE_FLOAT" FLOAT(126),
"TIME_STAMP" TIMESTAMP NOT NULL
) ;
Run Code Online (Sandbox Code Playgroud)
您能否分享一下我如何设计分区的想法?
我可以访问数据库,我需要知道数据库中的分区方案定义.即我需要知道分区方案名称,它使用哪个分区功能,分配的分区是什么文件组等等...
例如,某人创建了一个分区方案(取自msdn):
CREATE PARTITION SCHEME myRangePS1
AS PARTITION myRangePF1
TO (test1fg, test2fg, test3fg, test4fg);
Run Code Online (Sandbox Code Playgroud)
然后我想要名称:myRangePS1,函数:myRangePF1和分区:(test1fg,test2fg,test3fg,test4fg),是否是分区ALL
我如何仅使用SQL语句来解决这个问题?我可以使用系统视图sys.partition_scheme查询名称和一些有关分区的数据,但这还不够.
下面显示了找到分区函数定义的类似解决方案:http: //social.msdn.microsoft.com/forums/sqlserver/en-US/d0ce92e3-bf48-455d-bd89-c334654d7e97/how-to-find-分区功能文本施加到一个表
我想按以前未知的值对 Postgres 中的表进行分区。在我的场景中,该值将是 device_id,它是一个字符串。
这是目前的情况:
表 'device_data' - 存储从设备发送的传感器数据,由 DDL 定义:
CREATE TABLE warehouse.device_data (
id INTEGER PRIMARY KEY NOT NULL DEFAULT nextval('device_data_id_seq'::regclass),
device_id TEXT NOT NULL,
device_data BYTEA NOT NULL,
-- contains additional fields which are omitted for brevity
received_at TIMESTAMP WITHOUT TIME ZONE DEFAULT now()
);
Run Code Online (Sandbox Code Playgroud)
表目前拥有数百万条记录,查询需要花费大量时间。大多数查询都包含WHERE device_id='something'子句。
我想到的解决方案是为每个device_id.
Postgres 是否可以为每个创建表分区device_id?
我浏览了 Postgres 文档和我发现的几个示例,但它们都使用固定边界来创建分区。我的解决方案需要:
device_id首次遇到new 时动态创建新的表分区device_id已知并且该分区device_id已经存在我希望使用表分区来完成这项工作,因为它允许跨多个device_ids进行查询。
我有一个非常大的 5 亿行表,其中包含以下列:
id- Bigint- 自动增加主索引。date- Datetime- 每个日期大约 150 万行,删除 1 年之前的数据。uid- VARCHAR(60)- 一个用户IDsessionNumber —— INTstart- INT- 开始时间的纪元。end- INT- 结束时间的时代。 的组合uid和sessionNumber形成uinque索引。我也有一个日期索引。
由于规模庞大,我想对表进行分区。
我的大多数访问都是按日期进行的,因此按日期范围分区似乎很直观,但由于日期不是唯一索引的一部分,因此这不是一个选项。
选项 1:RANGE PARTITION在日期和BEFORE INSERT TRIGGER
我真的没有经常遇到违反uid和sessionNumber唯一性的问题。源数据是一致的,但可以连续两天插入跨越两天的会话,午夜是第一天的结束时间和第二天的开始时间。
我试图了解是否可以删除唯一键并使用触发器
但是,我不确定是否可以 1) 在同一张表上触发更新。或 2) 防止实际插入。
选项 2:LINEAR HASH PARTITION开UID
我的第二个选择是在 UID 上使用线性哈希分区。但是,我看不到任何使用 VARCHAR 并将其转换为用于HASH分区的 INTEGER …
我有一个transactions有 2 亿行的普通表。
我决定使用逻辑复制将此表转换为声明式分区。
我在 node1 上创建了一个出版物,如下所示:
CREATE PUBLICATION transactions_pub FOR TABLE transactions;
Run Code Online (Sandbox Code Playgroud)
当我尝试在 node2 上创建订阅时,如下所示:
CREATE SUBSCRIPTION transactions_sub CONNECTION 'host=x.x.x.x port=5432 password=123456 user=replicator dbname=mydbname' PUBLICATION transactions_pub;
Run Code Online (Sandbox Code Playgroud)
返回此错误:
ERROR: logical replication target relation "public.transactions" is not a table
Run Code Online (Sandbox Code Playgroud)
是否可以使用逻辑复制将常规表复制到声明式分区表?
postgresql replication database-partitioning postgresql-11 logical-replication
问题是我一直在一个相当简单的查询上获得 seq 扫描,这是一个非常简单的设置。我究竟做错了什么?
constraint_exclusion = partition这是创建语句:
CREATE TABLE A (
K int NOT NULL,
X bigint NOT NULL,
Date timestamp NOT NULL,
fy smallint NOT NULL,
fz decimal(18, 8) NOT NULL,
fw decimal(18, 8) NOT NULL,
fv decimal(18, 8) NULL,
PRIMARY KEY (K, X)
) PARTITION BY LIST (K);
CREATE TABLE A_1 PARTITION OF A FOR VALUES IN (1);
CREATE TABLE A_2 PARTITION OF A FOR VALUES IN …Run Code Online (Sandbox Code Playgroud) postgresql query-optimization database-partitioning database-indexes postgresql-11
如何在 PostgreSQL 11.2 的分区表上创建索引?
我的表是:
CREATE TABLE sometablename
(
column1 character varying(255) COLLATE pg_catalog."default" NOT NULL,
column2 integer NOT NULL,
column3 character varying(255) COLLATE pg_catalog."default" NOT NULL,
"timestamp" timestamp without time zone NOT NULL,
avg_val double precision,
max_val double precision,
min_val double precision,
p95_val double precision,
sample_count double precision,
sum_val double precision,
unit character varying(255) COLLATE pg_catalog."default",
user_id bigint NOT NULL,
CONSTRAINT testtable_pkey PRIMARY KEY (column1, column2, column3, "timestamp", user_id)
)
PARTITION BY HASH (user_id)
WITH (
OIDS = FALSE …Run Code Online (Sandbox Code Playgroud) postgresql ×5
mysql ×2
partitioning ×2
sql ×2
sql-server ×2
indexing ×1
oracle ×1
partition ×1
replication ×1
t-sql ×1