标签: database-partitioning

转换为分区表

我有以下表结构,其中包含实时数据:

 CREATE TABLE IF NOT EXISTS `userstatistics` (
   `user_id` int(10) unsigned NOT NULL,
   `number_logons` int(7) unsigned NOT NULL DEFAULT '0',
   `number_profileminiviews` int(7) unsigned NOT NULL DEFAULT '0',
   `number_profilefullviews` int(7) unsigned NOT NULL DEFAULT '0',
   `number_mailsreceived` int(7) unsigned NOT NULL DEFAULT '0',
   `number_interestreceived` int(7) unsigned NOT NULL DEFAULT '0',
   `number_favouratesreceived` int(7) unsigned NOT NULL DEFAULT '0',
   `number_friendshiprequestreceived` int(7) unsigned NOT NULL DEFAULT '0',
   `number_imchatrequestreceived` int(7) unsigned NOT NULL DEFAULT '0',
   `yearweek` int(6) unsigned NOT NULL DEFAULT '0',
   PRIMARY KEY (`user_id`,`yearweek`)
 ) …
Run Code Online (Sandbox Code Playgroud)

mysql database-partitioning

6
推荐指数
1
解决办法
5722
查看次数

将GROUP BY与MAX()用作聚合vs ROW_NUMBER优于分区依据,是否存在性能差异?

以下两个查询之间是否存在性能差异?如果是,那么哪个更好?:

    select 
    q.id, 
    q.name 
    from(
        select id, name, row_number over (partition by name order by id desc) as row_num
from table
    ) q
        where q.row_num = 1
Run Code Online (Sandbox Code Playgroud)

select
max(id) ,
name
from table
group by name
Run Code Online (Sandbox Code Playgroud)

(结果集应该相同)

这是假设未设置索引。

更新:我对此进行了测试,并且group by速度更快。

sql group-by sql-server-2008 database-partitioning

6
推荐指数
2
解决办法
4239
查看次数

如何将 Postgres 外键模拟到分区表中

我有一个分区表(称为 A),其串行主键被另一个表(称为 B)引用。我知道我实际上无法创建从一个到另一个的外键(因为我不知道数据实际存储在哪个分区),因此,我尝试使用 check 来模拟外键的行为限制。像下面这样:

CREATE TABLE A (
    MyKey SERIAL PRIMARY KEY
);

CREATE TABLE B (
    AKey INT, -- Should have: REFERENCES A (MyKey),
              -- but can't due to Postgres limitations
);

CREATE TABLE APart1 (
    Field1 INT,
    PRIMARY KEY (MyKey)
) INHERITS (A);

CREATE TABLE APart2 (
    Field2 INT,
    PRIMARY KEY (MyKey)
) INHERITS (A);

CREATE FUNCTION ValidateKeyInA(aKey INT) RETURNS BOOL AS $$
    BEGIN
        PERFORM * FROM A WHERE MyKey = aKey;
        IF FOUND THEN …
Run Code Online (Sandbox Code Playgroud)

postgresql foreign-keys database-partitioning postgresql-9.3

5
推荐指数
1
解决办法
2565
查看次数

实现 PostgreSQL 表的历史记录

我想实现 PostgreSQL 表的更改历史记录。该表的定义方式如下:

