postgresql - 创建外键引用以优化 Tableau SQL 查询
问题描述
我是数据库设计的新手,希望通过实验和实现来学习,我确信在一般的数据库设计中已经提出了这个问题的某些版本,但这是特定于 Tableau 的。
我有一些仪表板是从包含数百万行数据的 PostgreSQL 数据库表中绘制的。性能重新渲染视图非常慢(即,如果我选择不同的参数,Tableau 的Executing SQL query
弹出窗口会出现,并且通常需要几分钟才能完成)。
我使用 Tableau 中的性能记录选项对此进行了调试,将 Tableau 正在使用的 SQL 查询导出到文本文件,然后使用EXPLAIN ANALYZE
它来找出究竟是什么瓶颈。不幸的是,我不能自己发布 SQL 查询,但我在下面创建了一个人为的案例,以尽可能提供帮助。这是我的桌子目前的样子。Tableau 呈现的实际值是绿色的,我有外键引用的列是黄色的:
我在查询计划中看到,有很多昂贵的位图堆扫描正在实现在前端的 Tableau 上使用的过滤器neighborhood_id
,...view
animal
date_updated
animal_name
我试图在这些字段上放置一个多重索引,但是在重新运行查询时,PG 查询规划器似乎并没有选择使用这些索引。
所以我提出的解决方案是为每个字段(neighborhood_id
, view
, animal
, date_updated
,animal_name
)创建外键引用 - 再次,黄色代表 FK 引用:
我希望这些 FK 引用将强制查询计划器使用索引扫描而不是顺序扫描或位图堆扫描。但是,我的问题是
以前,所有数据或多或少都存储在这个表中,有两个表
shelter
和age_of_animal
表的连接。现在,这个表将连接到 8 个较小的子表——这些连接会大大降低性能吗?子表非常小(即该animal
表将只有 40 个条目)。我知道如果没有看到实际的查询和查询计划就很难回答这个问题,但是查询计划者选择不使用索引的一些高级原因是什么?我已经阅读了一些文章,例如“为什么 Postgres 不会总是使用索引”,但它们大多指的是小型表和简单查询的情况,其中索引查找的成本比简单地遍历行要大。不过,我认为不适用于我的情况-我有数百万行和 5 列以上的复杂过滤器。
- 与常规列相比,PG 查询计划器是否更有可能在外键列的集合上使用多个列索引?我知道 PG 不会自动在外键上添加索引,所以我想在创建外键引用后我仍然需要添加索引。
当然,我的问题的答案可能是“你为什么不试试看?”,但在这种情况下,重构这么大的表是相当昂贵的,我想先了解一下这是否值得之前的成本承担它。
解决方案
推荐阅读
- cordova - 如何在 Cordova 中使用 Google Play 服务
- php - 比较两个数组的差异
- sql - 我怎样才能加快这个查询?
- ubuntu - Nginx 的参数数量无效
- javascript - 元素隐式具有“任何”类型,因为索引表达式不是“数字”类型。ts(7015)
- python - 如何删除现有的 Google OAuth2.0 令牌(错误 401:deleted_client)
- python - 在 GRU 层 Pytorch 中训练将在一段时间后停止
- python - 我试图让 kmeans 绘制 5 个集群,但我只绘制了 1 个集群
- c++ - 在 CLion 中,如何查看动态链接共享库的代码覆盖率
- unity3d - 如何将字符串数组保存到 Unity 中的 PlayerPrefs?