oracle SQL中的哈希分区

时间:2018-01-22 20:17:25

标签: sql oracle oracle11g partitioning database-partitioning

我有一张像这样的表:

CREATE TABLE "TS1" 
       (    
        "ID" VARCHAR2(32 BYTE) NOT NULL, 
        "CID" VARCHAR2(70 BYTE) NOT NULL, 
        "PID" VARCHAR2(21 BYTE) NOT NULL, 
        "LASTUSAGE" TIMESTAMP (6) NOT NULL, 
        "CREATIONTIME" TIMESTAMP (6) NOT NULL, 
        "COSTCENTER" NUMBER NOT NULL
       );

ALTER TABLE "TS1" ADD CONSTRAINT "TS1_PRIMARY" PRIMARY KEY ("ID", "CID", "PID");

我试图找到一种分区表的好方法:

  • 我没有在where子句中使用creationTime的查询(因此范围分区可能不是此字段的最佳解决方案)
  • LastUsage经常更新(因此范围分区可能不是此字段的最佳解决方案)
  • 大多数查询在where子句
  • 中使用ID,CID,PID

所以站在这里,一个好的选择应该是ID,CID,PID上的HASH PARTITION。

CREATE TABLE "TS1" 
       (    
        "ID" VARCHAR2(32 BYTE) NOT NULL, 
        "CID" VARCHAR2(70 BYTE) NOT NULL, 
        "PID" VARCHAR2(21 BYTE) NOT NULL, 
        "LASTUSAGE" TIMESTAMP (6) NOT NULL, 
        "CREATIONTIME" TIMESTAMP (6) NOT NULL, 
        "COSTCENTER" NUMBER NOT NULL
       )       
PARTITION BY HASH ("ID", CID, PID)
PARTITIONS N;  --N = number of partitions


ALTER TABLE "TS1" ADD CONSTRAINT "TS1_PRIMARY" PRIMARY KEY ("ID", "CID", "PID");

如果我使用主键作为参数进行哈希分区,这是一个问题吗? 让我们假设表TS1中有很多记录(数百万)我会从这个分区中获得一些性能优势吗?

3 个答案:

答案 0 :(得分:4)

  

“大多数查询在where子句中使用ID,CID,PID”

这意味着大多数查询都是主键上的单行查找,因此分区消除无法使事情变得更快。所有它可能做的是使那些不使用密钥较慢的查询(因为使用索引范围扫描的读取可能不是那样有效)。

实施分区有三个原因。他们是:

  • 数据管理。我们可以使用分区交换将数据加载到单个分区,或使用drop或truncate分区对数据进行切换,而不会影响表的其余部分。
  • 可用性即可。我们可以为每个分区提供一个单独的表空间,用于本地化数据文件损坏或类似的影响。
  • 性能即可。使用分区键的粒度的查询可以受益于分区修剪。可能有益的查询是执行范围扫描的查询;如果我们每天在表中加载一百万行,并且我们通常希望检索给定日期的记录,那么我们将从白天分区中获得很多好处。
  • 并发DML 。如果我们的应用程序有大量用户插入,更改和删除我们可能拥有的记录,例如等待ITL插槽或闩锁争用,有时已知。 hot blocks。散列分区可以在这里提供帮助,方法是在整个表中分配插入内容以及所有其他活动。

如果使用情况与您描述的一致,则按("ID", CID, PID)散列进行分区对性能无效。它也不会给你任何数据管理优势。您似乎不太可能对可用性优势感兴趣(因为数百万行似乎太小而无法担心)。

这样就留下了并发DML。如果您尝试解决的性能问题是编写而不是读取,并且并发活动的模式与主键的某些方面对齐(比如大多数DML用于最新的行),那么散列分区可能会减轻锁存器争用。 如果这听起来像您的情况,您应该在具有类似生产量的数据量和生产活动水平的环境中测试分区。 (并不总是很容易做到。)

否则,分区似乎是寻找问题的解决方案。

答案 1 :(得分:0)

我原来的错误答案:

按主键分区没有意义,因为每个分区都会包含一行。存在与分区相关的开销,因此您希望将分区数保持在合理的数量(如1000以下)。

我认为我正在考虑将主键值作为列表值的列表分区。请参阅以下评论。

答案 2 :(得分:0)

如何在同一列的ID,CID,PID和哈希分区上创建本地索引。索引扫描会没有好处,而是扫描整个表的索引,它必须扫描单个分区