sqlserver查看索引
A. 如何查表是否有索引 sqlserver
一般設置了主鍵系統會自動創建索引,索引我們可以通過管理工具來查看,也可以通過系統提供的存儲過程來查看是否有索引
B. sqlserver 索引
索引的基本結構
「索引(Index)提供查詢的速度」這是對索引的最基本的解釋,接下來我們將通過介紹索引的組成,讓大家對索引有更深入的理解。 索引是資料庫中的一個獨特的結構,由於它保存資料庫信息,那麼我們就需要給它分配磁碟空間和維護索引表。創建索引並不會改變表中的數據,它只是創建了一個新的數據結構指向數據表;打個比方,平時我們使用字典查字時,首先我們要知道查詢單詞起始字母,然後翻到目錄頁,接著查找單詞具體在哪一頁,這時我們目錄就是索引表,而目錄項就是索引了。
當然,索引比字典目錄更為復雜,因為資料庫必須處理插入,刪除和更新等操作,這些操作將導致索引發生變化。葉節點
假設我們磁碟上的數據是物理有序的,那麼資料庫在進行插入,刪除和更新操作時,必然會導致數據發生變化,如果我們要保存數據的連續和有序,那麼我們就需要移動數據的物理位置,這將增大磁碟的I/O,使得整個資料庫運行非常緩慢;使用索引的主要目的是使數據邏輯有序,使數據獨立於物理有序存儲。
為了實現數據邏輯有序,索引使用雙向鏈表的數據結構來保持數據邏輯順序,如果要在兩個節點中插入一個新的節點只需修改節點的前驅和後繼,而且無需修改新節點的物理位置。雙向鏈表(Doubly linked list)也叫雙鏈表,是鏈表的一種,它的每個數據結點中都有兩個指針,分別指向直接後繼和直接前驅。所以,從雙向鏈表中的任意一個結點開始,都可以很方便地訪問它的前驅結點和後繼結點。
理論上說,從雙向鏈表中刪除一個元素操作的時間復雜度是O(1),如果希望刪除一個具體有給定關鍵字的元素,那麼最壞的情況下的時間復雜度為O(n)。
在刪除的過程中,我們只需要將要刪除的節點的前節點和後節點相連,然後將要刪除的節點的前節點和後節點置為null即可。索引的類型
我們知道索引的類型有兩種:聚集索引和非聚集索引。
聚集索引:物理存儲按照索引排序。
非聚集索引:物理存儲不按照索引排序。了解更多知識點擊鏈接:http://www.jb51.net/article/30971.htm
C. sqlserver 怎麼建索引
(1)在SQL Server Management Studio中,選擇並右擊要創建索引的表,從彈出菜單中選擇「設計」,打開表設計器。右鍵單擊表設計器,從彈出菜單中選擇「索引/鍵」命令,打開「索引/鍵」對話框。對話框中列出了已經存在的索引,如下圖所示。
(2)單擊「添加」按鈕。在「選定的主/唯一鍵或索引」框顯示系統分配給新索引的名稱。
(3)在「列」屬性下選擇要創建索引的列。可以選擇多達16列。為獲得最佳性能,最好只選擇一列或兩列。對所選的每一列,可指出索引是按升序還是降序組織列值。
(4)如果要創建唯一索引,則在「是唯一的」屬性中選擇「是」。
(5)設置完成後,單擊「確定」按鈕。
(6)當保存表時,索引即創建在資料庫中。
使用CREATE INDEX語句創建索引:
復制內容到剪貼板
代碼:
CREATE[ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX索引名
ON {表名|視圖名} (列名[ ASC | DESC ] [ ,...n ] )
例:
在資料庫HrSystem中為表Employees創建基於IDCard列的唯一索引IX_Employees,可以使用以下命令:
復制內容到剪貼板
代碼:
USE HrSystem
GO
CREATE UNIQUE NONCLUSTERED INDEX [IX_Employees]ONdbo.Employees(IdCard)
GO
例:
為表Employees創建基於列IDCard的唯一、聚集索引IX_Employees1,可以使用以下命令:
復制內容到剪貼板
代碼:
USE HrSystem
GO
CREATE UNIQUE CLUSTERED INDEX [IX_Employees1] ON [dbo].[Employees](IdCard)
GO
需要注意的是,在一個表中只允許存在一個聚集索引。因此,如果表Employees中已經存在一個聚集索引,則執行上面的語句時將會提示下面的錯誤信息。
消息1902,級別16,狀態3,第1行
無法對表'dbo.Employees'創建多個聚集索引。請在創建新聚集索引前刪除現有的聚集索引'PK__Employee__263E2DD300551192'。 例:
對表Employees的列Emp_name按照降序創建索引,可以使用以下命令:
復制內容到剪貼板
代碼:
USE HrSystem
GO
CREATENONCLUSTERED INDEX [IX_Employees2] ON [dbo].[Employees]
(
[Emp_name] DESC
)
GO
在CREATE INDEX語句中使用INCLUDE子句,可以在創建索引時定義包含的非鍵列,其語法結構如下:
復制內容到剪貼板
代碼:
CREATENONCLUSTERED INDEX 索引名
ON { 表名| 視圖名 } ( 列名 [ ASC | DESC ] [ ,...n ] )
INCLUDE (<列名1>, <列名2>, [,… n])
例: 在表Employees上創建非聚集索引IX_Wage,索引中的鍵列為Wage,非鍵列為Emp_name、Sex和Title,具體語句如下:
復制內容到剪貼板
代碼:
USEHrSystem
GO
CREATENONCLUSTERED INDEX IX_Wage
ON Employees ( Wage )
INCLUDE (Emp_name, Sex, Title)
GO
例: 在創建索引IX_Wage後,當表Employees中的數據量比較大時,執行下面的SELECT語句將會明顯地改進查詢效率。
復制內容到剪貼板
代碼:
USEHrSystem
GO
SELECTEmp_name, Sex, Title, Wage
FROMEmployees
WHEREWage BETWEEN 1000 AND 3000
GO
修改索引:
在SQL Server Management Studio中,選擇並右擊要創建索引的表,從彈出的菜單中選擇「設計表」,打開表設計器。右鍵單擊表設計器,從彈出菜單中選擇「索引/鍵」命令,打開「索引/鍵」對話框,並查看已經存在的索引及修改索引的屬性信息。
也可以使用ALTER INDEX語句修改索引,其基本語法如下:
復制內容到剪貼板
代碼:
ALTER INDEX { 索引名| ALL }
ON <表名|視圖名>
{ REBUILD | DISABLE | REORGANIZE }[ ; ]
ALTER INDEX語句的參數比較復雜,這里只介紹它的基本使用情況。參數說明如下:
REBUILD指定重新生成索引。 DISABLE指定將索引標記為已禁用。 REORGANIZE指定將重新組織的索引葉級。
例:
要禁用索引IX_Employees,可以使用下面的語句:
復制內容到剪貼板
代碼:
USE HrSystem
GO
ALTERINDEX IX_Employees ON Employees DISABLE
GO
刪除索引:
在SQL Server Management Studio中,選擇並右擊要創建索引的表,從彈出的菜單中選擇「設計表」。打開表設計器。右鍵單擊表設計器,從彈出菜單中選擇「索引/鍵」命令,在打開的「索引/鍵」對話框中列出了已經存在的索引。單擊「刪除」按鈕,即可刪除索引信息。
復制內容到剪貼板
代碼:
DROP INDEX 表名.索引名|視圖名.索引名[ ,...n ]
總結:
o(1)索引並非越多越好,一個表中如果有大量的索引,不僅佔用大量的磁碟空間,而且會影響INSERT、DELETE、UPDATE等語句的性能。因為當表中數據更改的同時,索引也會進行調整和更新。
o(2)避免對經常更新的表進行過多的索引,並且索引中的列盡可能少。而對經常用於查詢的欄位應該創建索引,但要避免添加不必要的欄位。
o(3)數據量小的表最好不要使用索引,由於數據較少,查詢花費的時間可能比遍歷索引的時間還要短,索引可能不會產生優化效果。
o(4)在條件表達式中經常用到的、不同值較多的列上建立索引,在不同值少的列上不要建立索引。比如在學生表的「性別」欄位上只有「男」與「女」兩個不同值,因此就無須建立索引。如果建立索引,不但不會提高查詢效率,反而會嚴重降低更新速度。
o(5)當唯一性是某種數據本身的特徵時,指定唯一索引。使用唯一索引能夠確保定義的列的數據完整性,提高查詢速度。
o(6)在頻繁進行排序或分組(即進行GROUPBY或ORDERBY操作)的列上建立索引,如果待排序的列有多個,可以在這些列上建立組合索引。
D. sqlserver的索引
索引是加快檢索速度的方法,前提要數據量大。
索引分為:聚集索引、非聚集索引、唯一性索引
聚集索引:邏輯順序和物理順序一致,一張表只能有一個聚集索引,當創建主鍵的時候默認會創建聚集索引。
非聚集索引:邏輯順序和物理順序不一致。可以建很多個非聚集索引,通過create index 默認創建的索引是非聚集索引。
索引的准則:
1、排序的欄位
2、經常要使用的欄位
E. 如何查看SqlServer表 索引 創建時間,修改時間.或者修改記錄
進入查詢分析器,選擇資料庫,執行: EXEC sp_configure 'allow updates', 1 RECONFIGURE WITH OVERRIDE; 然後執行: update sysobjects set crdate='2010-5-20 14:30' where name = '表名' and xtype = 'u'; 最後執行
F. 如何查詢sqlserver資料庫中得所有索引
select a.name as tabname
,h.name as idname
from sys.objects as a
right join sys.indexes as h on a.object_id=h.object_id
where a.type<>'s'
go
由於索引和系統列沒有直接對應關系 所以不能直接查看列欄位和欄位長度
G. MySQL索引機制(詳細+原理+解析)
MySQL 前綴索引能有效減小索引文件的大小,提高索引的速度。但是前綴索引也有它的壞處:MySQL 不能在 ORDER BY 或 GROUP BY 中使用前綴索引,也不能把它們用作覆蓋索引(Covering Index)。
集一個索引包含多個列(最左前綴匹配原則)
索引列的值必須唯一,但允許有空值
全文索引為FUllText,在定義索引的列上支持值的全文查找,允許在這些索引列中插入重復值和空值,全文索引可以在CHAR,VARCHAR,TEXT類型列上創建
設定主鍵後數據會自動建立索引,InnoDB為聚簇索引
即一個索引只包含單個列,一個表可以有多個單列索引
覆蓋索引是指一個查詢語句的執行只用從所有就能夠得到,不必從數據表中讀取,覆蓋索引不是索引樹,是一個結果,當一條查詢語句符合覆蓋索引條件時候,MySQL只需要通過索引就可以返回查詢所需要的數據,這樣避免了查到索引後的回表操作,減少了I/O效率
查看索引
列名解析:
刪除索引
查看:
刪除前:
刪除後:
普通的索引,沒有什麼介紹
查看:(注意和前綴索引Sub_part的區別)
當索引的列是unique的時候,會生成唯一索引,唯一索引關於null有下列兩種情況
SQLSERVER 下的唯一索引的列,允許null值,但最多允許有一個空值
MYSQL下的唯一索引的列,允許null值,並且允許多個空值
查看:
會建立兩個索引,一個非聚簇索引,一個是唯一索引
結果:
可以插入兩個空值(明人不說暗話,我喜歡MySQL)
一方面,它不會索引所有欄位所有字元,會減小索引樹的大小.
另外一方面,索引只是為了區別出值,對於某些列,可能前幾位區別很大,我們就可以使用前綴索引。
一般情況下某個前綴的選擇性也是足夠高的,足以滿足查詢性能。對於BLOB,TEXT,或者很長的VARCHAR類型的列,必須使用前綴索引,因為MySQL不允許索引這些列的完整長度。
查看:
查看:
復合索引的最左前綴匹配原則 :
對於復合索引,查詢在一定條件才會使用該索引
減少開銷。 建一個聯合索引(col1,col2,col3),實際相當於建了(col1),(col1,col2),(col1,col2,col3)三個索引。每多一個索引,都會增加寫操作的開銷和磁碟空間的開銷。對於大量數據的表,使用聯合索引會大大的減少開銷!
覆蓋索引。 對聯合索引(col1,col2,col3),如果有如下的sql: select col1,col2,col3 from test where col1=1 and col2=2。那麼MySQL可以直接通過遍歷索引取得數據,而無需回表,這減少了很多的隨機io操作。減少io操作,特別的隨機io其實是dba主要的優化策略。所以,在真正的實際應用中,覆蓋索引是主要的提升性能的優化手段之一。
效率高。 索引列越多,通過索引篩選出的數據越少。有1000W條數據的表,有如下sql:select from table where col1=1 and col2=2 and col3=3,假設假設每個條件可以篩選出10%的數據,如果只有單值索引,那麼通過該索引能篩選出1000W10%=100w條數據,然後再回表從100w條數據中找到符合col2=2 and col3= 3的數據,然後再排序,再分頁;如果是聯合索引,通過索引篩選出1000w10% 10% *10%=1w。
在模糊搜索中很有效,搜索全文中的某一個欄位,可以參考這篇博文
: https://zhuanlan.hu.com/p/88275060
我們先進行下面一個實驗看看InnoDB下的主鍵索引的一個現象。
查看:
我們插入進去的時候,數據的id都是亂序的,為什麼這里最後select查詢出來的結果都是進行了排序?
這是因為InnoDB索引底層實現的是B+tree,B+tree具有下列的特點:
所以上面的排序是為了使用B+tree的結構 ,B+tree為了范圍搜索,將主鍵按照從小到大排序後,拆分成節點。後續還有新的節點進入的時候,和B-tree相同的操作,會進行分裂。
一般來說,聚簇索引的B+tree都是三層
InnoDB中主鍵索引一定是聚簇索引,聚簇索引一定是主鍵索引。
為什麼這里輔助索引葉子結點不直接存儲數據呢?
MYISAM只有非聚簇索引,索引最終指向的都是物理地址。
Q:既然有回表的存在,那麼聚簇索引的優勢在哪裡?
Q:主鍵索引作為聚簇索引需要注意什麼
在查詢語句中使用LIke關鍵字進行查詢時,如果匹配字元串的第一個字元為"%",索引不會使用。如果「%」不是在第一位,索引就會使用
多列索引是在表的多個欄位上創建的索引,滿足最左前綴匹配原則,索引才會被使用
查詢語句只有Or關鍵字時候,如果OR前後的兩個條件都是索引,這這次查詢將會使用索引,否則Or前後有一個條件的列不是索引,那麼查詢中將不使用索引
H. 關於SQLSERVER的索引
這要看你的數據如何規劃,訪問時主要以什麼方式。
如果主要是以varchar列進行查詢,就按varchar列建立聚集索引,按int列建立非聚集索引。
如果主要是按int列進行排序查詢,就按int列建立聚集索引,按varchar列建立非聚集索引。
(注意上面說的int列不是主鍵,是你用來排序的列。)
配置資料庫索引是門很高深的學問,有興趣的話可以多搜索下相關資料。我都只是一知半解呢:)
I. SQLserver.點擊哪裡看索引哪裡的圖標
在企業管理器和查詢分析器裡面都可以看到索引,也可以用語句實現,在左邊的查詢分析器展開表
裡面你就會看到列,索引,約束等等,然後打開索引,在相應索引上點右鍵編輯就可以了
J. 如何在SQLSERVER中查看索引缺失
從SQL2005以後,在SQLSERVER對任何一句語句做編譯的時候,都會去評估一下,
這句話是不是缺少什麼索引的支持,如果他認為是,他還會預估,如果有這麽一個索引
他的性能能提高多少
SQLSERVER有幾個動態管理視圖
sys.dm_db_missing_index_details
sys.dm_db_missing_index_groups
sys.dm_db_missing_index_group_stats
sys.dm_db_missing_index_columns(index_handle)