让查询运行得更快 - 它没有加入

时间:2018-04-06 15:51:28

标签: sql postgresql performance

我收到了大量的数据,这些数据过去只是为了获得它而被加入(因为团队决定将它们全部收集到一个表中的速度非常慢),但现在即使它们真的很简单在一张桌子上(不需要加入)。

它仍然很慢。参加为期一天的范围过滤活动将导致超时(花费超过10秒,是的,它有多糟糕)。

我应该向DBA提出什么建议?

2 个答案:

答案 0 :(得分:1)

什么是“选择性”?也就是说,您的选择期望检索多少行? 100%的行? 1%的行? 0.01%的行?

<强> 1。选择性低

如果选择性低(即小于5%,理想情况下小于0.5%),那么良好的分度是最佳实践。

如果是这样,where子句(过滤列)中的哪些列具有最佳(最低)选择性?首先在索引中添加这些列。

确定最佳索引后,可以使用该索引使表成为“聚簇索引”表。这样,堆将被索引列预先排序(快速查找),以便改进io,因为磁盘块将按顺序查找。

<强> 2。高选择性

如果选择性很高(20%或更高),那么你就无法做到(开发)。您仍然可以通过以下方式获得一些改进:

  • 删除不需要的列。
  • 确保select使用FULL TABLE SCAN。
  • 要求DBA分配更多资源(SGA,磁盘优先级,并列等)。

第3。否则

您拥有的数据量远远超过您拥有的数据库资源。除了告诉客户这个现实之外,你无能为力,并且:

  • 一起找到一种定义可以实现的较小查询的方法。

<强> 4。最后

如果您不了解选择性,全表扫描,索引,数据库资源,堆,磁盘块的条款,我建议您研究它们。我很确定你现在需要完全理解它们!

答案 1 :(得分:0)

正如其他人所说,你需要一个索引。但是,如果它真的巨大,你可以对数据进行分区。

这允许您删除部分数据,而不使用耗时的删除操作。例如,如果您正在使用某种历史数据并希望保留3个月的价值,则可以按月进行分区,然后每月删除最旧的分区。

然而,从更一般的角度来看,采用缓慢的多表查询并将其全部放在一起以提高性能并不是一个好主意。你真正需要的是找出慢查询的错误并修复它。

这是DBA的工作。