将数据加载到聚合存储多维数据集

Essbase 聚合存储 (ASO) 多维数据集有助于分析包含多达一百万个或更多成员的非常大的维。为了帮助您将数据加载到如此大的大纲中,您可以增量加载、管理数据加载缓冲区以及合并/替换数据分片。

为了有效地支持将数据值加载到此类大型多维数据集, Essbase

  • 允许通过临时数据加载缓冲区处理多个数据源

  • 允许您控制数据加载缓冲区使用的资源百分比

  • 允许聚合存储多维数据集包含多个数据分片(对数据库的查询访问每个分片,收集所有数据单元)

  • 提供与增量数据大小成正比的增量数据加载过程,该过程在一定时间内完成

要加载值以聚合存储多维数据集,可以使用 Essbase Web 界面中的“作业”页,也可以使用 MaxL 中的更改数据库导入数据语句。本文档中的示例基于使用 MaxL

注意:

如果已通过聚合计算和存储值,则当数据值发生更改时, Essbase 会自动更新更高级别的存储值。不需要其他计算步骤。聚合的存在性和大小可能会影响执行数据加载所需的时间。

将数据加载到多维数据集时,无法导出数据。

复制 ASO 应用程序时,要保留多维数据集中的所有数据,必须在复制应用程序之前将所有增量数据切片合并到主数据库切片中。不会复制未合并的增量数据切片中的数据。

通过数据加载缓冲区增量加载数据

如果使用增量数据加载将数据值加载到 Essbase 聚合存储 (ASO) 多维数据集,则可以提高性能。Essbase 会首先将值加载到临时数据加载缓冲区,并在读取所有数据源后对存储进行最终写入。

使用 import data MaxL 语句从单个数据源加载数据值并不涉及聚合存储数据加载缓冲区。

如果使用多个导入数据库数据 MaxL 语句加载数据值以聚合存储多维数据集,则 Essbase 可以利用临时数据加载缓冲区,在读取所有数据源后完成对存储的最终写入。使用聚合存储数据加载缓冲区可以显著提高整体数据加载性能。

在聚合存储数据加载缓冲区中, Essbase 会在读取所有数据源后对值进行排序和提交。如果在任何特定数据单元格中遇到多个(或重复)记录,则会累计这些值。然后, Essbase 将存储累积值,从多维数据集中的现有数据值中替换、添加或减去这些值。

注意:

使用聚合存储数据加载缓冲区时,在将数据缓冲区内容加载到多维数据集时,会为整个数据源集指定替换、添加或减去值的选项。

虽然内存中存在数据加载缓冲区,但无法构建聚合或合并分片,因为这些操作是资源密集型的。但是,您可以将数据加载到其他数据加载缓冲区,并在多维数据集上执行查询和其他操作。在提交完整数据集并创建聚合之前,可能会短暂等待查询。

数据加载缓冲区存在于内存中,直到将缓冲区内容提交到多维数据集或重新启动应用程序,此时缓冲区将被销毁。即使提交操作失败,缓冲区也会被销毁,并且数据不会加载到多维数据集。可以使用 alter database MaxL 语句手动销毁数据加载缓冲区。

注意:

在提交缓冲区内容之前停止应用程序会销毁缓冲区。在这种情况下,重新启动应用程序后,必须初始化新的缓冲区并将数据加载到该缓冲区中。

要将数据加载缓冲区用于聚合存储多维数据集,请执行以下操作:

  1. 准备数据加载缓冲区,使用 alter database MaxL 语句对数据值进行排序和累积,以初始化聚合存储数据加载缓冲区。例如:
    alter database ASOsamp.Basic 
       initialize load_buffer with buffer_id 1;
  2. 使用导入数据库 MaxL 语句将数据从数据源加载到数据加载缓冲区中。使用多个语句从多个数据源加载数据。您可以包括数据源的任意组合。如果数据源需要规则文件,请指定规则文件。

    以下示例将两个数据源(其中一个使用规则文件)加载到同一数据加载缓冲区中:

    import database ASOsamp.Basic data 
       from server data_file 'file_1.txt' 
       to load_buffer with buffer_id 1
       on error abort; 
    import database ASOsamp.Basic data
       from server data_file 'file_2' 
       using server rules_file ‘rule’ 
       to load_buffer with buffer_id 1
       on error abort;
    

    要同时将数据加载到多个加载缓冲区中,请参见 Multiple Data Loads in Parallel

  3. 使用导入数据 MaxL 语句将数据加载缓冲区内容提交到多维数据集。例如:
    import database ASOsamp.Basic data 
       from load_buffer with buffer_id 1;

    要使用一个 MaxL 语句将多个数据加载缓冲区的内容提交到多维数据集,请参见 Multiple Data Loads in Parallel

