2009-12-17 80 views
1

以下可能嗎?我無法這樣做。我必須有一個永久表來創建索引嗎?sql server 2000 TSQL:在表變量上創建索引

declare @Beatles table 
    (
     LastName varchar(20) ,  
     FirstName varchar(20) 
    ) 

CREATE CLUSTERED INDEX Index_Name_Clstd ON @Beatles(LastName) 
+0

因此,如果我想優化就表格變量而言,我可以在表格定義中創建索引,如下所示? (20)NOT NULL主鍵集合, FirstName varchar(20)NOT NULL UNIQUE NONCLUSTERED); 從@Beatles中選擇姓氏 – 2009-12-17 19:26:08

+0

您必須在臨時表格或常規表格上執行此操作。 – JonH 2009-12-18 18:11:25

回答

2

不在一個表變量,但在一個臨時表中看到這個http://www.sqlteam.com/article/optimizing-performance-indexes-on-temp-tables

+0

適用於**臨時表** - 但不適用於表變量! – 2009-12-17 17:53:28

+1

marc我誤解了它,並且在你回覆時正在改變它.god這個網站非常快! – JonH 2009-12-17 17:54:09

+0

@Jonh:你必須仔細考慮並輸入約。這裏的光速! – 2009-12-17 17:55:17

2

不,你不能在一個表變量創建指數 - 看到這個article hereposting here比較局部,全局臨時表的表變量。

限制

不能對錶變量創建一個非聚集 指數,除非 指數在桌子上 一個PRIMARY KEY或UNIQUE約束的副作用(SQL服務器使用 索引強制執行任何UNIQUE或 PRIMARY KEY約束)。

0

根據this post - 是的,你可以。 下面的聲明將產生2個索引:

DECLARE @Users TABLE 
(
    UserID INT PRIMARY KEY, 
    UserName VARCHAR(50), 
    FirstName VARCHAR(50), 
    UNIQUE (UserName,UserID) 
) 

第一索引將被聚集,並且將包括主鍵。 第二個索引將是非聚集的,並將包含唯一約束中列出的列。 這裏是另一篇文章,展示瞭如何強制查詢優化器使用動態生成的索引,因爲它往往會忽略它們(索引將在執行計劃評估後生成)