你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Azure Cosmos DB for Apache Cassandra(预览版)中的具体化视图

适用于: Cassandra

重要

Azure Cosmos DB for Cassandra 中的具体化视图目前为预览版。 可以使用 Azure 门户启用此功能。 此具体化视图的预览版在没有服务级别协议的情况下提供。 目前,不建议将具体化视图用于生产工作负载。 此预览版的某些功能可能不受支持或受到限制。 有关详细信息,请参阅 Microsoft Azure 预览版补充使用条款

定义后的具体化视图有助于提供一种使用非主键筛选器高效查询基表(或 Azure Cosmos DB 中的容器)的方法。 当用户写入基表时,具体化视图会自动在后台生成。 此视图可具有不同的高效查找主键。 该视图也将仅包含从基表显式投影的列。 该视图将是一个只读表。

可以使用辅助索引查询列存储,而无需指定分区键。 但是,对于基数高或基数低的列,查询无效。 查询可能扫描所有数据以获得一个小型结果集。 此类查询最终成本高昂,因为它们最终作为跨分区查询执行。

借助具体化视图,可以:

  • 用作查找表或映射表,以保存跨分区扫描,否则将是成本高昂的查询。
  • 提供基于 SQL 的条件谓词以仅填充满足前提条件的某些列和数据。
  • 创建实时视图,简化基于事件的方案,这些方案通常使用更改源触发器存储为单独的集合。

具体化视图的优势

具体化视图有很多优势,包括但不限于:

  • 可以使用具体化视图实现服务器端非规范化。 使用服务器端非规范化,可以避免客户端应用程序中的多个独立表和计算复杂的非规范化。
  • 具体化视图自动更新视图,以与基表保持一致。 此自动更新将客户端应用程序的职责抽象化,通常实现自定义逻辑以对基表和视图执行双重写入。
  • 具体化视图通过从单个视图读取来优化读取性能。
  • 可独立指定具体化视图的吞吐量。
  • 可以配置具体化视图生成器层,以映射到水化视图的需求。
  • 具体化视图提高了写入性能,因为写入操作只需要写入基表。
  • 此外,具体化视图的 Azure Cosmos DB 实现基于拉取模型。 此实现不会影响写入性能。

具体化视图入门

使用 Azure CLI 创建新的 API for Cassandra 帐户,以使用本机命令或 REST API 操作启用具体化视图功能。

  1. 登录 Azure 门户

  2. 导航到 API for Cassandra 帐户。

  3. 在资源菜单中,选择“设置”。

  4. 在“设置”部分,选择“Cassandra API 的具体化视图(预览版)”。

  5. 在新对话框中,选择“启用”为此帐户启用此功能。

    Azure 门户中启用具体化视图功能的屏幕截图。

揭秘

API for Cassandra 使用具体化视图生成器计算层来维护视图。

可以根据水化视图的延迟和滞后要求灵活地配置视图生成器的计算实例。 从技术的角度来看,此计算层有助于以更高效的方式管理分区之间的连接,即使在数据大小较大且分区数较多的情况下也是如此。

计算容器在 Azure Cosmos DB 帐户内的所有具体化视图之间共享。 每个预配的计算容器都会生成多个任务,这些任务从基表分区读取更改源并将数据写入目标具体化视图。 计算容器根据帐户中每个具体化视图的具体化视图定义转换数据。

创建具体化视图生成器

创建具体化视图生成器以自动转换数据并写入具体化视图。

  1. 登录 Azure 门户

  2. 导航到 API for Cassandra 帐户。

  3. 在资源菜单中,选择“具体化视图生成器”。

  4. 在“具体化视图生成器”页面上,为生成器配置 SKU 和实例数。

    注意

    此资源菜单选项和页面仅在为帐户启用具体化视图功能时才会出现。

  5. 选择“保存”。

创建具体化视图

一旦帐户和具体化视图生成器设置完毕,应能够使用 CQLSH 创建具体化视图。

注意