以下增量数据加载示例提供了当新数据值与现有值不相交时的最佳性能:

  1. 使用 ignore_missing_values 和 ignore_zero_values 属性创建单个数据加载缓冲区。例如:

    alter database ASOsamp.Basic 
       initialize load_buffer with buffer_id 1
       property ignore_missing_values, ignore_zero_values;

    如果多维数据集在更新时必须可用于发送数据请求,则使用 resource_usage 语法为 80% 初始化数据加载缓冲区。例如:

    alter database ASOsamp.Basic 
       initialize load_buffer with buffer_id 1
       resource_usage 0.8 property
       ignore_missing_values, ignore_zero_values;
  2. 将数据加载到缓冲区中。例如:

    import database ASOsamp.Basic data 
       from server data_file 'file_1.txt' 
       to load_buffer with buffer_id 1
       on error abort; 
    import database ASOsamp.Basic data
       from server data_file 'file_2'
       to load_buffer with buffer_id 1
       on error abort;
    
  3. 通过创建分片并添加值,将数据加载缓冲区的内容提交到多维数据集。例如:

    import database ASOsamp.Basic data 
       from load_buffer with buffer_id 1
       add values create slice;

数据加载缓冲区资源和磁盘空间使用情况

使用增量数据加载将数据值加载到 Essbase 聚合存储 (ASO) 多维数据集时,可以对允许的资源使用情况和临时数据加载缓冲区的等待时间设置约束条件。可以通过管理表空间来减少磁盘空间使用量。

控制数据加载缓冲区资源使用情况

执行增量数据加载时, Essbase 使用聚合存储高速缓存对数据进行排序。您可以通过指定百分比来控制数据加载缓冲区可以使用的高速缓存量。百分比是介于 .01 和 1.0(包含这两个值)之间的数字;小数点后只有两位数字是重要的,例如,0.029 被解释为 0.02。默认情况下,数据加载缓冲区的资源使用量设置为 1.0,在数据库上创建的所有数据加载缓冲区的资源使用量合计不能超过 1.0。例如,如果存在大小为 0.9 的缓冲区,则无法创建大小大于 0.1 的另一个缓冲区。

注意:

Send operations 内部创建大小为 0.2 的负载缓冲区;因此,默认大小为 1.0 的负载缓冲区将由于数据加载缓冲区资源不足而导致发送操作失败。

要设置允许缓冲区使用的资源量,请指定在 Essbase Web 界面中启动数据加载时的百分比。如果使用 MaxL ,请使用带有 resource_usage 语法的 alter database MaxL 语句。

例如,要将 resource_usage 设置为总高速缓存的 50%,请使用以下语句:

alter database ASOsamp.Basic
   initialize load_buffer with buffer_id 1
   resource_usage .5;

如果计划运行并发发送操作,请使用 ASOLOADBUFFERWAIT 配置设置和带有 wait_for_resources 语法的 alter database MaxL 语句。ASOLOADBUFFERWAIT 适用于使用 wait_for_resources 选项创建聚合存储数据加载缓冲区,并应用于分配、自定义计算、数据更新操作。

管理用于增量数据加载的磁盘空间

聚合存储多维数据集上的增量数据加载可能会使用磁盘空间,最多是当前数据文件大小的两倍。例如,假定多维数据集的数据大小为 1 GB,增量数据加载的大小为 200 MB,总大小为 1.2 GB。在增量数据加载过程中, Essbase 最多可以使用 2.4 GB 的磁盘空间。

如果数据库大于 2 GB,则可以通过将默认表空间的最大文件大小设置为不超过 2 GB 来降低磁盘空间利用率。

要设置默认表空间的最大文件大小,可以使用 alter tablespace MaxL 语句。

数据加载缓冲区属性

以增量方式将数据值加载到聚合存储 (ASO) 负载缓冲区时,您可以指示 Essbase 忽略源数据中的缺失值和零值,并且可以解决单元格冲突(通过组合重复的单元格来消除无效的聚合)。

