【问题标题】:Indexing on temporary tables in Azure SQL Data Warehouse在 Azure SQL 数据仓库中的临时表上建立索引
【发布时间】:2020-05-01 06:25:40
【问题描述】:

Azure SQL 数据仓库是否支持对临时表进行任何索引? https://docs.microsoft.com/en-us/azure/sql-data-warehouse/sql-data-warehouse-tables-temporary 没有提及限制。

在一次尝试中,我收到了:

 Cannot create a non-clustered index on a temporary table. 

该措辞是否推断可以将聚集索引放置在临时表上?

【问题讨论】:

  • 是的,synapse #temp_tables,至少将 ala select * ... 填充到 #temp_table... 获取自动在它们上创建的聚集索引。因此,这可能是预先创建#temp 表的专业提示,以便您可以控制聚集索引定义。否则,如果你能找到它的实际名称,你可以删除它并按照你喜欢的方式重新创建它(我昨天就是这样做的)。

标签: azure-sqldw


【解决方案1】:

在我的一个项目中,使用具有多列索引的临时表以及向其中添加新列的选项对我来说非常重要。 (临时表也不支持 ALTER TABLE)。标准表不是选项,因为每个查询运行都必须有自己的表。

最后,我使用了可以用作临时表但实际上不是临时表的东西。我正在创建一个标准表,但以 Guid 作为名称并将名称分配给一个变量。因此,我使用的是@MySemiTempTable 而不是#TempTable,但这仅适用于生成的代码。所以我必须使用 sp_executesql 运行该代码。下面的例子:

declare @MySemiTempTable  NVARCHAR(MAX)
declare @sql  NVARCHAR(MAX)

set @MySemiTempTable = 'TMP_' + CAST(NEWID () AS NVARCHAR(37))
set @sql = 'CREATE TABLE ['+ @MySemiTempTable + '] (Column1 [int], Column2 NVARCHAR(50))'
EXECUTE sp_executesql @sql
set @sql = 'INSERT INTO ['+ @MySemiTempTable + ']   VALUES (1, ''test1'')'
EXECUTE sp_executesql @sql

set @sql = 'create unique index column1 on  ['+ @MySemiTempTable + '] (column1)'
EXECUTE sp_executesql @sql

set @sql = 'select * from  ['+ @MySemiTempTable + '] '
EXECUTE sp_executesql @sql

set @sql = 'drop table   ['+ @MySemiTempTable + '] '
EXECUTE sp_executesql @sql

【讨论】:

    【解决方案2】:

    临时表支持聚集索引。例如:

    CREATE TABLE #temp_table   
        ( 
        c1 integer
        ,c2 integer
        )  
         WITH (  CLUSTERED INDEX (c1 ASC) )   
    

    ;

    【讨论】:

    • 所有初始索引配置都在临时表上可用,即HEAP | CLUSTERED COLUMNSTORE INDEX | CLUSTERED INDEX。目前临时表不支持二级索引。
    猜你喜欢
    • 2020-07-03
    • 1970-01-01
    • 2017-06-28
    • 2016-03-11
    • 2016-06-30
    • 1970-01-01
    • 2016-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多