【问题标题】:PostgreSQL optimization: running select queries on preselected subsetPostgreSQL 优化:在预选子集上运行选择查询
【发布时间】:2013-09-22 11:26:34
【问题描述】:

我需要在一张桌子上运行多个(很多!)选择(显然是简化的):

libraries_books
---------------
id
library_id
book_id

我将在同一个library_id 上寻找不同的book_id

现在,我知道临时表了:

SELECT id, book_id INTO TEMPORARY tmp_books where library_id=?

然后可以选择在tmp_books 上添加索引并在其上运行查询而不是libraries_books,但我感觉还有另一种方法可以以更高效的方式实现这一目标。有吗?

【问题讨论】:

  • 你在这里实际上没有问题。
  • 除了(library_id, book_id) 上的单个索引之外,您实际需要多少额外性能?
  • 那张桌子上的那些“多重选择”是什么?您确定不能将其组合成一个语句吗?使用临时表来做类似的事情听起来有点奇怪。
  • 我用问题编辑了问题 :) 我还删除了关于 upsert 的多余信息,但谢谢你……桌子会变得非常大,我要做数万select 一次就在上面(复杂的导入脚本),-并且一些查询也基于其他列(除了book_id),所以性能是 一个问题。此外,这是我经常遇到的一种普遍问题,只是认为会有一个我不知道的解决方案。
  • Postgres 8.4 将于明年年中取消支持,因此无论如何您都应该尽快计划升级。也许是提前升级并使用可写 CTE 的好理由

标签: sql postgresql optimization query-optimization


【解决方案1】:

过早的优化是万恶之源。在 PostgreSQL 中,您不会出错:

  1. 规范化您的数据
  2. 将索引应用于所需的少数表
  3. 根据需要调整索引

一般来说,PostgreSQL 有很多技巧可以让你的用例变得更快。您不仅在数据库中有缓存,而且如果它们都必须进行顺序扫描,您还可以对同一个表进行选择并行工作(这意味着第二个查询可以获得第一个查询的捎带的好处)扫描)。

如果您最终得到大量记录,请考虑使用部分索引或其他策略。

【讨论】:

  • +1,但我确实讨厌这句话,“过早的优化是万恶之源”。
  • 这个答案是否意味着另一个问题?因为它与我无关。
  • Raveren,不清楚你的问题是什么,所以我给出了一个非常笼统的评估。随意编辑,也许你会得到更好的答案。
猜你喜欢
  • 2021-12-17
  • 1970-01-01
  • 2014-07-28
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
  • 2016-01-23
  • 1970-01-01
相关资源
最近更新 更多