您可以设置的数据加载缓冲区属性包括:

  • ignore_missing_values:忽略传入数据流中的 #MI 值

  • ignore_zero_values:忽略传入数据流中的 0

  • aggregate_use_last:通过使用上次加载至加载缓冲区中的单元格值来合并重复单元格

    注意:

    将文本和日期值装入聚合存储数据库时,请使用 aggregate_use_last 属性帮助消除无效的聚合。有关其他准则,请参阅加载、清除和导出文本和日期度量

如果在命令中使用多个属性并且存在任何冲突,则列出的最后一个属性优先。

处理数据流中缺少的零

以增量方式加载数据时,可以指定将数据加载到数据加载缓冲区时如何处理源数据中的缺失值和零值。

要设置数据加载缓冲区属性,请使用带有 property 语法的 alter database MaxL 语句。

例如:

alter database ASOsamp.Basic
   initialize load_buffer with buffer_id 1
   property ignore_missing_values, ignore_zero_values;

解决单元冲突

要解决重复单元格的单元冲突,可以指定是否使用加载到加载缓冲区中的最后一个单元。

默认情况下,当具有相同关键字的单元格加载到同一数据加载缓冲区中时, Essbase 通过将值加在一起来解决单元格冲突。

要通过接受上次装入到装入缓冲区中的单元的值来创建组合重复单元的数据装入缓冲区,请使用带有 aggregate_use_last 语法的 alter database MaxL 语句。

例如:

alter database ASOsamp.Basic
   initialize load_buffer with buffer_id 1
   property aggregate_use_last;

注意:

将数据加载缓冲区与 aggregate_use_last 语法一起使用时,即使没有任何重复的关键字,数据加载速度也会明显减慢。

并行加载多个数据

Essbase 聚合存储 (ASO) 多维数据集上可以存在多个数据加载缓冲区。尽管一个多维数据集上的在任何时候都只能有一个提交的操作处于活动状态,但是您可以在同一个提交中提交多个数据加载缓冲区和这比单独提交缓冲区的更快。

要同时将数据加载到多个数据加载缓冲区中,请使用单独的 MaxL Shell 会话。例如,在一个 MaxL Shell 会话中,将数据加载到 ID 为 1 的缓冲区中:

alter database ASOsamp.Basic
   initialize load_buffer with buffer_id 1 resource_usage 0.5;
import database ASOsamp.Basic data
   from data_file "dataload1.txt"
   to load_buffer with buffer_id 1
   on error abort;

同时,在另一个 MaxL Shell 会话中,将数据加载到 ID 为 2 的缓冲区中:

alter database ASOsamp.Basic
   initialize load_buffer with buffer_id 2 resource_usage 0.5;
import database ASOsamp.Basic data
   from data_file "dataload2.txt"
   to load_buffer with buffer_id 2
   on error abort;

将数据完全加载到数据加载缓冲区中时,使用一个 MaxL 语句,通过使用以逗号分隔的缓冲区 ID 列表将两个缓冲区的内容提交到数据库中:

例如,此语句加载缓冲区 1 和 2 的内容:

import database ASOsamp.Basic data 
   from load_buffer with buffer_id 1, 2;

注意:

将 SQL 数据加载到聚合存储多维数据集时,最多可以使用八个规则文件并行加载数据。此功能与上述过程不同。在并行执行多个 SQL 数据加载时,可以使用一个 import database MaxL 语句和 using multiple rules_file 语法。Essbase 初始化多个临时聚合存储数据加载缓冲区(每个规则文件一个),并在一次操作中将所有缓冲区的内容提交到多维数据集。

列出聚合存储多维数据集的数据加载缓冲区

Essbase 聚合存储 (ASO) 多维数据集上可以存在多个数据加载缓冲区。有关多维数据集上存在的数据加载缓冲区的列表和说明,请使用带有 list load_buffers 语法的 query database MaxL 语句。

列出 ASO 数据加载缓冲区的 MaxL 语句的语法为:

query database appname.dbname list load_buffers;

此语句返回有关每个现有数据加载缓冲区的以下信息:

表 37-2 数据加载缓冲区信息

说明

buffer_id

数据加载缓冲区的 ID(介于 1 和 4,294,967,296 之间的数字)。

