适用范围: NoSQL
重要
Azure Cosmos DB for NoSQL 的具体化视图功能目前以预览版提供。 可以使用 Azure 门户启用此功能。 此预览版在提供时未使用服务级别协议。 目前,不建议对生产工作负载使用具体化视图。 此预览版的某些功能可能不受支持或者受限。 有关详细信息,请参阅适用于 Azure 预览版的补充使用条款。
应用程序经常需要进行不指定分区键的查询。 在这种情况下,查询可以扫描所有数据以获取较小的结果集。 这些查询的开销非常高昂,因为它们会无意中作为跨分区查询运行。
定义后的具体化视图有助于提供一种使用不包含分区键的筛选器高效查询 Azure Cosmos DB 中的基础容器的方法。 当用户写入基础容器时,具体化视图会自动在后台生成。 此视图可以包含不同的分区键以实现高效的查找。 另外,视图仅包含从基础容器显式投影的字段。 此视图是一个只读表。
借助具体化视图,可以:
- 使用视图作为查找或映射容器来持久保存跨分区扫描,否则这些扫描会执行高开销的查询。
- 提供基于 SQL 的谓词(无条件)以便仅填充特定的字段。
- 使用更改源触发器创建实时视图,以简化通常存储为单独容器的基于事件的场景。
使用具体化视图的优势包括但不限于:
- 可以使用具体化视图实现服务器端非规范化。 使用服务器端非规范化,可以避免客户端应用程序中的多个独立表和计算复杂的非规范化。
- 具体化视图自动更新视图,使之与基础容器保持一致。 此自动更新将客户端应用程序的职责抽象化,否则通常需要实现自定义逻辑来对基础容器和视图执行双重写入。
- 具体化视图通过从单个视图读取来优化读取性能。
- 可独立指定具体化视图的吞吐量。
- 可以配置具体化视图生成器层,以映射到水化视图的需求。
- 具体化视图提高了写入性能(与多容器写入策略相比),因为写入操作只需要写入基础容器。
- 具体化视图的 Azure Cosmos DB 实现基于拉取模型。 此实现不会影响写入性能。
先决条件
启用具体化视图
使用 Azure CLI 通过本机命令或 REST API 操作在 Cosmos DB for NoSQL 帐户中启用具体化视图功能。
登录到 Azure 门户。
前往你的 API for NoSQL 帐户。
在资源菜单中,选择“设置”。
在“功能”部分中的“设置”下,将“NoSQL API 的具体化视图(预览版)”选项切换为“打开”。
在新对话框中,选择“启用”为帐户启用此功能。
创建具体化视图生成器
创建具体化视图生成器以自动转换数据并写入具体化视图。
登录到 Azure 门户。
前往你的 API for NoSQL 帐户。
在资源菜单中,选择“具体化视图生成器”。
在“具体化视图生成器”页面上,为生成器配置 SKU 和实例数。
注意
此资源菜单选项和页面仅在为帐户启用具体化视图功能时才会出现。
选择“保存”。
Azure Cosmos DB for NoSQL 使用具体化视图生成器计算层来维护视图。
可以根据水化视图的延迟和滞后要求灵活地配置视图生成器的计算实例。 从技术的角度来看,此计算层有助于以更高效的方式管理分区之间的连接,即使在数据大小较大且分区数较多的情况下也是如此。
计算容器在 Azure Cosmos DB 帐户内的所有具体化视图之间共享。 预配的每个计算容器会启动多个任务,这些任务从基础容器分区读取更改源并将数据写入目标具体化视图。 计算容器根据帐户中每个具体化视图的具体化视图定义转换数据。
创建具体化视图
设置帐户和具体化视图生成器后,将能够使用 REST API 创建具体化视图。
使用 Azure 门户、Azure SDK、Azure CLI 或 REST API 创建一个将
/accountId
用作分区键路径的源容器。 将此源容器命名为 mv-src。注意
/accountId
字段在本文中仅用作举例。 对于你自己的容器,请选择适用于你的解决方案的分区键。在源容器中插入几个项。 若要遵循本文中所示的示例,请确保项具有
accountId
、fullName
和emailAddress
字段。 示例项可能类似于以下示例:{ "accountId": "prikrylova-libuse", "emailAddress": "libpri@contoso.com", "name": { "first": "Libuse", "last": "Prikrylova" } }
注意
在此示例中,你将使用示例数据填充源容器。 还可以从空的源容器创建具体化视图。
现在,使用不同于源容器的分区键路径创建名为
mv-target
的具体化视图。 对于此示例,请将/emailAddress
指定为mv-target
容器的分区键路径。首先,为具体化视图创建定义清单,并将其保存在名为 definition.json 的 JSON 文件中:
{ "location": "China North", "tags": {}, "properties": { "resource": { "id": "mv-target", "partitionKey": { "paths": [ "/emailAddress" ], "kind": "Hash" }, "materializedViewDefinition": { "sourceCollectionId": "mv-src", "definition": "SELECT s.accountId, s.emailAddress FROM s" } }, "options": { "throughput": 400 } } }
注意
在模板中,请注意 partitionKey 路径设置为
/emailAddress
。 还可以使用其他参数指定源集合与定义,以填充具体化视图。现在,发出 REST API 调用以创建 mv_definition.json 文件中定义的具体化视图。 使用 Azure CLI 发出 REST API 调用。
为具体化视图的名称和源数据库名称创建变量:
materializedViewName="mv-target" # Variable for database name used in later section databaseName="<database-that-contains-source-collection>"
如果还没有的话,请获取帐户的标识符,并将其存储在名为
$accountId
的 shell 变量中。accountId="/subscriptions/$subscriptionId/resourceGroups/$resourceGroupName/providers/Microsoft.DocumentDB/databaseAccounts/$accountName"
发出 REST API 调用以创建具体化视图:
az rest \ --method PUT \ --uri "https://management.chinacloudapi.cn$accountId/sqlDatabases/";\ "$databaseName/containers/$materializedViewName?api-version=2022-11-15-preview" \ --body @definition.json \ --headers content-type=application/json
使用 REST API 检查具体化视图容器的创建状态:
az rest \ --method GET \ --uri "https://management.chinacloudapi.cn$accountId/sqlDatabases/";\ "$databaseName/containers/$materializedViewName?api-version=2022-11-15-preview" \ --headers content-type=application/json \ --query "{mvCreateStatus: properties.Status}"
创建具体化视图后,具体化视图容器会自动将更改与源容器同步。 尝试在源容器中执行创建、读取、更新和删除 (CRUD) 操作。 具体化视图容器中会显示相同的更改。
注意
具体化视图容器是用户的只读容器。 容器只能由具体化视图生成器自动修改。
当前限制
处于预览版状态的 Azure Cosmos DB for NoSQL API 具体化视图功能存在一些限制:
- 对于在帐户中启用具体化视图支持之前就存在的容器,无法为其创建具体化视图。 若要使用具体化视图,请在启用该功能之后创建新容器。
- 具体化视图定义中不支持
WHERE
子句。 - 只能在具体化视图定义中投影源容器项的 JSON
object
属性列表。 现在,该列表只能包含 JSON 树中一个级别的属性。 - 在具体化视图定义中,文档字段不支持别名。
- 建议在源容器仍然为空或只有少量几个项时创建具体化视图。
- 从备份还原容器不会还原具体化视图。 还原过程完成后,必须重新创建具体化视图。
- 删除源容器之前,必须删除对特定源容器定义的所有具体化视图。
- 关联了具体化视图的源容器不支持时间点还原、分层分区和端到端加密。
- 具体化视图目前不支持基于角色的访问控制。
- 具体化视图不支持跨租户客户管理的密钥 (CMK) 加密。
- 目前,如果启用了以下任何功能,则无法启用此功能:分区合并、分析存储或连续备份。
请注意以下其他限制:
- 可用性区域
- 具体化视图无法在具有已启用可用性区域的区域的帐户上启用。
- 在帐户中将
enableMaterializedViews
设置为true
后,不支持添加包含可用性区域的新 Azure 区域。
- 定期备份和还原
- 具体化视图不会通过还原过程自动还原。 还原过程完成后,必须重新创建具体化视图。 然后,应在其还原的帐户上配置
enableMaterializedViews
,然后再次创建具体化视图和生成器。
- 具体化视图不会通过还原过程自动还原。 还原过程完成后,必须重新创建具体化视图。 然后,应在其还原的帐户上配置