Max Ganz II 很好地解释了 autoWLM 及其局限性,因此我不再赘述。我将谈谈查询性能下降。我花了将近 30 年的时间设计微处理器和高端计算机系统,并在 5 多年的时间里帮助人们使用 Redshift。我以前见过这种情况,您可能无法使用 WLM 设置来改善这种情况,但还是有希望的。
这个问题很可能是由于查询使一个或多个系统资源过载(这是您怀疑的)。但是,数据库只能在边缘工作以限制查询进程使用的资源。 WLM 可以控制 malloc 的卡盘有多大,以便查询可以在更有限的内存占用中运行,但它无法控制查询使用多少内存。 WLM 可以尝试限制查询在 CPU 上运行的时间量,但它实际上并不能控制进程调度程序,操作系统可以。这些 WLM 设置可以使昂贵的查询对其他查询“更友好”,但这些只是围绕边缘进行的调整。
操作系统 (Linux) 控制在硬件上运行的内容,并且硬件有限制。当达到这些限制之一时,系统上的所有工作都会受到影响。所有数据库系统都是如此,不仅仅是 Redshift,而且 Redshift 是建立在高端行业标准硬件集群上的,因此其中一些限制比专门构建的扩展系统更早(还有一些更晚)。需要注意的罪魁祸首是内存、CPU、磁盘 IO 和网络 IO(以及超载的领导节点,这会增加一些夹点)。
很有可能您的查询导致这些硬件系统之一过载并需要重写。两个最常见的原因是将 TB 数据交换到磁盘的高溢出查询和在网络上分布 TB 数据的查询。这两种情况都可能发生在同一个查询中。磁盘 IO 系统和网络 IO 系统的带宽都是有限的,它们的使用由操作系统控制——数据库层无法限制一个查询对它们的使用。
我强烈怀疑您需要查看此查询并查看它正在使用哪些网络和 IO 资源。 (这可能是由于其他方面,但这些是前 2 个。)以下是我用来开始挖掘类似问题的 3 个查询:
-- High network queries
select userid, starttime, query, sum(bytes)/1000000000 as network_gbytes
from stl_dist
where userid <> 1 and starttime > getdate() - interval '1 day'
group by 1, 2, 3
having network_gbytes > 10;
-- High spill queries
select userid, starttime, query, sum(bytes)/1000000000 as spill_gbytes
from stl_scan s
where perm_table_name ilike '%internal worktable%'
and userid <> 1 and starttime > getdate() - interval '1 day'
group by 1, 2, 3
having spill_gbytes > 10 ;
-- High scan queries
select userid, starttime, query, sum(bytes)/1000000000 as table_scan_gbytes
from stl_scan s
where perm_table_name not ilike '%internal worktable%'
and userid <> 1 and starttime > getdate() - interval '1 day'
group by 1, 2, 3
having table_scan_gbytes > 100;
这些只是过去一天的一般搜索查询,因此您需要调整它们以专注于您的查询并将“有”子句调整到您的集群。