标签: partitioning

如何在postgres中对现有表进行分区?

我想按日期范围对 100 万行以上的表进行分区。这通常是如何在不需要大量停机时间或冒丢失数据的风险的情况下完成的?以下是我正在考虑的策略,但欢迎提出建议:

  1. 现有的表是主表,子表是从它继承而来的。随着时间的推移,将数据从主表移动到子表,但会有一段时间,其中一些数据在主表中,一些在子表中。

  2. 创建一个新的主表和子表。在子表中创建现有表中的数据副本(因此数据将驻留在两个位置)。一旦子表拥有最新数据,更改所有插入以指向新的主表并删除现有表。

postgresql optimization partitioning

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

日期索引优化

我在 PostgreSQL 9.0.8 中有一个很大的对象表(15M+ 行),我想查询过时的字段。

出于可扩展性和并发性的目的,我想将查询除以数百万,并且我想获取具有几天前日期的 updated_at 字段的所有数据。

我已经在 100 万个 ID 上尝试了许多索引和查询,但使用 Heroku 的 Ronin 硬件似乎无法在 100 秒内获得性能。

我正在寻找我尚未尝试使其尽可能高效的建议。

尝试 #1

 EXPLAIN ANALYZE SELECT count(*) FROM objects
 WHERE (date(updated_at)) < (date(now())-7) AND id >= 5000001 AND id < 6000001;
 INDEX USED: (date(updated_at),id)
 268578.934 ms
Run Code Online (Sandbox Code Playgroud)

尝试 #2

 EXPLAIN ANALYZE SELECT count(*) FROM objects
 WHERE ((date(now()) - (date(updated_at)) > 7)) AND id >= 5000001 AND id < 6000001;
 INDEX USED: primary key
 335555.144 ms
Run Code Online (Sandbox Code Playgroud)

尝试 #3

 EXPLAIN ANALYZE SELECT count(*) FROM …
Run Code Online (Sandbox Code Playgroud)

postgresql performance index partitioning postgresql-performance

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

表分区有何帮助?

我很难理解表分区的优缺点。我即将开始一个项目,该项目将有 8 个表,其中一个将是主数据表,将包含 180-260 百万条记录。因为它将是正确索引的表,所以我正在考虑将表记录限制为 2000 万,这样我将不得不创建 9-13 个表。

但我不太确定它将如何提高性能,因为它们将位于同一台机器上(32GB RAM)?

我正在使用 MySQL 并且表将是 MyISAM 并且大表将在 id 字段上有索引,并且没有进一步的复杂性,例如全文搜索等。

还请阐明表分区与数据库分区。

mysql myisam performance database-design partitioning

30
推荐指数
2
解决办法
2万
查看次数

如何获取数据库中所有分区表的列表?

如何获取数据库中所有分区表的列表?

我应该查看哪些系统表/DMV?

sql-server-2008 sql-server metadata partitioning

27
推荐指数
2
解决办法
12万
查看次数

分区键是否也必须是主键的一部分?

我正在根据不是主键的列对表进行分区?我今天阅读了一些关于分区列是否必须是主键的一部分的相互矛盾的信息。我的直觉说不,但我不是 100% 确定。所以问题...

  1. 分区列必须是主列的一部分吗?是推荐一种方式还是另一种方式?
  2. 我是否必须为分区键创建索引,还是 DBMS 自己自动创建?

sql-server-2008 sql-server sql-server-2008-r2 partitioning

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

如何对现有的未分区表进行分区

我有一个包含数据的现有表:

dbo.Test (col1,col2,col3....) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

我需要将此表更改为这样分区:

dbo.Test(col1,col2,col3....) ON Ps_Date(Col2)
Run Code Online (Sandbox Code Playgroud)

我怎样才能在不删除和重新创建表格的情况下实现这一目标?

sql-server sql-server-2008-r2 partitioning

25
推荐指数
2
解决办法
7万
查看次数

SQL Server 不会优化两个等效分区表上的并行合并连接

提前为非常详细的问题道歉。我已经包含了生成完整数据集以重现问题的查询,并且我正在 32 核机器上运行 SQL Server 2012。但是,我认为这不是 SQL Server 2012 特有的,并且我已将这个特定示例的 MAXDOP 强制为 10。

我有两个使用相同分区方案进行分区的表。在用于分区的列上将它们连接在一起时,我注意到 SQL Server 无法像预期的那样优化并行合并连接,因此选择使用 HASH JOIN 代替。在这种特殊情况下,我能够通过基于分区函数将查询拆分为 10 个不相交的范围并在 SSMS 中同时运行这些查询中的每一个来手动模拟更优化的并行 MERGE JOIN。使用 WAITFOR 精确地同时运行它们,结果是所有查询在原始并行 HASH JOIN 所用总时间的 40% 左右完成。

在等效分区表的情况下,有什么方法可以让 SQL Server 自行进行这种优化?我知道 SQL Server 通常可能会产生大量开销,以便并行执行 MERGE JOIN,但在这种情况下,似乎有一种非常自然的分片方法,开销最小。也许这只是优化器还不够聪明以识别的特殊情况?

以下是设置简化数据集以重现此问题的 SQL:

/* Create the first test data table */
CREATE TABLE test_transaction_properties 
    ( transactionID INT NOT NULL IDENTITY(1,1)
    , prop1 INT NULL
    , prop2 FLOAT NULL
    )

