我是数据库设计的新手,希望通过实验和实现来学习,我敢肯定,在数据库设计中总体上已经询问了该问题的某个版本,但这是特定于Tableau的。
我有一些仪表板是从包含数百万行数据的PostgreSQL数据库表中绘制的。重新呈现性能的视图非常慢(即,如果我选择其他参数,则会出现Tableau的Executing SQL query
弹出窗口,并且通常需要几分钟才能完成)。
我通过使用Tableau中的性能记录选项,将Tableau使用的SQL查询导出到文本文件,然后使用 EXPLAIN ANALYZE
进行了调试,以找出瓶颈所在是。不幸的是,我无法自己发布SQL查询,但是我在下面创建了一个人为的案例,以尽可能提供帮助。这是我的桌子目前的样子。 Tableau呈现的实际值为绿色,而我具有外键引用的列为黄色:
我在查询计划中看到,有许多昂贵的位图堆扫描正在实现过滤器,这些扫描器正在 neighborhood_id
,view
,{{1} },animal
,date_updated
。
我试图在这些字段上放置多个索引,但是在重新运行查询时,PG查询计划程序似乎并没有选择使用这些索引。
因此,我建议的解决方案是为这些字段( animal_name
,neighborhood_id
,view
,animal
,{{1} } )-,再次,黄色代表FK参考:
我希望这些FK引用将强制查询计划程序使用索引扫描,而不是顺序扫描或位图堆扫描。但是,我的问题是
之前,所有数据或多或少都存储在此表中,
两个联接到date_updated
和animal_name
表。现在,这张桌子
将被连接到8个较小的子表中-这些将大幅度地连接
降低性能?子表非常小(即shelter
表将只有40个条目)。
我知道如果不看实际问题就很难回答这个问题 查询和查询计划,但是出于什么高级原因, 查询计划者选择不使用索引?我已经阅读了"Why Postgres Won't Always Use An Index"之类的文章,但大多数文章都是针对这种情况,即它是一个小表和一个简单的查询,在这些情况下,索引查找的开销比简单地遍历行要大。我不认为这适用于我的情况-我有数百万行,并且在5列以上具有复杂的过滤器。
当然,我的问题的答案可能是“你为什么不试试看呢?”,但是在这种情况下,重构这么大的表是非常昂贵的,我想对是否值得一番直觉承担费用之前的费用。