'CLUSTERED in azure SQL 附近的语法不正确

Incorrect syntax near 'CLUSTERED in azure SQL

嗨,我是分区概念的新手

在 azure 中使用列存储索引创建 table 时 SQL 我收到类似

的错误

Msg 102, Level 15, State 1, Line 15 Incorrect syntax near '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
                    )
                )
)
;

以下仅适用于标准 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

您问题中的 DDL 是 SQL 数据 Warehouse/SQL 并行数据仓库的语法,而不是 Azure SQL 数据库(或 Azure VM 上的 SQL 服务器或-prem)。不能对后者使用内联语法,而且 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 服务 Objective 才能在 Azure SQL 数据库中使用列存储。下面的查询将 return 您当前的配置。

SELECT
      DATABASEPROPERTYEX(N'YourDatabase', 'Edition') AS Edition
    , DATABASEPROPERTYEX(N'YourDatabase', 'ServiceObjective') AS ServiceObjective;

如有必要,您可以使用门户或在 T-SQL 中使用下面的 DDL 移动到更高层。这可能需要几分钟时间,您可以 运行 上面的查询来验证它是否已完成。

ALTER DATABASE YourDatabase
    MODIFY (SERVICE_OBJECTIVE = 'S3');

我看到你还用 SQL Server 2012 标记了你的问题。聚集列存储索引是在 SQL Server 2014 Enterprise Edition 中引入的,并且从 SQL Server 2016 SP2 开始,可以也可用于其他 SQL 服务器版本。在 SQL Server 2012 中,仅支持只读非聚集列存储索引。

要解决此问题,您需要 select 数据仓库而不是特定的数据库。如果您使用的是 Azure Data Studio,"Change Connection" 旁边会有一个下拉按钮。确保您正在 selecting 特定的数据仓库。

注意: CLUSTERED COLUMNSTORE INDEX 是一个 table 结构选项,将 table 存储为聚集列存储索引,其中所有数据都按列压缩和存储。聚集列存储索引是 SQL 数据仓库的默认索引,适用于所有 table 数据。

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