【问题标题】:Query Optimization - Performance Degradation with time查询优化 - 性能随时间下降
【发布时间】:2018-03-16 05:41:29
【问题描述】:

我有一个流程,每天将大约 100 万条记录插入表中,并且已经这样做了一年。然后,我有一个辅助表,它连接到结果表并选择按 id 和状态分组的三个月的结果计数。一切都进行得很好,但现在查询执行得非常慢,我似乎无法弄清楚出了什么问题。有人可以指出我需要从哪里开始以提高性能。

【问题讨论】:

  • 您使用的是什么 RDBMS?\
  • 您使用的是哪个DBMS? “SQL”只是一种查询语言,而不是特定数据库产品的名称。请为您正在使用的数据库产品添加标签postgresql, oracle, sql-server, db2, ...
  • 您有一个或多个不断增长的索引,现在它们不适合内存。运行使用索引的查询变得很慢,因为部分索引不断从交换中加载,因此使用磁盘 IO。
  • 您应该按日期对表进行分区,这样当您按过去 3 个月进行过滤时,您将能够只处理涉及的那些数据文件,而不是使用整个表。
  • 太宽泛了。你维护你的数据库?数据模型和索引是什么样的?慢查询是什么样子的,实际执行计划有什么问题?等等。

标签: sql sql-server query-optimization


【解决方案1】:

我们可以将表视为磁盘上的一个大文件。要搜索文件中的某些信息,您需要对其进行扫描。这很贵。

为了使流程更高效,RDBMS 构建索引 - 通常保存在内存中的数据结构,组织起来以简化特定查询,并为每一行包含在文件中查找行的位置的引用。您拥有的行数越多,索引就越大。

在某些时候,索引变得太大而无法放入内存,并且部分索引被交换到磁盘中。对流行索引的随机访问开始导致大量磁盘 IO 操作,因为操作系统不断保存/加载部分索引,这比仅使用内存要慢得多。

做什么很大程度上取决于数据,有几种方法,但它们背后的共同想法是让流行的索引再次适合内存:

  • 你可以添加一些内存
  • 您可以使用更小的数据类型
  • 您可以删除或合并索引并重写查询以以某种方式使用索引
  • 您可以对数据进行分区并在多台机器之间分配索引
  • ...

并确保您使用索引,因为如果一个表快速增长,整个表的表扫描将很快减慢您的查询速度。

【讨论】:

    猜你喜欢
    • 2018-08-20
    • 1970-01-01
    • 2021-01-22
    • 1970-01-01
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    • 2020-05-19
    • 2010-09-25
    相关资源
    最近更新 更多