/* Populate table with pseudo-random data (the specific data doesn't …
Run Code Online (Sandbox Code Playgroud)

join sql-server partitioning

22
推荐指数
1
解决办法
6320
查看次数

当数据“自然可分区”时,跨机器分区 PostgreSQL 的现代方法是什么?

在进入“NoSQL”领域多年之后,现在我遇到了一个本质上非常“关系”的问题。今天,我看到数据存储的眼光与以前截然不同。像 Riak 这样的事情已经让我无法忍受单点故障,“停机维护”等。当然,(或者我希望),我还没有完全失去理智。这是一个个人项目,还没有(或尚未)具有极高的要求。

大多数分片解决方案都没有给我我想要的(至少是一瞥),可能是因为我的问题很“容易”解决。至少在概念层面上(忽略 RDBM 本身带来的限制)。

  1. 我有少量“共享”数据,可以自由复制。它没有硬一致性的要求。这可以存储在类似发电机的数据库中,并且可以无限扩展。但如果可能的话,我仍然希望使用单个数据库。

  2. 我有很多“每用户”数据。也就是说 - 大量用户,每个用户都拥有绝对合理大小的数据,真正适合存储在单个 PostgreSQL 节点上。我们正在谈论最多 10 万条记录。

  3. 我从不需要跨用户查询,也不需要跨用户原子性。

这听起来非常容易实现。至少当我用我的“NoSQL 眼睛”看它时。

以下是我幼稚的入门想法:

  1. 在极端情况下,我可以将整个用户序列化为 Riak 中的单个键/值。当然,持续对几兆字节数据进行反/序列化会很慢,这就是我考虑使用 PostgreSQL 的原因。许多 Riak K/Vs 是行不通的,因为我需要每个用户数据中的原子性/事务。

  2. 我可以为每个用户使用一个 SQLite 数据库,并使用 GlusterFS 之类的东西来实现冗余/可用性。如果我无法使用 PostgreSQL 找到同样好的东西,这可能是我要选择的解决方案。优点:可以很好地缩小/放大;缺点:我更喜欢 PostgreSQL 的类型和严格性而不是 SQLite

所以,我最好从 PostgreSQL 分片解决方案中要求:

  1. 自动保留每个用户数据的多个副本(在不同的机器上)。能够为每个用户/分片动态切换主节点(如果之前的主节点出现故障)。
  2. 能够通过添加/删除服务器节点动态扩大/缩小规模。大多数情况下,Riak 都能做到。
  3. 不需要我的应用程序知道要与哪些节点以及何时进行通信。

postgresql partitioning high-availability

22
推荐指数
2
解决办法
4715
查看次数

是否可以强制优化器消除此分区视图中的不相关表?

我正在为大表测试不同的体系结构,我看到的一个建议是使用分区视图,将大表分解为一系列较小的“分区”表。

1 , 2 , 3 , 4

在测试这种方法时,我发现了一些对我来说没有多大意义的东西。当我过滤事实视图上的“分区列”时,优化器只查找相关表。此外,如果我过滤维度表上的那一列,优化器会消除不必要的表。

但是,如果我过滤维度的其他方面,优化器会在每个基表的 PK/CI 上寻找。

以下是相关查询:

select 
    od.[Year], 
    AvgValue = avg(ObservationValue)
from dbo.v_Observation o 
join dbo.ObservationDates od
    on o.ObservationDateKey = od.DateKey
where o.ObservationDateKey >= 20000101
    and o.ObservationDateKey <= 20051231
group by od.[Year];

select 
    od.[Year], 
    AvgValue = avg(ObservationValue)
from dbo.v_Observation o 
join dbo.ObservationDates od
    on o.ObservationDateKey = od.DateKey
where od.DateKey >= 20000101
    and od.DateKey <= 20051231
group by od.[Year];

select 
    od.[Year], 
    AvgValue = avg(ObservationValue)
from dbo.v_Observation o 
join dbo.ObservationDates od
    on o.ObservationDateKey = od.DateKey …
Run Code Online (Sandbox Code Playgroud)

sql-server partitioning sql-server-2014

22
推荐指数
2
解决办法
853
查看次数

增量更新后统计信息消失

我们有一个使用增量统计的大型分区 SQL Server 数据库。所有索引都是分区对齐的。当我们尝试逐个分区联机重建一个分区时,所有统计信息在重建索引后都会消失。

下面是使用 AdventureWorks2014 数据库在 SQL Server 2014 中复制问题的脚本。

--Example against AdventureWorks2014 Database

CREATE PARTITION FUNCTION TransactionRangePF1 (DATETIME)
AS RANGE RIGHT FOR VALUES 
(
   '20130501', '20130601', '20130701', '20130801', 
   '20130901', '20131001', '20131101', '20131201', 
   '20140101', '20140201', '20140301'
);
GO

CREATE PARTITION SCHEME TransactionsPS1 AS PARTITION TransactionRangePF1 TO 
(
  [PRIMARY], [PRIMARY], [PRIMARY], [PRIMARY], [PRIMARY], 
  [PRIMARY], [PRIMARY], [PRIMARY], [PRIMARY], [PRIMARY], 
  [PRIMARY], [PRIMARY], [PRIMARY]
);
GO

CREATE TABLE dbo.TransactionHistory 
(
  TransactionID        INT      NOT NULL, -- not bothering with IDENTITY here
  ProductID            INT      NOT …
Run Code Online (Sandbox Code Playgroud)

sql-server statistics partitioning sql-server-2014

21
推荐指数
1
解决办法
1365
查看次数