CREATE TABLE "ps_counters"
(
    "psid" integer NOT NULL,
    "counter" bigint[] NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

我希望历史表看起来像:

CREATE TABLE "ps_counters_history"
(
    "timestamp" timestamp NOT NULL,
    "psid" integer NOT NULL,
    "counter" bigint[] NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

我需要一个触发器和一个存储过程,在每次更改(插入或更新)时ps_couneters插入ps_counters_history,但除了防止ps_counters_history变得太大之外,我希望ps_counters_history每个月对表进行分区。

sql database postgresql database-partitioning

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

DynamoDB 中 UUID 的“内部哈希函数”是什么?

Amazon 的 DynamoDB 文档似乎对如何为行选择分区刻意保持谨慎。这是关于分区键的讨论(重点是我的):

\n
\n

分区键 \xe2\x80\x93 一个简单的主键,由一个称为分区键的属性组成。

\n

DynamoDB 使用分区键的值作为内部哈希函数的输入。哈希函数的输出确定将存储项目的分区(DynamoDB 内部的物理存储)。

\n

在只有一个分区键的表中,任何两个项目都不能具有相同的分区键值。

\n

表、项目和属性People中描述的表是具有简单主键 ( ) 的表的示例。您可以通过提供该项目的值来立即访问表中的任何项目。PersonIDPeoplePersonId

\n
\n

因此,给出的示例将 PersonID 作为数字,对于散列来说,该数字可能很大,也可能很差 - 取决于内部散列函数。

\n

在我的项目中,我们使用随机 v4 UUID 作为主键,目前我们以字符串/S形式保留该 UUID(包含破折号)。我发现,与整数类似,这个 UUID 字符串可以根据内部哈希函数进行漂亮或惨淡的哈希处理。

\n

将 UUID 保留为字符串对我们来说很方便(尽管浪费空间),因为我们可以在 Dynamo 控制台中以与应用程序日志中显示的相同 v4 格式查看/查询 UUID。但是,如果以 String/S形式而不是 Binary/ 形式保存我们的 UUIDB形式保存我们的 UUID 将导致我们的行可怕地别名为一两个分区,因为内部哈希函数将我们的 UUID 字符串转换为字节是天真的,那么便利性就该死了Binary/B形式最适合 UUID。

\n

因此,我想了解有关内部哈希函数的更多信息(最好是来自 Dynamo 开发人员本身)。请向我们提供有关该内部哈希函数的智能程度的详细信息。S它与 String/ 、 Number/N和 …

hash performance amazon-web-services database-partitioning amazon-dynamodb

5
推荐指数
1
解决办法
3487
查看次数

PostgreSQL 11 中的逻辑复制和声明式分区

我有一个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

5
推荐指数
1
解决办法
845
查看次数

PostgreSQL 11 在索引应该足够的分区表上进行并行 seq 扫描

问题是我一直在一个相当简单的查询上获得 seq 扫描,这是一个非常简单的设置。我究竟做错了什么?

  • Windows Server 2016 上的 Postgres 11
  • 配置更改完成: constraint_exclusion = partition
  • 单个表分区为 200 个子表,每个分区有数十万条记录。
  • 相关字段的索引(假设一个字段也已分区)

这是创建语句:

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

5
推荐指数
1
解决办法
1654
查看次数

如何在分区的表上创建索引?

如何在 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 indexing database-partitioning postgresql-11

5
推荐指数
1
解决办法
4417
查看次数

对 BigQuery 分区中的行进行重复数据删除

我有一个包含许多重复行的表 - 但我只想一次删除一个分区的重复行。

我怎样才能做到这一点?

例如,您可以从按日期分区并填充 1 到 5 的随机整数的表开始:

CREATE OR REPLACE TABLE `temp.many_random`
PARTITION BY d
AS 
SELECT DATE('2018-10-01') d, fhoffa.x.random_int(0,5) random_int
FROM UNNEST(GENERATE_ARRAY(1, 100))
UNION ALL
SELECT CURRENT_DATE() d, fhoffa.x.random_int(0,5) random_int
FROM UNNEST(GENERATE_ARRAY(1, 100))
Run Code Online (Sandbox Code Playgroud)

sql merge duplicates database-partitioning google-bigquery

5
推荐指数
1
解决办法
4420
查看次数

转换为分区表时的初始范围大小

在 Linux x86/64 上的 Oracle 19c 数据库中工作,尝试将非分区表转换为分区表。

从 Oracle12 开始,alter table modify partition 已可用于将非分区表转换为分区表。我有一个非分区表,它的 initial_extent 大小设置为 544MB。这太大了。实际的第一个范围是 8MB。

当我使用 alter table modify partition 时,我最终得到 90 个分区,所有分区的初始范围均为 544MB。这导致表的大小增加了三倍。许多分区是 90% 加上空的。

问题是这个。在此过程中如何将初始分区盘区大小设置为合理值?

使用 alter table move 重新创建具有新存储的表并不是一个真正有用的步骤,因为其中一些表的大小超过了 TB。也许我错过了它,但我找不到更改或指定初始范围大小的方法。我可以事后更改表移动分区并重建所有索引,但这与分区之前的更改表移动具有相同的问题。

ALTER TABLE mytable MODIFY
Partition by range (mydatecol)
interval ( NUMTOYMINTERVAL(1,'MONTH') )
(
partition p1308 values less than (to_date('01-SEP-2013','dd-mon-yyyy'))
)
-- Below line will raise "ORA-02203: INITIAL storage options not allowed"
-- storage( initial 1m)
UPDATE INDEXES ONLINE;
Run Code Online (Sandbox Code Playgroud)

oracle partitioning database-partitioning partition oracle19c

5
推荐指数
1
解决办法
104
查看次数