您现在的位置是:主页 > 云服务器 >

物联网技术-用物化视图解决多聚类性能问题

2020-10-27 14:56云服务器 人已围观

简介用物化视图解决多聚类性能问题2018年12月12日|5分钟读取作者:罗伯特·费曼工程、雪花科技最近发布的雪花物化视图(MV)提供了一个令人兴奋的新特性,它为Snowflake增加了性能改进。...

用物化视图解决多聚类性能问题

用物化视图解决多聚类性能问题2018年12月12日|5分钟读取作者:罗伯特·费曼工程、雪花科技最近发布的雪花物化视图(MV)提供了一个令人兴奋的新特性,它为Snowflake增加了性能改进。物化视图支持几个不同的用例,包括性能。在这篇博文中,我将重点讨论如何使用物化视图来解决大型数据集具有多个访问路径时出现的特定性能问题。本文中的例子展示了一个100亿行表和两种不同的查询数据的方法。设置假设有一个weblog,它跟踪不同用例的不同属性(ID)可以访问的某些度量,比如时间戳和页面ID。为了简化设置,下表说明了使用bigint作为IDs的数据类型。在真实的用例中,数据类型可以是雪花支持的任何类型;但是,为了增加数据集的大小并使用例更真实,我添加了属性(metric2到metric9)。创建或替换表日志(创建比吉特先生,物联网时代,第三页,时间-加载时间-毫秒整数,METRIC2整数,METRIC3整数,METRIC4整数,METRIC5整数,METRIC6整数,METRIC7整数,METRIC8整数,METRIC9整数);我想计算两个不同用例的平均加载时间。在用例A)中,我将关注所有页面在特定时间段内的平均负载。对于用例B),我将关注特定页面的平均加载时间。在这个实例中,查询返回很快,因为数据是按创建日期自然聚集的。但是,用例B)需要更多的时间,因为数据是按Page_ID过滤的,而它是按创建日期CREATE_MS聚集的。问题是:多个访问路径为了说明这个问题,我将生成一个大数据集(100亿行)。假设CREATE_MS以毫秒为单位,并且Page_ID的数据是随机的,则数据按顺序流入WEBLOG表。插入日志选择(SEQ8())::BIGINT AS CREATE\u MS,统一(19999999,随机(10002))::BIGINT页\u ID,统一(19999999,随机(10003))::整数次加载时间,统一(19999999,随机(10005))::整数度量2,统一(19999999,随机(10006))::整数度量3,统一(19999999,随机(10007))::整数度量4,软件企业管理,统一(19999999,随机(10008))::整数度量5,统一(19999999,随机(10009))::整数度量6,统一(19999999,随机(10010))::整数度量7,统一(19999999,随机(10011))::整数度量8,统一(19999999,随机(10012))::整数度量9从表(生成器(行数=>1000000000))按创建订购;估计雪花中性能的一个关键指标是过滤器属性的聚类深度。要检索表上某个属性的聚集深度,请首先使用ALTER table语句指定集群属性。更改表WEBLOG CLUSTER BY(CREATE_MS);选择系统$CLUSTERING_INFORMATION('WEBLOG','(CREATE_MS)';选择系统$CLUSTERING_INFORMATION('WEBLOG','(PAGE_ID)';属性CREATE_MS的聚类深度是一个很好的选择,因为它提供的值很小。在本例中,它是~1,但这对于PAGE_ID来说是次优的(一个大值),但是,因为我创建了按CREATE_MS排序的数据,这是一个预期的结果。另一方面,PAGE_ID是随机分布的。对WEBLOG运行查询可以确认问题。要使问题变得容易发现,需要为100亿行数据集运行一个相对较小的仓库。下面的数字基于一个中等集群。选择COUNT(*)CNT,AVG(TIME_TO_LOAD_MS)AVG_TIME_TO_LOAD(计数(*)CNT,AVG(时间到加载毫秒)平均时间从日志其中,在1000000000和100000000之间创建μm;选择COUNT(*)CNT,AVG(TIME_TO_LOAD_MS)AVG_TIME_TO_LOAD(计数(*)CNT,AVG(时间到加载毫秒)平均时间从日志其中PAGE_ID=100000;两个查询都汇总了大约1000行。第一个查询大约在0.1秒内运行,第二个查询大约需要100秒(假设是冷数据缓存)。这是因为第一个查询只检查一个微分区,而第二个查询扫描大约21000个。要以相同的性能运行这两个查询,需要使用组织不同的数据的第二个副本,从而优化两个查询模式的访问。解决方案:集群物化视图解决这个问题的方法在于雪花的两个新特性:物化视图和自动聚类。使用Snowflake创建物化视图允许您指定新的集群键,超级淘客,这使Snowflake能够在最初创建物化视图期间重新组织数据。对于大约100亿行的源表,一个中等规模的仓库大约需要20分钟来创建物化视图。为了提高性能并减少创建测试日期的时间,淘客程序,我在Snowflake中使用了另一个功能,即可以弹性地调整仓库大小。在运行下面的代码时,您需要将占位符更改为您自己的仓库名称。使用下面的示例可以减少物化视图的初始构建时间,使其比在中型集群上运行相同语句快16倍。运行下面显示的代码时,用仓库的名称更改占位符。ALTER WAREHOUSE设置仓库大小=XXXLARGE;创建或替换物化视图MV_TIME_TO_LOAD(CREATE_MS,PAGE_ID,TIME_TO_LOAD_MS)集群依据(PAGE_ID)作为选择CREATE_-MS、PAGE_-ID、TIME-TO-u-LOAD-MS来自博客;ALTER WAREHOUSE设置WAREHOUSE_SIZE=MEDIUM;在完成物化视图构建后,通过检索聚类信息来验证最优数据分布。选择SYSTEM$CLUSTERING_信息('MV_TIME_TO_LOAD','(页面编号)';集群深度应该是~2,这表明通过PAGE_ID对物化视图的查询应该快得多。快多少?为了获得基线,我首先对基表运行查询。要获得更具再现性的结果,需要限制查询结果缓存的影响。查询结果缓存是Snowflake中的另一个很好的特性;但是,在比较性能时,您需要比较苹果和苹果。因此,我禁用了缓存结果功能。ALTER SESSION SET USE_CACHED_RESULT=FALSE;选择计数(*),平均值(从加载到加载的时间)从日志其中PAGE_ID=100000;第二个查询不会像第一次运行查询时那样花费大约100秒。这一次大约需要20秒。为什么?因为现在您看到了雪花在执行集群上同时提供结果缓存和微分区缓存的影响。如果这是第一次运行这个查询,并且集群缓存是冷的,那么它仍然需要大约100秒。现在,让我们对照物化视图检查同一查询的运行时。测试显示结果需要大约0.1秒的时间,这与CREATE\u MS对基表的查找类似。ALTER SESSION SET USE_CACHED_RESULT=FALSE;选择COUNT(*),AVG(TIME_TO_LOAD_MS)AVG_TIME_TO_LOAD从MV_时间_到_负载其中PAGE_ID=100000;这是一个实质性的改进。然而,上面的场景本身并没有那么令人印象深刻,因为通过createtableas(CTAS)语句创建一个新的、具体化的基表版本可以完成相同的任务。那么,当基表中的数据发生变化时会发生什么呢?CTAS版本中的数据立即变得过时。把它们放在一起物化视图的真正威力源于这样一个事实:对基表(WEBLOG)的所有DML更改(插入、更新、删除)都会自动应用于物化视图。不仅要应用更改,而且要以事务一致的方式应用这些更改。现在,在任何时候,物化视图中的数据在将其应用于源表时都将与视图查询的数据相匹配。最后,在源表上拥有物化视图不会影响源表的DML性能。为了模拟源表的活动,我编写了一个小Python程序,在批处理之间插入具有可配置秒数的行。进口雪花。连接器导入时间导入系统def getSnowFlakeCntxt():#设置雪花上下文。雪花CTX=雪花。连接器。连接(用户=,密码=,账户=仓库=,数据库=,模式=)返回雪花CTXdef executeSnowflakeCmd(迭代、批处理、种子):conn=getSnowFlakeCntxt()cs=连接光标()尝试:       cs.执行("alter session set QUERY_TAG=%s",("MV_INSERT_TEST"))insSQL=""插入日志选择((seq8())+"""+str(iteration*batch+seed)+""):"bigint as create\u ms,统一(19999999,淘客app原生,随机(10002))::bigint页\u id,统一(19999999,随机(10003))::整数时间-加载时间-毫秒,统一(19999999,随机(10005))::整数度量2,统一(19999999,随机(10006))::整数度量3,统一(19999999,随机(10007))::整数度量4,统一(19999999,随机(10008))::整数度量5,统一(19999999,随机(10009))::整数度量6,统一(19999999,随机(10010))::整数度量7           

Tags: 物化  解决  多聚类  问题  视图  性能 

站点信息

  • 文章统计3903篇文章
  • 标签管理标签云
  • 微信公众号:扫描二维码,关注我们