Performance 大量相同价值的索引/性能策略

Performance 大量相同价值的索引/性能策略,performance,postgresql,indexing,Performance,Postgresql,Indexing,基本信息:这与OpenStreetMap数据的索引过程有关。为了简化问题:核心信息分为3种主要类型,值为“W”、“R”、“N”(VARCHAR(1)) 该表大约有75M行,所有带有“W”的列组成42M行。现有索引与此问题无关 现在的问题是:数据的索引是通过一个过程完成的。在此过程中,有一些循环执行以下操作: […]从_key=“W”所在的表中选择*;[……] 结果再次循环,上面的查询本身也在循环中。这需要大量的时间,并大大减慢了过程。索引键显然是无用的,因为索引可能使用的所有值都是相同的(“W

基本信息:这与OpenStreetMap数据的索引过程有关。为了简化问题:核心信息分为3种主要类型,值为“W”、“R”、“N”(
VARCHAR(1)

该表大约有75M行,所有带有“W”的列组成42M行。现有索引与此问题无关


现在的问题是:数据的索引是通过一个过程完成的。在此过程中,有一些循环执行以下操作:

[…]从_key=“W”所在的表中选择*;[……]

结果再次循环,上面的查询本身也在循环中。这需要大量的时间,并大大减慢了过程。索引键显然是无用的,因为索引可能使用的所有值都是相同的(“W”)。脚本本身以正常的速度运行,只有
SELECT
ing需要很长时间

是吗

  • 需要创建一种“特殊”的索引来考虑这一点,并使
    选择更快?如果是,哪一个
  • 需要调整一些服务器参数(它们已经调整过了,并且它们提供的结果似乎很好。如果需要,我可以发布它们)
  • 必须适应速度,只需获得更多硬件即可获得更多动力(蒂姆·泰勒·格伦特)

上述各点的任何替代方案(除了重写或不使用它)

如果您将
work\u mem
设置得足够高以启用位图索引扫描,则此查询可以使用索引。然而,很有可能优化器仍然不会选择使用它。总之,这方面没有太多需要优化的地方。周围的循环代码似乎需要改进。

如果将
work\u mem
设置得足够高以启用位图索引扫描,则此查询可能会使用索引。然而,很有可能优化器仍然不会选择使用它。总之,这方面没有太多需要优化的地方。看起来周围的循环代码需要改进。

首先你说:

这张桌子大约有75米宽 行,所有带“W”的列组成 约4200万行

然后你说你喜欢

SELECT * FROM table WHERE the_key = "W";
在一个循环中多次并期望它执行?这是不可能的-没有索引可以加速这个查询-它必须返回4200万行-超过一半。如果您拒绝重写此索引过程以避免多次查询,那么它就是值得的。

首先您要说:

这张桌子大约有75米宽 行,所有带“W”的列组成 约4200万行

然后你说你喜欢

SELECT * FROM table WHERE the_key = "W";

在一个循环中多次并期望它执行?这是不可能的-没有索引可以加速这个查询-它必须返回4200万行-超过一半。如果您拒绝重写此索引过程以避免多次查询此索引,那么它就是值得的。

您还可以优化什么?这可能是由于您处理的数据量太大造成的。e、 g.不要从循环中的_key=“W”所在的表中选择*。您还可以优化什么?这可能是由于您处理的数据量太大造成的。e、 g.不要从循环中的_key=“W”所在的表中选择*。+1。如果超过一半的行符合
the_key='W'条件,那么计划者可能会选择表扫描,不是吗?关键是避免在结果集上循环多次。+1。如果超过一半的行符合the_key='W'条件,那么计划者可能会选择表扫描,不是吗?关键是要避免在结果集上重复出现一次。我不表达任何魔法或其他东西。也许有“隐藏的宝石”可以帮上忙,我一直希望有这样的东西;)。我只是想确认这是剧本作者的错。无论如何+1表示微妙的讽刺^^^我不表达任何魔法或其他东西。也许有“隐藏的宝石”可以帮上忙,我一直希望有这样的东西;)。我只是想确认这是剧本作者的错。无论如何+1表示微妙的讽刺^^