我有一个要分区的表,但我不知道如何处理唯一性约束。
是否可以跨多个子表创建唯一约束?
我正在尝试创建带有分区的简单表。
这是我的命令:
CREATE TABLE measurement (
city_id int not null,
logdate date not null,
peaktemp int,
unitsales int
) PARTITION BY RANGE (logdate);
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误:
SQL 错误 [42601]:错误:“PARTITION”处或附近的语法错误
无法理解是问题..
我正在使用 PostgreSQL 9.6.3
postgresql create-table database-partitioning postgresql-9.6
我发现 Kafka 的分区机制笨拙且不舒服。Kafka 不支持自动分区重新分配功能,这会导致以下情况:
bin/kafka-reassign-partitions.sh脚本。您必须以 JSON 格式手动写出每个主题的分区重新分配。问题:
bin/kafka-reassign-partitions.sh?Kafka 是否使用任何优化(即一致哈希)或原始哈希范围分区?architecture partitioning database-partitioning apache-kafka
我想使用分区方法将我的表分成两个维度:
第一个维度是键列表。该列表可以随着时间的推移而增长,如果键列表将被扩展,我不想需要 DBA 来添加分区。因此我想使用自动列表分区。
第二个维度是日期列的每日范围。
这是我的例子,它给了我一个ORA-14179
CREATE TABLE PartitionedTable
(
id number,
PartitionKey number,
created date
)
PARTITION BY LIST (PartitionKey) AUTOMATIC
SUBPARTITION BY RANGE (created) INTERVAL (NUMTODSINTERVAL(1,'DAY'))
( PARTITION p_PartitionKey VALUES (1)
( SUBPARTITION p_created VALUES LESS THAN (TO_DATE('01-JAN-2000','dd-MON-yyyy'))
)
);
Run Code Online (Sandbox Code Playgroud)
我使用的是Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
如果插入新键和新日期,是否可以选择如何以最少的工作量创建这个二维分区表?
我正在尝试使用Postgres进行自我管理的分区表设置.这一切都围绕着这个功能,但我似乎无法让Postgres接受我的表名.自我管理分区表触发器功能的任何想法或示例?
我目前的职能:
DECLARE
day integer;
year integer;
tablename text;
startdate text;
enddate text;
BEGIN
day:=date_part('doy',to_timestamp(NEW.date));
year:=date_part('year',to_timestamp(NEW.date));
tablename:='pings_'||year||'_'||day||'_'||NEW.id;
-- RAISE EXCEPTION 'tablename=%',tablename;
PERFORM 'tablename' FROM pg_tables WHERE 'schemaname'=tablename;
-- RAISE EXCEPTION 'found=%',FOUND;
IF FOUND <> TRUE THEN
startdate:=date_part('year',to_timestamp(NEW.date))||'-'||date_part('month',to_timestamp(NEW.date))||'-'||date_part('day',to_timestamp(NEW.date));
enddate:=startdate::timestamp + INTERVAL '1 day';
EXECUTE 'CREATE TABLE $1 (
CHECK ( date >= DATE $2 AND date < DATE $3 )
) INHERITS (pings)' USING quote_ident(tablename),startdate,enddate;
END IF;
EXECUTE 'INSERT INTO $1 VALUES (NEW.*)' USING quote_ident(tablename);
RETURN NULL;
END;
Run Code Online (Sandbox Code Playgroud)
我希望它自动创建一个名为的表,pings_YEAR_DOY_ID但它始终失败: …
获取数据库中创建的分区数量的最有效方法是什么?我正在使用*postgresq*l APi for c ++.
我刚刚完成了本教程,幻灯片39上的子弹突出:"不要在同一台服务器中混合分区和非分区表"我不知道作者所指的是什么.这仅适用于基准测试吗?是否有一些要求在分区时应对所有表进行分区?即使它仅适用于基准测试,我仍然想知道为什么必须对它们进行分区以获得良好的基准测试结果.
当我查询表中包含大约一亿行的特定日期的最小ID时,我目前在数据库中遇到了一种奇怪的行为.查询非常简单:
SELECT MIN(Id) FROM Connection WITH(NOLOCK) WHERE DateConnection = '2012-06-26'
Run Code Online (Sandbox Code Playgroud)
这个查询结束了,至少我让它运行了几个小时.DateConnection列不是既不包含在其中的索引.所以我理解这个查询可以持续很长时间.但我尝试了以下几秒钟运行的查询:
SELECT Id FROM Connection WITH(NOLOCK) WHERE DateConnection = '2012-06-26'
Run Code Online (Sandbox Code Playgroud)
它返回300k行.
我的表定义如下:
CREATE TABLE [dbo].[Connection](
[Id] [bigint] IDENTITY(1,1) NOT NULL,
[DateConnection] [datetime] NOT NULL,
[TimeConnection] [time](7) NOT NULL,
[Hour] AS (datepart(hour,[TimeConnection])) PERSISTED NOT NULL,
CONSTRAINT [PK_Connection] PRIMARY KEY CLUSTERED
(
[Hour] ASC,
[Id] ASC
)
)
Run Code Online (Sandbox Code Playgroud)
它有以下索引:
CREATE UNIQUE NONCLUSTERED INDEX [IX_Connection_Id] ON [dbo].[Connection]
(
[Id] ASC
)ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)
我发现使用这种奇怪行为的一个解决方案是使用以下代码.但对于这样一个简单的查询,我觉得相当沉重.
create table #TempId
(
[Id] bigint
)
go
insert into …Run Code Online (Sandbox Code Playgroud) sql-server performance aggregate-functions database-partitioning sql-server-2012
我正在尝试发布一个数据库项目,该项目还包含一个分区函数.我的目标数据库有不同的(日期)值,我不想修改,虽然SSDT/SqlPackage总是试图重新创建分区函数,不用说 - 所有使用PF的表.
我检查了以下选项:IgnoreObjectPlacementOnPartitionScheme&IgnorePartitionSchemes(http://msdn.microsoft.com/en-us/library/aa833291 (v=vs.100 ) .aspx)但仍然获得了娱乐尝试.
同时运行VS2012(最新SSDT)和VS2013
我附上了一个示例项目来演示这种行为:http://www.fast-files.com/getfile.aspx? file = 73666
sql-server database-project database-partitioning sql-server-2012-datatools sql-server-data-tools
我的软件每30分钟运行一次cronjob,从Google Analytics/Social网络中提取数据并将结果插入到Postgres数据库中.
数据如下所示:
url text NOT NULL,
rangeStart timestamp NOT NULL,
rangeEnd timestamp NOT NULL,
createdAt timestamp DEFAULT now() NOT NULL,
...
(various integer columns)
Run Code Online (Sandbox Code Playgroud)
由于一个查询返回10 000多个项目,因此将这些数据存储在单个表中显然不是一个好主意.按此速度,cronjob每天将产生约48万条记录,每月产生约1450万条记录.
我认为解决方案是使用几个表,例如我可以使用特定的表来存储给定月份生成的数据:stats_2015_09,stats_2015_10,stats_2015_11等.
我知道Postgres支持表分区.但是,我对这个概念不熟悉,所以我不确定最好的方法是什么.在这种情况下我是否需要分区,还是应该手动创建这些表?或者也许有更好的解决方案?
稍后将以各种方式查询数据,并且这些查询预计会快速运行.
编辑:
如果我最终得到12-14个表,每个表存储10-20百万行,Postgres应该仍能快速运行select语句,对吧?插入不必非常快.
postgresql ×5
inheritance ×3
sql-server ×2
apache-kafka ×1
architecture ×1
constraints ×1
create-table ×1
mysql ×1
oracle ×1
oracle12c ×1
partitioning ×1
performance ×1
plpgsql ×1
sql ×1