跨横向扩展的云数据库进行报告(预览版)

适用于:Azure SQL 数据库

重要

2027 年 3 月 31 日,使用EXTERNAL DATA SOURCE类型SHARD_MAP_MANAGER的分片映射管理器模式下的弹性查询即将结束支持。 在此日期之后,现有工作负荷将继续运行,但将不再获得支持,并且将不再能够创建新的类型 SHARD_MAP_MANAGER 外部数据源。 有关迁移选项,请参阅 弹性查询分片映射管理器模式的迁移指南。

分片数据库跨横向扩展的数据层分布行。 所有参与数据库的架构都是一致的,也称为横向分区。 使用弹性查询,可以创建跨分片数据库中的所有数据库的报表。

跨分片查询工作原理的示意图。

有关快速入门,请参阅跨横向扩展的云数据库进行报告(预览版)。

有关非分片数据库,请参阅跨具有不同架构的云数据库的查询(预览版)。

先决条件

概述

这些语句在弹性查询的数据库中创建分片数据层的元数据表示形式。

  1. 创建主密钥
  2. 创建数据库范围凭据
  3. 创建外部数据源
  4. CREATE EXTERNAL TABLE(创建外部表)

1.1 创建数据库范围的主密钥和凭据

弹性查询使用此凭据连接到远程数据库。 将每个 <password> 替换为高强度密码。

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
CREATE DATABASE SCOPED CREDENTIAL [<credential_name>]  WITH IDENTITY = '<username>',  
SECRET = '<password>';

注意

请确保“<username>”中不包括任何“@servername”后缀。

1.2 创建外部数据源

语法:

<External_Data_Source> ::=
    CREATE EXTERNAL DATA SOURCE <data_source_name> WITH
        (TYPE = SHARD_MAP_MANAGER,
                   LOCATION = '<fully_qualified_server_name>',
        DATABASE_NAME = '<shardmap_database_name>',
        CREDENTIAL = <credential_name>,
        SHARD_MAP_NAME = '<shardmapname>'
               ) [;]

示例

CREATE EXTERNAL DATA SOURCE MyExtSrc
WITH
(
    TYPE=SHARD_MAP_MANAGER,
    LOCATION='myserver.database.chinacloudapi.cn',
    DATABASE_NAME='ShardMapDatabase',
    CREDENTIAL= SMMUser,
    SHARD_MAP_NAME='ShardMap'
);

检索当前外部数据源的列表:

select * from sys.external_data_sources;

外部数据源引用您的分片映射。 然后,弹性查询使用外部数据源和基础分片映射枚举参与数据层的数据库。

在弹性查询的处理过程中,同样的凭据用于读取分片映射并访问分片上的数据。

1.3 创建外部表

语法:

CREATE EXTERNAL TABLE [ database_name . [ schema_name ] . | schema_name. ] table_name  
    ( { <column_definition> } [ ,...n ])
    { WITH ( <sharded_external_table_options> ) }
) [;]  

<sharded_external_table_options> ::=
  DATA_SOURCE = <External_Data_Source>,
  [ SCHEMA_NAME = N'nonescaped_schema_name',]
  [ OBJECT_NAME = N'nonescaped_object_name',]
  DISTRIBUTION = SHARDED(<sharding_column_name>) | REPLICATED |ROUND_ROBIN

示例

CREATE EXTERNAL TABLE [dbo].[order_line](
     [ol_o_id] int NOT NULL,
     [ol_d_id] tinyint NOT NULL,
     [ol_w_id] int NOT NULL,
     [ol_number] tinyint NOT NULL,
     [ol_i_id] int NOT NULL,
     [ol_delivery_d] datetime NOT NULL,
     [ol_amount] smallmoney NOT NULL,
     [ol_supply_w_id] int NOT NULL,
     [ol_quantity] smallint NOT NULL,
      [ol_dist_info] char(24) NOT NULL
)

WITH
(
    DATA_SOURCE = MyExtSrc,
     SCHEMA_NAME = 'orders',
     OBJECT_NAME = 'order_details',
    DISTRIBUTION=SHARDED(ol_w_id)
);

从当前数据库中检索外部表的列表:

SELECT * from sys.external_tables;

若要删除外部表,请执行以下步骤:

DROP EXTERNAL TABLE [ database_name . [ schema_name ] . | schema_name. ] table_name[;]

备注

DATA_SOURCE 子句定义用于外部表的外部数据源(分片映射)。

