2016-01-21 39 views
0

我需要在兩列(表變量內)上創建索引,這些索引不構成唯一鍵。在表變量上創建索引子句

表結構如下所示 -

DECLARE @Sample TABLE (       
    [AssetSk] [int] NOT NULL,     
    [DateSk] [int] NOT NULL,    
    [Count] [numeric](38, 2) NULL   
    ) 

我想補充指標如下 -

INDEX AD1 CLUSTERED([AssetSk],[DateSk]) 

然而,它在SQL Server上運行它給了我下面的錯誤2012
「'INDEX'附近的語法不正確如果這是作爲表提示的一部分,現在需要WITH關鍵字和括號,請參閱SQL Server聯機叢書以獲取正確的語法。

但是,這在SQL Server 2014上完美運行。有什麼方法可以在SQL Server 2012上運行它嗎?

+1

http://stackoverflow.com/questions/886050/sql-server-creating-an-index-on-a-table-variable –

+1

建議:如果該表存儲那麼大一個結果你需要索引來改進查詢性能,轉移到臨時表。順便說一句,這裏的主鍵可以幫助你。 –

+0

@DeepanshuKalra表值函數內部不允許使用臨時表。 –

回答

4

在表變量使用SQL Server版本不能比建立唯一鍵的其他指標之前,2014年

然而,你可以做的伎倆:用自動增量值增加一個colummn創造包括列的唯一索引你需要和這個新的。

DECLARE @Sample TABLE (
    [ID] bigint identity(1, 1),       
    [AssetSk] [int] NOT NULL,     
    [DateSk] [int] NOT NULL,    
    [Count] [numeric](38, 2) NULL, 
    UNIQUE NONCLUSTERED ([AssetSk],[DateSk], ID)  
    ) 

更新:事實上,在表變量這種索引的創建可以是無用的。通常,SQL Server估計表變量只有一行,因此它不會以相對較高的概率使用此索引。

+0

爲什麼非羣集?如果您將它聚集在一起,它將覆蓋「COUNT」的附加列並且更有用。如果索引覆蓋了SQL Server,則應該在沒有任何其他提示的情況下使用索引來查找索引上的可搜索謂詞。如果引起問題,單行估算可以通過'OPTION(RECOMPILE)'來避免。 –

+0

@MartinSmith通常我會避免在自動增量ID之外的列上創建聚簇索引,因爲它定義了表中數據存儲的順序,因此可以在數據插入時進行大量的表重新排序。 –

+0

[該表不一定在CI順序](http://goo.gl/IAB78u)它將永遠不會重新排序插入上的現有行,儘管它們可能在被分割的頁面上移動。它可以將當前插入的數據集合排序爲CI密鑰順序,但它也可以同樣維護非聚簇索引。 (NCI也與頁面拆分有完全相同的問題)。如果需要排序,那麼在堆(AssetSk),[DateSk],ID,RID)上爲您的未覆蓋NCI排序的數據量將與首先使聚簇索引覆蓋一樣多。 –

1

據我所知,在SQL Server 2012及以下版本中,您無法將索引添加到表變量中。要添加一個索引,你必須申報表是這樣的:

​​

您可以創建索引後,你需要這樣的

CREATE CLUSTERED INDEX IX_MyIndex 
ON #Sample ([AssetSk],[DateSk]) 

當然,你在四人同臺完成後,功能,您可以撥打

DROP TABLE #Sample 
+0

您的建議表示感謝。但是,我不能在表值函數中使用它。這就是爲什麼我專注於用戶定義表格。 –