嗨,我是分区概念的新手
在Azure SQL中使用列存储索引创建表时,出现了
之类的错误第15级,州1,第15行的消息102 “ CLUSTERED”附近的语法不正确。
请找到我在Azure SQL中运行的以下脚本
CREATE TABLE [dbo].[FactInternetSales]
(
[ProductKey] int NOT NULL
,[OrderDateKey] int NOT NULL
, [CustomerKey] int NOT NULL
, [PromotionKey] int NOT NULL
, [SalesOrderNumber] nvarchar(20) NOT NULL
, [OrderQuantity] smallint NOT NULL
, [UnitPrice] money NOT NULL
, [SalesAmount] money NOT NULL
)
WITH
( CLUSTERED COLUMNSTORE INDEX
, DISTRIBUTION = HASH([ProductKey])
, PARTITION ( [OrderDateKey] RANGE RIGHT FOR VALUES
(20000101,20010101,20020101
,20030101,20040101,20050101
)
)
)
;
答案 0 :(得分:1)
以下内容仅对Standard S3和更高版本有效。我无法设置分发和分区。
CREATE TABLE [dbo].[FactInternetSales]
(
[ProductKey] int NOT NULL
,[OrderDateKey] int NOT NULL
, [CustomerKey] int NOT NULL
, [PromotionKey] int NOT NULL
, [SalesOrderNumber] nvarchar(20) NOT NULL
, [OrderQuantity] smallint NOT NULL
, [UnitPrice] money NOT NULL
, [SalesAmount] money NOT NULL
)
GO
CREATE CLUSTERED COLUMNSTORE index ProductKey on FactInternetSales
答案 1 :(得分:1)
您问题中的DDL是SQL数据仓库/ SQL并行数据仓库而不是Azure SQL数据库(或Azure VM或本地上的SQL Server)的语法。一个人不能对后者使用内联语法,并且DISTIBUTION
子句不适用于这些情况。
相反,首先创建分区函数和方案,并使用分区方案指定一个ON
子句。可以使用内联语法(如下面的示例)指定索引,也可以使用CREATE CLUSTERED COLUMNSTORE INDEX...
单独指定索引。
CREATE PARTITION FUNCTION PF_FactInternetSales_OrderDateKey(int)
AS RANGE RIGHT FOR VALUES(
20000101
, 20010101
, 20020101
, 20030101
, 20040101
, 20050101
);
CREATE PARTITION SCHEME PS_FactInternetSales_OrderDateKey
AS PARTITION PF_FactInternetSales_OrderDateKey
ALL TO ([PRIMARY]);
CREATE TABLE [dbo].[FactInternetSales]
(
[ProductKey] int NOT NULL
, [OrderDateKey] int NOT NULL
, [CustomerKey] int NOT NULL
, [PromotionKey] int NOT NULL
, [SalesOrderNumber] nvarchar(20) NOT NULL
, [OrderQuantity] smallint NOT NULL
, [UnitPrice] money NOT NULL
, [SalesAmount] money NOT NULL
, INDEX ccix CLUSTERED COLUMNSTORE ON PS_FactInternetSales_OrderDateKey(OrderDateKey)
) ON PS_FactInternetSales_OrderDateKey(OrderDateKey);
请注意,您至少需要标准版和S3服务目标才能在Azure SQL数据库中使用列存储。下面的查询将返回您的当前配置。
SELECT
DATABASEPROPERTYEX(N'YourDatabase', 'Edition') AS Edition
, DATABASEPROPERTYEX(N'YourDatabase', 'ServiceObjective') AS ServiceObjective;
如有必要,您可以使用门户网站或带有以下DDL的T-SQL移至更高的层。这可能需要几分钟,您可以运行上面的查询以确认它已完成。
ALTER DATABASE YourDatabase
MODIFY (SERVICE_OBJECTIVE = 'S3');
我还看到您也用SQL Server 2012标记了您的问题。群集列存储索引是在SQL Server 2014 Enterprise Edition中引入的,从SQL Server 2016 SP2开始,也可以在其他SQL Server版本中使用。在SQL Server 2012中,仅支持只读的非聚集列存储索引。
答案 2 :(得分:0)
要解决此问题,您需要选择Datawarehouse而不是特定的数据库。如果使用的是Azure Data Studio,则“更改连接”旁边会出现一个下拉按钮。确保选择特定的数据仓库。
注意: CLUSTERED COLUMNSTORE INDEX是表结构选项,将表存储为集群列存储索引,其中所有数据均按列进行压缩和存储。聚集的列存储索引是SQL数据仓库的默认索引,适用于所有表数据。