SCHEMA_NAME和OBJECT_NAME子句将外部表定义映射到不同架构中的表。 如果省略,则假定远程对象的架构是 dbo,并假定其名称与所定义的外部表名称相同。 如果远程表的名称已在要在其中创建外部表的数据库中使用,那么该做法很有用。 例如,你希望定义一个外部表,以便在分布式数据层上获取目录视图或动态管理视图 (DMV) 的聚合视图。 由于目录视图和 DMV 已在本地存在,因此不能在外部表定义中使用其名称。 改为使用不同的名称,并在 SCHEMA_NAME 和/或 OBJECT_NAME 子句中使用目录视图或 DMV 的名称。 (请参阅后面的示例。

该 DISTRIBUTION 子句指定用于此表的数据分布。 查询处理器利用子句中 DISTRIBUTION 提供的信息来生成最有效的查询计划。

  1. SHARDED 表示跨数据库水平分区数据。 数据分布的分区键位于 <sharding_column_name> 参数中。
  2. REPLICATED 表示每个数据库上都存在表的相同副本。 要负责确保各数据库上的副本是相同的。
  3. ROUND_ROBIN 表示表通过依赖于应用程序的分布方法进行水平分区。

数据层引用:外部表 DDL 引用外部数据源。 外部数据源指定分片映射,后者为外部表提供在数据层中找到所有数据库所需的信息。

安全注意事项

有权访问外部表的用户将根据外部数据源定义中提供的凭据自动获得对基础远程表的访问权。 避免通过外部数据源的凭据进行不必要的权限提升。 将外部表当作常规表,在其中使用 GRANT 或 REVOKE。

定义外部数据源和外部表后,可以对外部表使用完整的 T-SQL。

示例:查询横向分区的数据库

下面的查询在仓库、订单和订单行之间执行三向联接,并使用多个聚合和选择性筛选器。 它假设 (1) 进行水平分区(分片),(2) 仓库、订单和订单行按仓库 ID 列进行分片,并且弹性查询可以将联接聚于分片上,并行处理查询中代价较高的部分。

    select  
         w_id as warehouse,
         o_c_id as customer,
         count(*) as cnt_orderline,
         max(ol_quantity) as max_quantity,
         avg(ol_amount) as avg_amount,
         min(ol_delivery_d) as min_deliv_date
    from warehouse
    join orders
    on w_id = o_w_id
    join order_line
    on o_id = ol_o_id and o_w_id = ol_w_id
    where w_id > 100 and w_id < 200
    group by w_id, o_c_id

远程 T-SQL 执行的存储过程:sp_execute_remote

弹性查询还引入了一个存储过程,以便提供对分片的直接访问。 存储过程称为 sp_execute_remote ,可用于对远程数据库执行远程存储过程或 T-SQL 代码。 它采用了以下参数:

  • 数据源名称(nvarchar):RDBMS 类型的外部数据源的名称。
  • 查询(nvarchar):要在每个分片上执行的 T-SQL 查询。
  • 参数声明 (nvarchar) - 可选:包含查询参数中使用的参数的数据类型定义的字符串(如 sp_executesql)
  • 参数值列表 - 可选:参数值的逗号分隔列表(如 sp_executesql)

使用 sp_execute_remote 调用参数中提供的外部数据源对远程数据库执行给定的 T-SQL 语句。 它使用外部数据源的凭据连接到分片映射管理器数据库和远程数据库。

示例:

    EXEC sp_execute_remote
        N'MyExtSrc',
        N'select count(w_id) as foo from warehouse'

工具连接性

可以使用常规 SQL Server 连接字符串将应用程序、BI 和数据集成工具连接到具有外部表定义的数据库。 请确保您的工具支持将 SQL Server 作为数据源。 然后像任何其他连接到工具中的 SQL Server 数据库一样,使用弹性查询数据库,并在工具或应用程序中像使用本地表一样使用外部表。

最佳实践

  • 仅为受信任的端点配置外部数据源。 限制逻辑服务器的出站网络,使其独立允许列表批准的目的FQDN。 更多信息请参见 “安全外部数据源”。
  • 确保已向弹性查询终结点数据库授予通过 SQL 数据库防火墙访问分片映射数据库和所有分片的权限。
  • 验证或强制执行由外部表定义的数据分布。 如果实际数据分布与表定义中指定的分布不同,则查询可能会产生意外的结果。
  • 当分片键上的谓词允许安全地从处理中排除某些分片时,弹性查询当前不执行分片消除。
  • 弹性查询最适合大部分计算可以在分片上完成的查询。 使用可以在分片或联接上通过分区键求值的选择性筛选器谓词(可以在所有分片上以分区对齐方式执行),通常可以获得最佳查询性能。 其他查询模式可能需要将大量数据从分片加载到头节点,并且性能不佳。