分类: 数据库开发技术
2018-01-09 13:38:53
使用表格
在使用T-SQL语句的SQL数据仓库版本时,您通常会发现语法和在SQL Server或SQL数据库中的语句的实施方式类似。 但是,语句的SQL 数据仓库版本通常不是很广泛,而且有时支持特定于SQL数据仓库的选项,而这正如我们在CREATE DATABASE(创建数据库)语句中所看到的那样。
CREATE TABLE(创建表格)语句也是如此。 它不支持SQL Server或SQL数据库中的许多可用选项,而且也有几个特定于SQL数据仓库的选项。 例如,该语句不支持主键、外键、check约束、唯一约束、唯一索引、计算列、稀疏列、用户定义的数据类型、索引视图、标识、序列、触发器或同义词。 此外,该语句也不支持某些数据类型,如:geometry、geography、hierarchyid等。 同时,CREATE TABLE语句还提供了SQL数据仓库特有或拥有着不同于标准T-SQL处理方式的表格选项。
让我们来查看一个示例,从而了解一些可用的表格选项。以下的CREATE TABLE语句创建了一个FactSales表格,而该表格包含了理论上与数据仓库中的维度相关的几个关键列:
如预期的那样,该表格不包括主键、外键或任何其它禁止元素。 但是,它在WITH子句中却包含着几个有趣的表格选项。
第一个是CLUSTERED COLUMNSTORE INDEX(聚簇COLUMNSTORE索引),它会创建一个包含所有表数据的内存优化索引。这与SQL Server CREATE TABLE语句中的可用CLUSTERED COLUMNSTORE索引选项相似,但却与SQL Server语句不同,因为我们无法在SQL数据仓库表格上创建非聚簇columnstore索引。
下一个表格选项是DISTRIBUTION(分布),它指定了用于跨多个位置(分布)分发数据的方式。 您可以从以下两个选项中进行选择:ROUND_ROBIN或ROUND_ROBIN。 其中,ROUND_ROBIN选项是默认的,并且会在所有分布中均匀分布行。
HASH 选项则通过对指定列(在本示例中指的是Customer Key)中的值进行散列,以便将每个行分配给一个分发,而这有助于连接表格并将某些类型的数据聚合在一起,从而提高查询性能。 有关选择ROUND_ROBIN还是HASH的信息,请参阅以下的Azure帮助主题文章《SQL数据仓库中的表格设计》。
最后一个表格选项是PARTITION(分区),它决定了行在每个分发中的分组和存储方式。 在本示例中,分区是基于ProductKey列和指定的RANGE(范围)选项的。 因此,共有五个分区将被创建而成,而数据会被根据以下规则分类到这些分区之中:
· 分区1: ProductKey 《= 1000
· 分区2: ProductKey 》 1000 且 《= 2000
· 分区 3: ProductKey 》 2000 且 《= 3000
· 分区4:ProductKey 》 3000 且 《= 4000
· 分区5: ProductKey 》 4000
当CREATE TABLE语句运行时,它会将FactSales表格添加到默认模式dbo中。 但是,我们可以使用CREATE SCHEMA(创建模式)语句在SQL数据仓库数据库中创建其它模式。 与其它T-SQL语句一样,该语句的语法不像SQL Server语句那样能支持那么多的选项,但支持的基本选项仍是相同的。 比如,以下的语句就创建了一个名为sales的模式:
现在,我们可以使用ALTER SCHEMA(更改模式)语句将FactSales表转移至sales模式了:
有了SQL数据仓库,ALTER SCHEMA语句就只能用于基本的数据库对象了。 而在使用SQL Server或SQL数据库时,您还可以使用该语句来移动用户定义的数据类型和XML模式集合。
在极少数情况下,您将发现SQL Server或SQL数据库都不支持用于SQL数据仓库的T-SQL语句。 例如,SQL数据仓库提供了RENAME(重命名)语句,它允许您如以下示例所示那样重命名用户表:
该语句将FactSales表的名称更改为FactOrders。 而在SQL Server和SQL数据库中,您必须使用sp_rename系统存储过程来重命名表和用户定义的其它对象。
在创建表格之后,您可能需要添加直接来源于Visual Studio的数据,而不是执行批量加载操作,因为这可能会在之后才进行。 SQL数据仓库支持INSERT(插入)语句以及其它数据修改语言(DML)语句。 与其它类型的语句一样,DML语句往往不比SQL Server或SQL数据库中的语句那么强大,但其还是具备了基本的功能。
比如,在使用SQL数据仓库时,您不能使用公用表表达式来将INSERT语句提前,而且也不能使用单个INSERT语句来进行多行传递。 但是,您仍然可以如以下示例所示的那样将数据传递到特定列或所有列中:
这些语句会将数据插入到目标表中,就像它们在SQL Server中会做的那样。 但正如这些语句所示,您不得不严重依赖Microsoft文档来了解有关如何在不同的平台上实施语句的具体信息。 例如,MSDN帮助主题INSERT(Transact-SQL)描述了在SQL Server、SQL数据库、SQL数据仓库和并行数据仓库中实施的INSERT语句。