存储容器的本地缓存
如果以投影指定的排序顺序读取容器数据很重要,则 Vertica 执行引擎使用 StorageMerge 运算符从存储容器中读取数据。这对于在将数据合并到单个存储容器之前必须保留从多个存储容器读取的数据的排序顺序的操作特别有用。强制排序顺序的常见操作包括 mergeout,以及一些带有 ORDER BY 子句的查询(例如 CREATE TABLE...AS,其中查询包含 ORDER BY 子句)。
执行引擎通常会向 StorageMerge 运算符分配多个线程。每个线程都分配有一个 Scan 运算符来打开和读取容器内容。如果要读取的容器数大于可用线程数,则执行引擎可能会将单个 Scan 运算符分配给多个容器。在这种情况下,Scan 运算符可能需要在不同的容器之间切换并多次重新打开它们,然后才能获取和组装所有必需的数据。尤其在读取远程文件系统(如 S3)上的存储容器时,这样做会出现问题。重新打开和读取远程存储容器所产生的额外开销会显著影响性能和使用成本。
您可以配置数据库,以便执行引擎在本地磁盘上缓存需要多次打开的 S3 存储容器的数据。每个查询分配给 StorageMerge 运算符用于缓存的临时空间大小由配置参数 StorageMergeMaxTempCacheMB 设置。默认情况下,此配置参数设置为 -1(无限制)。如果缓存请求超出临时空间限制或可用磁盘空间,Vertica 会缓存尽可能多的容器数据,然后从 S3 读取。
要关闭缓存,请将 StorageMergeMaxTempCacheMB 设置为 0。