在Azure SQL中{CLUSTERED}附近的语法不正确

时间:2018-08-29 12:09:09

标签: sql-server sql-server-2012 azure-sql-database partitioning azure-sql-server

嗨,我是分区概念的新手

在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
                    )
                )
)
;

3 个答案:

答案 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数据仓库的默认索引,适用于所有表数据。

有关更多信息,请检查: https://docs.microsoft.com/en-us/learn/modules/understand-the-sql-dw-connector-with-azure-databricks/5-create-tables-perform-queries