如果尚未安装独立的 CQLSH 工具,请参阅安装 CQLSH 工具。 还应在该工具中更新连接字符串

以下是创建具体化视图的一些示例命令:

  1. 首先,创建一个“密钥空间”名称 uprofile

    CREATE KEYSPACE IF NOT EXISTS uprofile WITH REPLICATION = { 'class' : 'NetworkTopologyStrategy', 'datacenter1' : 1 };
    
  2. 接下来,在密钥空间内创建一个名为 user 的表。

    CREATE TABLE IF NOT EXISTS uprofile.USER (user_id INT PRIMARY KEY, user_name text, user_bcity text);
    
  3. 现在,在同一密钥空间内创建一个名为 user_by_bcity 的具体化视图。 使用查询指定如何将数据从基表投影到视图中。

    CREATE MATERIALIZED VIEW uprofile.user_by_bcity AS 
    SELECT
        user_id,
        user_name,
        user_bcity 
    FROM
        uprofile.USER 
    WHERE
        user_id IS NOT NULL 
        AND user_bcity IS NOT NULL PRIMARY KEY (user_bcity, user_id);
    
  4. 将行插入基表。

    INSERT INTO
        uprofile.USER (user_id, user_name, user_bcity) 
    VALUES
        (
            101, 'johnjoe', 'New York' 
        );
    
    INSERT INTO
        uprofile.USER (user_id, user_name, user_bcity) 
    VALUES
        (
            102, 'james', 'New York' 
        );
    
  5. 查询具体化视图。

    SELECT * FROM user_by_bcity; 
    
  6. 观察具体化视图的输出。

     user_bcity | user_id | user_name 
    ------------+---------+----------- 
       New York |     101 |   johnjoe 
       New York |     102 |     james 
    
    (2 rows) 
    

(可选)也可以使用资源提供程序来创建或更新具体化视图。

当前限制

API for Cassandra 的具体化视图预览实现存在一些限制:

  • 具体化视图无法在帐户上启用具体化视图支持之前存在的表上进行创建。 要使用具体化视图,请在启用该功能后创建一个新表。
  • 对于具体化视图定义的 WHERE 子句,目前仅允许使用 IS NOT NULL 筛选器。
  • 针对基表创建具体化视图后,不允许对基表的架构执行 ALTER TABLE ADD 操作。 仅当没有具体化视图在其定义中选择 * 时才允许使用 ALTER TABLE APP
  • 分区键大小 (2 Kb) 和群集键大小的总长度 (1 Kb) 存在限制。 如果超出此大小限制,则负责的消息最终将出现在有害消息队列中。
  • 如果基表具有用户定义的类型 (UDT) 并且具体化视图定义具有 SELECT * FROM 或在其中一个投影列中具有 UDT,则该帐户不允许更新 UDT。
  • 自动区域故障转移后,具体化视图可能会与几行的基表不一致。 为避免这种不一致,请在故障转移后重新生成具体化视图。
  • 不支持创建具有 32 个核心的具体化视图生成器实例。 如果需要,可以创建多个具有较少内核的生成器实例。

除了上述限制外,请考虑以下额外限制:

  • 可用性区域
    • 具体化视图无法在具有已启用可用性区域的区域的帐户上启用。
    • 在帐户上将 enableMaterializedViews 设置为 true 后,不支持添加具有可用性区域的新区域。
  • 定期备份和还原
    • 具体化视图不会通过还原过程自动还原。 还原过程完成后,需要重新创建具体化视图。 然后,应在其还原的帐户上配置 enableMaterializedViews,然后再次创建具体化视图和生成器。
  • Apache Cassandra
    • 不允许在具体化视图上定义冲突解决策略。
    • 具体化视图不允许写入操作。
    • 具体化视图不支持跨文档查询和使用聚合函数。
    • 具体化视图的架构在创建后无法修改。
    • 如果至少定义了一个具体化视图,则不允许删除基表。 必须先删除所有视图,然后才能删除基表。
    • 不允许在具有静态列的容器上定义具体化视图。

后续步骤