我希望獲得有關如何在不使用程式碼的情況下在SQL Server 2008 資料庫上建立非聚集索引的協助,或者更確切地說,在運行任何SQL 查詢之前一勞永逸地「靜態」建立非聚集索引(這可能沒有意義,但我的觀點是因為我不想每次執行屬於業務應用程式一部分的 SQL 查詢時都執行 SQL 命令來建立索引)。
也就是說,理想情況下,Visual Studio 2010 Professional 中內建有一個Microsoft SQL Server 工具(注意:我沒有企業版或終極版- 這對於我可以使用專業版中的內建SQL 管理器做什麼有很大的不同)版本)來執行此操作 - 因為我沒有任何其他工具(我只是查看,發現 Microsoft SQL Server 2008 沒有我需要的東西 - 至少在我的系統上 - 它顯然是一個有缺陷的免費軟體版本)。因此,也許需要一個簡單的 SQL 指令來索引下表。
我已閱讀下面的參考資料,但我不知道如何做到這一點。
這是我的桌子:
Table CUSTOMER
Columns:
CustomerID = GUID - this is a unique primary key
CustomerDecimal1 = decimal- this is not unique, but 99% of the time it is unique
compared to the rest of decimal fields. I wish to index this field 1 of 2
CustomerDecimal2 = decimal- this is not unique, but 99% of the time it is unique
compared to the rest of decimal fields. I wish to index this field 2 of 2
CustomerTextComments = vChar(50)
小數字段經常在 WHERE 子句中使用,因此它們是非聚集索引的理想候選者,這顯然是 Microsoft SQL Server 2008 中支援的新功能。
進一步了解我的平台:我確實已經有一個包含現有數據的表,但只有幾筆記錄,大部分是空白的。我正在 Visual Studio 2010 內部的伺服器資源管理器中工作,它具有許多功能,包括產生 SQL 查詢的能力。理想情況下,我想在 Linq-to-entities 中編寫任何索引方法(只是因為我不太了解 SQL),但如果有人可以給我一個關於如何在此表中索引 CustomerDecimal1、CustomerDecimal2 字段的完整列表,我將感激不盡。
參考:
http://blog.sqlauthority.com/2008/09/01/sql-server-2008-introduction-to-filtered-index-improve-performance-with-filtered-index/ (SQL Server 2008 用於 WHERE 子句搜尋的新「過濾」索引屬性)
http://en.wikipedia.org/wiki/Index_%28database%29#Non-clustered
- - -更新
@mrdenny——感謝您抽出寶貴的時間,我看到您享有盛譽,但我無法相信您所說的話——是的,我很頑固,稱之為否認! :-) 我會讓這個線程再開放一點,希望其他人能看到它。另外,由於我本身不運行SQL,因此僅從實體框架(EF 4.0)內部運行Linq-to-entities,我什至不知道將您提供的程式碼放在哪裡(“T/SQL to create a non-clustered index on兩個小數列」)。我在 WHERE 搜尋中始終使用兩個十進制列——因此您的第一個 SQL 命令適合我。
有人可以將 Denny 先生的第一個 SQL 程式碼翻譯成 Linq-to-Entities 嗎?如果做不到這一點,我會舉手說我不相信它(這與我讀到的關於索引就像平衡樹一樣的內容相反,它應該自動內置到系統中),或者,在替代方案中,我從字裡行間可以看出,索引最多可以讓您的效能提高 20% 左右——很好,但沒有什麼值得過度興奮的。是的,這是酸葡萄心理學!
答案1
第一個非聚集索引在 SQL Server 2008 中並不是什麼新鮮事。篩選索引是 SQL Server 2008 中的新增功能。
在對 SQL Server 執行任何查詢之前,無法讓系統確定需要建立哪些索引。
在 SQL Server 中建立索引有兩種方法。一種是使用 T/SQL,另一種是使用具有圖形編輯器的 SQL Server Management Studio。圖形編輯器將簡單地產生 T/SQL 並針對資料庫執行 T/SQL。
在兩個小數列上建立非聚集索引的 T/SQL 如下所示。
CREATE INDEX IX_CustomerDecimal1_CustomerDecimal2 on dbo.CUSTOMER
(CustomerDecimal1, CustomerDecimal2)
INCLUDE (CustomerTextComments)
WITH (FILLFACTOR=70)
如果您打算在搜尋資料庫表格時獨立使用兩個 CustomerDecimal 字段,那麼您將需要為每個字段建立單獨的索引。
CREATE INDEX IX_CustomerDecimal1 on dbo.CUSTOMER
(CustomerDecimal1)
INCLUDE (CustomerTextComments)
WITH (FILLFACTOR=70)
CREATE INDEX IX_CustomerDecimal2 on dbo.CUSTOMER
(CustomerDecimal2)
INCLUDE (CustomerTextComments)
WITH (FILLFACTOR=70)
無論哪種情況,您都需要將要傳回的欄位新增至包含列的清單中,以便最大限度地減少產生的 IO。