首页 > 解决方案 > 创建外键引用以优化 Tableau SQL 查询

问题描述

我是数据库设计的新手,希望通过实验和实现来学习,我确信在一般的数据库设计中已经提出了这个问题的某些版本,但这是特定于 Tableau 的。

我有一些仪表板是从包含数百万行数据的 PostgreSQL 数据库表中绘制的。性能重新渲染视图非常慢(即,如果我选择不同的参数,Tableau 的Executing SQL query弹出窗口会出现,并且通常需要几分钟才能完成)。

我使用 Tableau 中的性能记录选项对此进行了调试,将 Tableau 正在使用的 SQL 查询导出到文本文件,然后使用EXPLAIN ANALYZE它来找出究竟是什么瓶颈。不幸的是,我不能自己发布 SQL 查询,但我在下面创建了一个人为的案例,以尽可能提供帮助。这是我的桌子目前的样子。Tableau 呈现的实际值是绿色,我有外键引用的列是黄色的: 在此处输入图像描述

我在查询计划中看到,有很多昂贵的位图堆扫描正在实现在前端的 Tableau 上使用的过滤neighborhood_id,...viewanimaldate_updatedanimal_name

我试图在这些字段上放置一个多重索引,但是在重新运行查询时,PG 查询规划器似乎并没有选择使用这些索引。

所以我提出的解决方案是为每个字段(neighborhood_id, view, animal, date_updated,animal_name)创建外键引用 - 再次,黄色代表 FK 引用在此处输入图像描述

我希望这些 FK 引用将强制查询计划器使用索引扫描而不是顺序扫描或位图堆扫描。但是,我的问题是

  1. 以前,所有数据或多或少都存储在这个表中,有两个表shelterage_of_animal表的连接。现在,这个表将连接到 8 个较小的子表——这些连接会大大降低性能吗?子表非常小(即该animal 表将只有 40 个条目)。

  2. 我知道如果没有看到实际的查询和查询计划就很难回答这个问题,但是查询计划者选择不使用索引的一些高级原因是什么?我已经阅读了一些文章,例如“为什么 Postgres 不会总是使用索引”,但它们大多指的是小型表和简单查询的情况,其中索引查找的成本比简单地遍历行要大。不过,我认为不适用于我的情况-我有数百万行和 5 列以上的复杂过滤器。

  3. 与常规列相比,PG 查询计划器是否更有可能在外键列的集合上使用多个列索引?我知道 PG 不会自动在外键上添加索引,所以我想在创建外键引用后我仍然需要添加索引。

当然,我的问题的答案可能是“你为什么不试试看?”,但在这种情况下,重构这么大的表是相当昂贵的,我想先了解一下这是否值得之前的成本承担它。

标签: postgresqlindexingtableau-api

解决方案


推荐阅读