Query Caching

当我们将同样的SQL语句执行两次时,第二次会执行的显示快一些。

例如执行两次上一节的join查询:

select
       title.title,
       title.language,
       title_basics.primarytitle,
       title_basics.startyear,
       title_basics.genres
from imdb.title
  join imdb.title_basics on title.titleid = title_basics.tconst
where title.language = 'en' limit 100;

第二次的时间会快很多:

image-20221026194038292

image-20221026194136737

2017年Redshift推出了一个新特性,会将第一次的执行结果缓存,在第二次执行同样的语句时,从缓存中读出结果并返回。这对于需要重复执行查询的情景,可以大大降低Redshift的查询压力,如BI报表工具。

它的原理和Redis差不多:

image-20221026194619013

Redshift将查询结果保存leader node的内存。如果想确认SQL查询结果有没有被缓存,可以从SVL_QLOG表里查询,source_query不为空的表示已缓存。这张表里还有一些元数据,如查询的起始时间、结束时间等信息:

image-20221026195609522

另外,Query Caching在以下场景不会生效:

  • 查询结果太大了,leader node放不下

  • 连接Amazon Redshift Spectrum 外部表时

  • 当DML或DDL语句更新表时,Redshift会自动把缓存失效(很合理,防止读到脏数据)

Query Cache这个特性默认开启,如果想关掉,可以设置enable_result_cache_for_session = off


参考: https://docs.aws.amazon.com/redshift/latest/dg/c_challenges_achieving_high_performance_queries.html#result-caching