内部

一个布尔值,用于指定数据加载缓冲区是由 Essbase (TRUE) 还是由用户 (FALSE) 在内部创建的。

活动

一个布尔值,用于指定数据加载缓冲区当前是否正在由数据加载操作使用。

resource_usage

允许数据加载缓冲区使用的聚合存储高速缓存的百分比(介于 .01 和 1.0(含)之间)。

汇总方法

用于组合缓冲区内相同单元的多个值的方法之一:

  • AGGREGATE_SUM:当缓冲区包含同一个单元格的多个值时添加的值。

  • AGGREGATE_USE_LAST:通过使用上次加载至加载缓冲区中的单元格值,组合重复的单元格。

ignore_missings

一个布尔值,用于指定是否忽略传入数据流中的 #MI 值。

忽略零

一个布尔值,指定是否忽略传入数据流中的零。

请参阅:查询数据库(聚集存储)

创建数据切片

可以增量将数据加载缓冲区提交到 Essbase 聚合存储 (ASO) 多维数据集以创建分片。将新切片加载到多维数据集之后, Essbase 可能会在新数据对查询可见之前在该切片上创建所有必要的视图(如聚合视图)。

创建数据分片非常有用,因为它可以提高增量数据加载的性能。增量数据加载所用的时间量与新数据量成正比;多维数据集的大小不是一个因素。

要创建数据分片,请使用带有 create slice 语法的 import database MaxL 语句。

例如,要通过覆盖值(默认值)创建分片,请使用以下语句:

import database ASOsamp.Basic data
   from load_buffer with buffer_id 1
   override values create slice;

注意:

如果在创建时段时使用覆盖值,则 #MISSING 值将替换为零。使用此选项比使用加值或减值选项要慢得多。

请参阅:导入数据(聚集存储)

合并增量数据切片

以增量方式将数据加载到聚合存储 (ASO) 多维数据集时,您可以手动将增量数据分片合并到主多维数据集分片,也可以使用 AUTOMERGE 配置 Essbase 以在数据加载期间自动合并分片。

在将数据加载到聚合存储多维数据集期间自动合并增量数据切片

使用 AUTOMERGEAUTOMERGEMAXSLICENUMBER 配置设置,可以指定 Essbase 是否在将数据加载到聚合存储多维数据集期间自动合并增量数据切片。

自动配置设置选项:

  • ALWAYS - 指定在将数据加载到聚合存储多维数据集期间自动合并增量数据切片。默认情况下,每四个连续的增量数据分片执行一次合并。但是,如果使用 AUTOMERGEMAXSLICENUMBER 配置设置,则在超过 AUTOMERGEMAXSLICENUMBER 值时会激活自动合并进程。增量数据分片的大小不是选择合并哪些数据分片的因素。

    默认值为 ALWAYS。

  • NEVER - 指定在将数据加载到聚合存储多维数据集期间从不自动合并增量数据切片。要手动合并增量数据分片,请使用带有 merge 语法的 alter database MaxL 语句。

  • SELECTIVE - 指定在超过 AUTOMERGEMAXSLICENUMBER 配置设置中指定的增量数据切片数时激活增量数据切片自动合并过程。如果数据加载中的增量数据切片数未超过 AUTOMERGEMAXSLICENUMBER 的值,则不会激活自动合并进程。

手动合并递增数据切片

您可以把所有增量数据切块合并到主切片,或者把所有增量数据切块合并为单个数据切块,同时保持主切片不变。要合并分片,您必须具有与加载数据相同的权限(数据库更新权限或更高权限)。

将新输入视图写入多维数据集后, Essbase 会为该分片创建聚合视图。为新分片创建的视图是主分片上存在的视图的子集。

注意:

执行合并时无法导出数据。

如果使用逻辑清除区域操作从区域清除数据,从而导致清除的单元格的值为零,则可以选择在合并操作期间删除零值单元格。

要执行合并操作,请使用带有 merge 语法的 alter database MaxL 语句。

例如,要将所有增量数据切片合并到主切片中,请使用以下语句:

alter database ASOsamp.Basic
   merge all data;

要将所有增量数据切片合并到主切片并删除零值单元格,请使用以下语句:

alter database ASOsamp.Basic
   merge all data remove_zero_cells;

要将所有增量数据切片合并到单个数据切片中,请使用以下语句:

