簡體   English   中英

SQL 服務器索引包含的列

[英]SQL Server index included columns

我需要幫助了解如何創建索引。 我有一張看起來像這樣的桌子

  • ID
  • 姓名
  • 年齡
  • 地點
  • 教育,
  • 電話號碼

我的查詢如下所示:

SELECT * 
  FROM table1 
 WHERE name = 'sam'
  1. 使用包含的列為此創建索引的正確方法是什么?
  2. 如果查詢有 order by 語句怎么辦?

     SELECT * FROM table1 WHERE name = 'sam' ORDER BY id DESC
  3. 如果我的 where 語句中有 2 個參數怎么辦?

     SELECT * FROM table1 WHERE name = 'sam' AND age > 12

創建包含列的索引的正確方法? 通過 Management Studio/Toad/etc 或 SQL(文檔):

CREATE INDEX idx_table_1 ON db.table_1 (name) INCLUDE (id)

如果查詢有ORDER BY怎么辦

如果優化器認為適合(由表統計信息和查詢確定),則ORDER BY可以使用索引。 您可以通過查看查詢成本來測試復合索引或具有INCLUDE列的索引是否效果最佳。

如果id是聚集鍵(但並不總是主鍵),我可能不會包含該列...

如果我的 where 語句中有 2 個參數怎么辦?

與上面相同 - 您需要測試最適合您的查詢的方法。 可能是復合的、包含的或單獨的索引。

但請記住:

  • 調整一個查詢不一定會使其他所有查詢受益
  • 索引確實會減慢 INSERT/UPDATE/DELETE 語句的速度,並且需要維護
  • 您可以將數據庫優化顧問 (DTA) 用於索引建議,包括一些冗余的索引建議

推薦閱讀

我強烈建議閱讀 Kimberly Tripp 的“ The Tipping Point ”,以更好地了解指數決策和影響。

由於我不知道您的數據庫將執行哪些確切任務以及其中有多少記錄,我建議您查看Index Basics MSDN 文章。 它將允許您自己決定要創建哪些索引。

如果ID是您的主索引和/或聚集索引鍵,只需在Name, Age上創建一個索引。 這將涵蓋所有三個查詢。

包含字段最適合用於檢索不在篩選器列表中的列的行級值,或檢索排序字段位於GROUP BY子句中的聚合值。

如果插入很少見,請根據需要創建盡可能多的索引。

對於第一個查詢,為名稱列創建索引。

我認為 ID 列已經是主鍵...

使用名稱和年齡創建第二個索引。 您只能保留一個索引:'name, ag'e,第一次查詢不會慢很多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM