当我将大表加载到IcCube架构中时,同一数据库的不同表之间每秒提取的行数差异很大。 不幸的是,我不知道如何优化此速度,因为我不知道该速度取决于什么。
例如,我有一个架构,其中包含3个不同的表,每个表具有超过2000万行。一张表的加载速度为15.000行/秒,另一张表的加载速度为100.000行/秒
是否有最佳实践,如何最大程度地提高速度?它是否取决于使用此表或其他内容的维度数量,度量数量,计算得出的度量数量? 以及不同的依赖性有多严重?
答案 0 :(得分:3)
假设您正在谈论用于构建多维数据集的表的处理速度(实际上,您不太可能要处理几百万行中的维)。
维度处理
维度不应该像事实一样大,但事实可能如此。有一个约束条件可能会减慢它的“父级名称唯一”。如果尺寸加载速度不够理想,只需删除它即可。
事实处理
icCube通过首先从基础数据源中加载数据然后处理这些数据来构建事实(也称为度量值组)。 LOADING 和 PROCESSING 可以同时发生,并且每个线程可以在多个线程中运行以加快速度(您可以在{{1}中查看更多详细信息}:icCube.xml
)。
最后,icCube无法比从数据源传递数据更快地建立事实。因此,首先要检查的是数据源的速度(在您的情况下为SQL查询的速度)。
数据源速度
自icCube v6.8起,配置loadReadingThreadCount, loadProcessingThreadCount, ...
允许处理事实而不构建事实。这样,查看事实的模式统计信息,您实际上将看到SQL查询的速度。为了简化操作,请确保使用icCube.loadProcessingFactsMode = NONE
逐个加载事实。然后,您可以查看“装入详细信息”中每个事实的模式统计信息。例如,
icCube.loadReadingThreadCount = 1
从结果中,如果速度似乎很慢,则可以对SQL查询进行故障排除,并且/或者如果速度远远低于数据源的本机客户端的速度,则可以与icCube联系。
下一步是查看是否可以以相同速度并行加载多个事实。有了3个事实,您可以尝试:
F : Cashflow.Facts
Rows Count : 100'000'000
Rows/Sec : 225'000
再次,检查生成的模式统计信息,并查看数据源是否可以按您希望的速度传递数据。
icCube处理速度
一旦了解了数据源的实际速度和可以使用的并行负载数,就可以确定最佳的处理线程数;您可以从2(开箱即用的配置)开始:
icCube.loadProcessingFactsMode = NONE
icCube.loadReadingThreadCount = 3
并增加它,直到达到无法获得更多增益的极限;例如,我们使用以下设置获得了达到60万行/秒的客户:
icCube.loadProcessingFactsMode = FULL
icCube.loadReadingThreadCount = 3
icCube.loadProcessingThreadCount = 2
在处理期间,icCube主要在构建内部索引。速度主要取决于要索引的层次结构的数量(您可以在每个事实统计信息中看到它们)。统计信息中提供了一些其他信息:
icCube.loadReadingThreadCount = 3
icCube.loadProcessingThreadCount = 6
核心计数
一个简短的说明, F : Cashflow.Facts
Elapsed : 58m14s
- whole processing : 2h16m22s -- greater than elapsed because of several threads of processing
- resolve members : 1h25m49s -- from member "keys" to internal icCube members
- index & columns : 50m30s -- mainly about building the index
Page Lock Time : 25.45s -- the lower the better
Page Lock Count : 105258
Cache Hit : 8'135'974'783 -- the higher the better (used by resolve members above)
Cache Miss : 241'674'486
的数量应该少于可用内核的数量,因为处理工作受CPU / RAM的限制很大。
Java垃圾收集器
您还可以使用日志文件中的grep“ GC”调查GC行为(暂停)。如果出现问题,可以在启动icCube时使用以下Java选项增加RAM的数量和/或尝试使用G1:loadReading/Processing ThreadCount
。
希望有帮助。