alter database ASOsamp.Basic
   merge incremental data;

注意:

在复制聚合存储应用程序之前,必须将所有增量数据分片合并到主分片中。不会复制未合并的增量数据切片中的数据。

相关链接

AUTOMERGE

AUTOMERGEMAXSLICENUMBER

变更数据库(聚集存储)

使用增量数据切片内容替换数据

对于足够小的聚合存储 (ASO) 数据集,这些数据集足以在保持低数据延迟的情况下完全重新加载, Essbase 可以删除聚合存储多维数据集的当前内容,并将多维数据集替换为指定数据加载缓冲区的内容。

原子替换功能在不中断服务的情况下将查询立方的旧内容转换为新内容。新加载的数据集会进行聚合,以创建替换的数据集的相同视图集。

Essbase 还允许以原子方式替换多维数据集中所有增量数据切片的内容。考虑这样一种情况,即可以将数据分隔成一个相对较大的静态数据集,该数据集永远不会更新,并且是一个相对较小的易失性数据集,对于这些数据集,各个更新难以识别,但仅限于易失性数据集。例如,大型静态数据集由过去三年的历史事务处理数据组成;但是,对于过去两个月的事务处理数据,用户可以更改源数据库中事务处理的特性。跟踪这些更改可能会非常复杂。可以将静态数据集加载为多维数据集中的主分片,将易失性数据集加载为一个或多个增量分片。

在 ASO 增量数据加载期间提交分片时, Essbase 会删除所有增量数据分片的当前内容,并创建一个新分片(使用 import database MaxL 语句的缓冲区提交规范中的添加值语法)以及指定数据加载缓冲区的内容。新加载的数据集将根据主分片上存在的视图集使用聚合视图进行扩充。

注意:

要使用 override 语法,请使用 ignore_missing_values 属性创建数据加载缓冲区以实现最佳性能。此外,您必须确保静态数据集和易失性数据集之间没有任何冲突(例如,同一单元的每个数据集都不应有一个值)。

要替换多维数据集中的数据库内容或增量数据分片,请使用导入数据库 MaxL 语句和覆盖语法。

例如,要替换多维数据集的内容,请使用以下语句:

import database ASOsamp.Basic data
   from load_buffer with buffer_id 1
   override all data;

要将所有增量数据分片的内容替换为新分片,请使用以下语句:

import database ASOsamp.Basic data
   from load_buffer with buffer_id 1
   override incremental data;

注意:

如果覆盖替换失败,则 Essbase 将继续为旧数据集提供服务。

Smart View 中,提交命令等效于将增量数据加载功能与覆盖语法一起使用。

执行发送操作时,对锁、解锁以及检索和锁的新请求将等待发送操作完成。

请参阅:导入数据(聚集存储)

查看增量数据切片统计信息

Essbase 提供了有关增量聚合存储 (ASO) 数据分片的大小和数量的统计信息,以及查询增量数据分片的成本。

