首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >降低大型数据库的插入和更新性能

降低大型数据库的插入和更新性能
EN

Database Administration用户
提问于 2021-01-11 15:10:18
回答 1查看 135关注 0票数 1

有两个分区表(32个分区/16个文件/8个文件组)。第一个表有56列,第二个表有5列。应用程序的要求之一是测试未来工作负载的过程。我是在did应用程序中这么做的。将所有过程放在一个transaction controller中:

  1. GetSomeDataFromNonPartitioneTable1
  2. GetSomeDataFromNonPartitioneTable2
  3. InsertNewTransaction (在两个分区表中插入新行)
  4. GetOneRecordFromPartitionedTable
  5. UpdatePartitionedTable

在进行测试时(在被解析的表中有0行),每秒获得1300操作的性能(“一个操作”指的是一个又一个运行的过程集)。当在分区表( 4 000 000 )中获得记录(4 000 000 per table)时,我尝试了相同的测试(使用相同数量的虚拟用户)。每秒获得1050操作的性能。再深入一点,我的平均反应时间是:

1次测试(分区表中的0行)

  1. GetSomeDataFromNonPartitioneTable1 - 22 ms
  2. GetSomeDataFromNonPartitioneTable2 - 22 ms
  3. InsertNewTransaction (在两个分区表中插入新行)- 160 ms
  4. GetOneRecordFromPartitionedTable - 22 ms
  5. UpdatePartitionedTables- 136毫秒

2测试(分区表中约有4 000 000行)

  1. GetSomeDataFromNonPartitioneTable1 - 25 ms
  2. GetSomeDataFromNonPartitioneTable2 - 25 ms
  3. InsertNewTransaction (在两个分区表中插入新行)- 217 ms
  4. GetOneRecordFromPartitionedTable - 23 ms
  5. UpdatePartitionedTables - 177毫秒

我的问题:

  1. 为什么更大的桌子会使性能下降这么多?
  2. 我能做些什么来避免呢?较大的分区表得到2个非聚类索引和聚类索引,而较小的分区表只得到聚类索引。
EN

回答 1

Database Administration用户

发布于 2021-01-11 15:23:40

假设您使用的是(正如您的标记所暗示的那样),如果您使用的是JMeter,请确保您的测试直接在Server上运行,并且不涉及任何可能影响结果的中间人。我个人并不熟悉JMeter,但是两个测试之间最大的区别是大约57毫秒,这几乎不足以受到进程中任何可能的变量的影响。

虽然两个InsertNewTransaction测试之间的差异约为35%,但仍然只有57毫秒,这是非常小的。它甚至可以仅仅是一次测试与第二次测试的一次运行的区别,或者更多的外部因素,比如临时硬件闪点。在处理这样的粒度时间度量时,您必须运行大量的每个测试实例来进行平均和真正的比较。

尽管如此,一些一般性建议如下:

  1. 当表上有更多的索引时,INSERTS会花费更长的时间。因此,在适用的情况下,减少低使用或未使用索引的数量可以帮助您的INSERT性能。
  2. 分区并不意味着从SELECTINSERT的角度来提高性能。相反,它有助于更好地维护数据,并且可以巧妙地用于提高维护任务的性能(例如索引维护)。
  3. 如果有56列的表正在缓慢运行,那么如果可能的话,正规化它可以帮助您的INSERT性能(特别是如果您不总是为所有56个字段插入数据),并且可以帮助您的SELECT性能。
  4. 如果您需要进一步的性能关键更改,您可以查看内存优化表是否适合您的用例。
票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/282992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档