问题描述
嗨,
我希望您对哪种类型的主键索引适合我们的消息队列表发表意见。是使用串联列的全局分区索引还是在单个唯一列上使用全局索引 (值基于单调增加的Oracle sequence对象数)。
我们有一个消息队列表,它是按队列类型划分的列表,并按偶数或奇数月 (两个子分区) 划分的子分区 (列表)。每个队列类型都被分配其拥有的ASSM表空间。目前,我们共有十种队列类型,但将来可能会添加其他队列类型。在任何给定的一天,多个进程将在任何给定的时间每个队列类型插入多达数十万条记录,并且多个批处理进程将同时消耗这些队列。因此,队列消息被大量插入和删除到此表中。
message_id基于Oracle序列,并且无论队列类型如何都是唯一的。我的问题是,在我们操作的情况下,哪种类型的主键索引最适合这种表?我们应该使用基于队列类型sub_partition_key message_id的串联的全局分区索引还是仅在message_id上使用单列全局索引?您如何衡量 (哪些绩效指标) 哪个指数表现更好?
我们在表上的所有sql (选择和删除) 都将包含使用列的谓词条件: 队列类型子分区密钥消息id (包含在删除sql中,但不包含在条件中,当队列消息由多个批处理过程批量检索以进行处理时。
message_q表的示例 (不是完整的DDL)。
消息 _ q
(
信息 _ 身份证号码,
队列 _ 类型VARCHAR2(30),
CREATED_TS时间戳 (6),
状态VARCHAR2(10),
PAYLOAD_VCAR VARCHAR2(4000),
PAYLOAD_CLOB CLOB,
SUB_PARTITION_KEY VARCHAR2(2) 始终生成为 (TO_CHAR(MOD(TO_NUMBER(TO_CHAR (“CREATED_TS”,'MM')),2)
)
LOB (PAYLOAD_CLOB) 存储为安全文件MSG_Q_CLOB (
表空间MSG_Q_CLOB
表空间MSG_Q_TS
分区按列表 (队列类型)
按列表细分 (子分区键)
....
.....
....
...
我希望您对哪种类型的主键索引适合我们的消息队列表发表意见。是使用串联列的全局分区索引还是在单个唯一列上使用全局索引 (值基于单调增加的Oracle sequence对象数)。
我们有一个消息队列表,它是按队列类型划分的列表,并按偶数或奇数月 (两个子分区) 划分的子分区 (列表)。每个队列类型都被分配其拥有的ASSM表空间。目前,我们共有十种队列类型,但将来可能会添加其他队列类型。在任何给定的一天,多个进程将在任何给定的时间每个队列类型插入多达数十万条记录,并且多个批处理进程将同时消耗这些队列。因此,队列消息被大量插入和删除到此表中。
message_id基于Oracle序列,并且无论队列类型如何都是唯一的。我的问题是,在我们操作的情况下,哪种类型的主键索引最适合这种表?我们应该使用基于队列类型sub_partition_key message_id的串联的全局分区索引还是仅在message_id上使用单列全局索引?您如何衡量 (哪些绩效指标) 哪个指数表现更好?
我们在表上的所有sql (选择和删除) 都将包含使用列的谓词条件: 队列类型子分区密钥消息id (包含在删除sql中,但不包含在条件中,当队列消息由多个批处理过程批量检索以进行处理时。
message_q表的示例 (不是完整的DDL)。
消息 _ q
(
信息 _ 身份证号码,
队列 _ 类型VARCHAR2(30),
CREATED_TS时间戳 (6),
状态VARCHAR2(10),
PAYLOAD_VCAR VARCHAR2(4000),
PAYLOAD_CLOB CLOB,
SUB_PARTITION_KEY VARCHAR2(2) 始终生成为 (TO_CHAR(MOD(TO_NUMBER(TO_CHAR (“CREATED_TS”,'MM')),2)
)
LOB (PAYLOAD_CLOB) 存储为安全文件MSG_Q_CLOB (
表空间MSG_Q_CLOB
表空间MSG_Q_TS
分区按列表 (队列类型)
按列表细分 (子分区键)
....
.....
....
...
专家解答
因此,请处理您的语句,即 * 每个 * 查询操作将指定一个queue_type。如果您准备对主键的定义有所妥协,则可以将其设置为本地索引,例如
在该定义中,您可以根据查询需求交换 'id' 和 'mm',而不会抑制其成为主键的能力。
这给出了一个很好的小分区索引,但是你想对 “领先” 分区进行基准测试,即,对于给定的队列类型,你是否对 “当前” 分区有太多的争用。如果这样做,则本地索引可能无法完成任务。
在这种情况下,您将查看通过散列对主键进行全局分区以分散插入负载,而仅依靠分区修剪来按队列类型拾取消息。
SQL> create table t ( qt varchar2(10), mm int, id int , y int , z int) 2 partition by list (qt ) 3 subpartition by list (mm ) 4 subpartition template 5 ( subpartition s1 values (0), 6 subpartition s2 values (1) 7 ) 8 ( 9 partition p1 values ('A'), 10 partition p2 values ('B'), 11 partition p3 values ('C') 12 ); Table created. SQL> SQL> insert into t select 'A', mod(rownum,2), rownum, rownum, rownum from dual connect by level <= 20; 20 rows created. SQL> insert into t select 'B', mod(rownum,2), rownum, rownum, rownum from dual connect by level <= 20; 20 rows created. SQL> insert into t select 'C', mod(rownum,2), rownum, rownum, rownum from dual connect by level <= 20; 20 rows created. SQL> SQL> alter table t add constraint pk primary key ( qt,mm,id ) using index local; Table altered.复制
在该定义中,您可以根据查询需求交换 'id' 和 'mm',而不会抑制其成为主键的能力。
这给出了一个很好的小分区索引,但是你想对 “领先” 分区进行基准测试,即,对于给定的队列类型,你是否对 “当前” 分区有太多的争用。如果这样做,则本地索引可能无法完成任务。
在这种情况下,您将查看通过散列对主键进行全局分区以分散插入负载,而仅依靠分区修剪来按队列类型拾取消息。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
【纯干货】Oracle 19C RU 19.27 发布,如何快速升级和安装?
Lucifer三思而后行
610次阅读
2025-04-18 14:18:38
Oracle RAC 一键安装翻车?手把手教你如何排错!
Lucifer三思而后行
606次阅读
2025-04-15 17:24:06
XTTS跨版本迁移升级方案(11g to 19c RAC for Linux)
zwtian
500次阅读
2025-04-08 09:12:48
Oracle数据库一键巡检并生成HTML结果,免费脚本速来下载!
陈举超
485次阅读
2025-04-20 10:07:02
【ORACLE】记录一些ORACLE的merge into语句的BUG
DarkAthena
466次阅读
2025-04-22 00:20:37
Oracle 19c RAC更换IP实战,运维必看!
szrsu
443次阅读
2025-04-08 23:57:08
【ORACLE】你以为的真的是你以为的么?--ORA-38104: Columns referenced in the ON Clause cannot be updated
DarkAthena
439次阅读
2025-04-22 00:13:51
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
435次阅读
2025-04-17 17:02:24
火焰图--分析复杂SQL执行计划的利器
听见风的声音
374次阅读
2025-04-17 09:30:30
3月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
362次阅读
2025-04-15 14:48:05