查询访问所有增量数据切片所用的时间以百分比表示(介于 .01 和 1.0 之间(含 1.0)。如果多维数据集具有主分片和多个增量数据分片,则查询统计信息 0.66 表示查询时间中有三分之二用于查询增量数据分片,三分之一用于查询主数据分片。如果查询增量数据分片的成本过高,则可以合并分片。

要查看有关分片的信息,请使用 query database MaxL 语句中的 list aggregate_storage slice_info 语法。例如:

query database ASOsamp.Basic list aggregate_storage slice_info;

查询数据库(聚集存储)

在聚合存储数据加载中重新引导成员

重新设计成员允许继续执行 Essbase 聚合存储 (ASO) 数据加载,即使指定的成员组合缺少成员或成员无效也是如此。

当数据加载遇到缺失或无效的成员时,数据加载将继续,缺失或无效成员的数据值存储在标记为维中叛徒成员的成员下。如果未在维中设置叛变成员,则记录将被拒绝。如果叛徒成员已存在数据,则行为取决于您是在创建数据加载规则文件时选择添加值还是覆盖值。

每个维只能分配一个成员作为叛徒成员,而叛徒成员必须是 0 级成员。

以下数据加载文件包括一个名为 SC 的成员:

Product  Measures   *Data*
NY,      Sales       100
SA,      Sales       200
SC,      Sales       300    

在以下大纲中,未将任何成员命名为 SC;但是,将名为 SA 的成员设置为“产品”维中的叛变成员:

Products (+)
   NY (+)
   SA (+)
Measures (+)
   Sales (+)
   COGS (+)

在数据加载期间,将成员组合 SC 和 Sales(即 300)的数据值加载到重新协商的成员服务协议和销售中。

在以下数据加载文件中,SC 和销售存在两条记录,每条记录具有不同的值:

Product    Measures    *Data*
NY,        Sales        100
SA,        Sales        200
SC,        Sales        250
SC,        Sales        300 

SC 和销售(250 和 300)的值均加载到服务协议和销售中。如果选择添加值,则单元格中的值为 550 (250 + 300)。如果选择覆盖值,则单元格中的值是最后加载的值;在本例中为 300。

以下示例说明了使用以下数据加载文件的叛徒成员的行为:

Months    Transaction Type    Customer    Product    Price
Jan,      Sale,               Discard1,   Product1   300
Jan,      Sale,               Discard1,   Discard2   300
Jan,      Sale,               Customer1,  Discard2   300

大纲中不存在 Discard1 和 Discard2。

  • 示例 1:

    如果 Customer 维具有标记为 renegade 的 Customer1 成员,而其他维没有 renegade 成员,则仅将第一个记录加载到以下交叉点:

    Jan    Sale    Customer1(Ren)    Product1    300

    其他两条记录被拒绝,因为“产品”维没有重新协商成员。拒绝的记录将记录在重新协商的成员日志文件中。

  • 示例 2:

    如果 Product 维具有标记为 renegade 的 Product1 成员,而其他维没有 renegade 成员,则仅将最后一个记录加载到以下交叉点:

    Jan    Sale    Customer1    Product1(Ren)    300

    其他两条记录将被拒绝,因为“客户”维没有重新协商成员。拒绝的记录将记录在重新协商的成员日志文件中。

  • 示例 3:

    如果“客户”和“产品”维都具有叛变成员(Customer1 和 Product1),则所有记录都将加载到以下交叉点:

    Jan    Sale    Customer1(Ren)    Product1(Ren)    900 (or 300 if overwrite is enabled)

示例 4:

在示例 4 中,Customer 维的 RenMember1 标记为 renegade,而 Product 维的 RenMember2 标记为 renegade。使用以下数据加载文件,将加载所有记录,因为“客户”和“产品”维都具有叛变成员。

Customer1Product1 不是反叛成员。"Discard1""Discard2" 不在大纲中。

数据装入文件:

Months  Transaction Type  Customer    Product   *Data*
Jan,     Sale,            Discard1,   Product1   300
Jan,     Sale,            Discard1,   Discard2   300
Jan,     Sale,            Customer1,  Discard2   300

在数据加载文件中为放弃成员指定的值将自动加载到指定的叛徒成员中:

已加载数据:

Months  Measures   Customer          Product           Price
Jan     Sale       RenMember1(ren)   ProductR          300
Jan     Sale       RenMember1(ren)   RenMember2(ren)   300
Jan     Sale       CustomerR         RenMember2(ren)   300

默认情况下,未启用重新协商成员的日志记录。要启用日志记录,请使用 RENEGADELOG 配置设置,该设置设置为 TRUE 时,将允许记录加载到重新协商成员交叉点中的成员。

注意:

可以在计算和报表脚本中引用重新构建成员。表格数据加载或电子表格更新操作不支持重新构建成员。

聚合存储数据加载的源数据差异

在处理源数据中的记录以准备将值加载到聚合存储 (ASO) 多维数据集时, Essbase 仅处理成员没有公式的 0 级维交叉点的记录。

以下示例显示了仅具有 0 级交叉点记录的数据源。最后一个字段包含数据值,其他字段是各自维的 0 级成员。

Jan, Curr Year, Digital Cameras, CO, Original Price, 10784
Jan, Prev Year, Camcorders, CO, Original Price, 13573

Essbase 会忽略指定较高级别成员的记录,并在数据加载结束时显示跳过的记录数。

例如,将跳过以下记录,因为成员 Mid West 是级别 1 成员:

Jan, Curr Year, Digital Cameras, Mid West, Original Price, 121301

对数据进行排序是不必要的,因为 Essbase 在将值提交到多维数据集之前会在内部读取和排序记录。