Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 12.0.0 (中文) » SQL Anywhere 服务器 - SQL 的用法 » 查询优化与执行 » 使用实例化视图提高性能 » 实例化视图和视图匹配算法

 

实例化视图评估

进行实例化视图评估时,会确定哪些现有实例化视图可用于计算全部或部分查询。

一旦某个实例化视图已经与部分查询匹配,则会决定是否在最终查询执行计划中使用该视图,该决定是基于开销做出的。枚举阶段的作用是生成其中包含由视图匹配算法建议的视图,并基于估计的计划开销选择一个可能包含也可能不包含某些实例化视图的最佳访问计划。

如果实例化视图被定义为分组选择项目连接查询(也称为分组查询或包含 GROUP BY 子句的查询),则视图匹配算法可以将其与分组的查询块匹配。如果实例化视图被定义为选择项目连接查询(即不是分组查询),则视图匹配算法可将其与任何类型的查询块匹配。

下文列出了一些条件,视图匹配算法在决定视图 V 是否与属于查询 Q 的查询块 QB 的一部分匹配时,需要利用这些条件。通常,视图 V 必须包含查询 QB 的表的子集。只有 V 的扩展表例外。V 的扩展表是指仅用一行与 V 的其余表连接的表。例如,如果主键表的唯一谓语是一个非空外键列与其主键列的等值连接,则该主键表即为一个扩展表。有关包含扩展表的实例化视图的示例,请参见示例 2:匹配分组选择项目连接视图

  • 用于创建实例化视图 V 的选项值与执行查询的连接的选项值匹配。有关必须匹配的选项的列表,请参见实例化视图的限制

  • 实例化视图 V 的上次刷新未超过 materialized_view_optimization 数据库选项或 SELECT 语句中 MATERIALIZED VIEW OPTIMIZATION 子句(如果指定)指定的失效阈值。请参见设置优化程序的实例化视图失效程度阈值

  • V 中使用的所有表(V 的一些扩展表可能例外)均存在于 QB 中。QB 中的这组常用表在下文中将以 CT 表示。

  • 在查询 Q 中,CT 中没有可更新的表。

  • CT 中的所有表均属于 QB 中外连接的同一方(即,它们均属于外连接的保留一方或 QB 的外连接的空值提供方)。

  • 可以确定 V 中的谓语包含 QB 中只引用 CT 的谓语的子集。换言之,V 中的谓语比 QB 中的谓语限制要少。QB 中与 V 中的谓语完全匹配的谓语称为被匹配的谓语

  • 任何没有在被匹配的谓语中使用的、引用 CT 中的表的 QB 表达式,必须出现在 V 的选择列表中。

  • 如果 V 和 QB 均已进行分组,则除 CT 中的表之外 QB 不包含其它表。此外,V 的 GROUP BY 子句中的表达式集必须等于 QB 的 GROUP BY 子句中的表达式集或是其超集。

  • 如果 V 和 QB 是在同一表达式集合上进行分组,则 QB 中的所有集合函数还必须在 V 中进行计算,或可以通过 V 的集合函数进行计算。例如,如果 QB 包含 AVG(x),则 V 必须包含 AVG(x),或其必须同时包含 SUM(x) 和 COUNT(x)。

  • 如果 QB 的 GROUP BY 子句是 V 的 GROUP BY 子句的子集,则 V 的集合函数中必须包括 QB 的简单集合函数,而其组合集合函数必须通过 V 的简单集合函数进行计算。简单集合函数包括:

    • BIT_AND
    • BIT_OR
    • BIT_XOR
    • COUNT
    • LIST
    • MAX
    • MIN
    • SET_BITS
    • SUM
    • XMLAGG

    可通过简单集合函数计算的组合集合函数有:

    • SUM(x)
    • COUNT(x)
    • SUM(CAST(x AS DOUBLE))
    • SUM(CAST(x AS DOUBLE) * CAST(x AS DOUBLE))
    • VAR_SAMP(x)
    • VAR_POP(x)
    • VARIANCE(x)
    • STDDEV_SAMP(x)
    • STDDEV_POP(x)
    • STDDEV(x)

    下列统计集合函数:

    • COVAR_SAMP(y,x)
    • COVAR_POP(y,x)
    • CORR(y,x)
    • REGR_AVGX(y,x)
    • REGR_AVGY(y,x)
    • REGR_SLOPE(y,x)
    • REGR_INTERCEPT(y,x)
    • REGR_R2(y,x)
    • REGR_COUNT(y,x)
    • REGR_SXX(y,x)
    • REGR_SYY(y,x)
    • REGR_SXY(y,x)

    可通过以下简单集合函数计算:

    • SUM(y1)
    • SUM(x1)
    • COUNT(x1)
    • COUNT(y1)
    • SUM(x1*y1)
    • SUM(y1*x1)
    • SUM(x1*x1)
    • SUM(y1*y1)

    其中 x1 = CAST(IFNULL(x, x,y) AS DOUBLE)),y1 = CAST(IFNULL(y,y,x) AS DOUBLE)。