创建外键引用以优化Tableau SQL查询

时间:2018-06-23 18:33:31

标签: postgresql indexing tableau

我是数据库设计的新手,希望通过实验和实现来学习,我敢肯定,在数据库设计中总体上已经询问了该问题的某个版本,但这是特定于Tableau的。

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

我通过使用Tableau中的性能记录选项,将Tableau使用的SQL查询导出到文本文件,然后使用 EXPLAIN ANALYZE 进行了调试,以找出瓶颈所在是。不幸的是,我无法自己发布SQL查询,但是我在下面创建了一个人为的案例,以尽可能提供帮助。这是我的桌子目前的样子。 Tableau呈现的实际值绿色,而我具有外键引用的列为黄色enter image description here

我在查询计划中看到,有许多昂贵的位图堆扫描正在实现过滤器,这些扫描器正在 neighborhood_idview,{{1} },animaldate_updated

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

因此,我建议的解决方案是为这些字段( animal_nameneighborhood_idviewanimal,{{1} } )-,再次,黄色代表FK参考enter image description here

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

  1. 之前,所有数据或多或少都存储在此表中, 两个联接到date_updatedanimal_name表。现在,这张桌子 将被连接到8个较小的子表中-这些将大幅度地连接 降低性能?子表非常小(即shelter 表将只有40个条目)。

  2. 我知道如果不看实际问题就很难回答这个问题 查询和查询计划,但是出于什么高级原因, 查询计划者选择不使用索引?我已经阅读了"Why Postgres Won't Always Use An Index"之类的文章,但大多数文章都是针对这种情况,即它是一个小表和一个简单的查询,在这些情况下,索引查找的开销比简单地遍历行要大。我不认为这适用于我的情况-我有数百万行,并且在5列以上具有复杂的过滤器。

  3. PG查询计划器是否更有可能使用多列 外键列集合索引与常规索引 列? I know that PG does not automatically add indices on foreign keys,所以我想我仍然需要在之后添加索引 创建外键引用。

当然,我的问题的答案可能是“你为什么不试试看呢?”,但是在这种情况下,重构这么大的表是非常昂贵的,我想对是否值得一番直觉承担费用之前的费用。

0 个答案:

没有答案