① 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操作)的列上建立索引,如果待排序的列有多個,可以在這些列上建立組合索引。
② SqlServer:索引是什麼,以及為什麼使用索引
收藏
問題反饋
索引
索引,使用索引可快速訪問資料庫表中的特定信息。索引是對資料庫表中一列或多列的值進行排序的一種結構。 在關系資料庫中,索引是一種與表有關的資料庫結構,它可以使對應於表的SQL語句執行得更快。索引的作用相當於圖書的目錄,可以根據目錄中的頁碼快速找到所需的內容。當表中有大量記錄時,若要對表進行查詢,第一種搜索信息方式是全表搜索,是將所有記錄一一取出,和查詢條件進行一一對比,然後返回滿足條件的記錄,這樣做會消耗大量資料庫系統時間,並造成大量磁碟I/O操作;第二種就是在表中建立索引,然後在索引中找到符合查詢條件的索引值,最後通過保存在索引中的ROWID(相當於頁碼)快速找到表中對應的記錄。 索引是一個單獨的、物理的資料庫結構,它是某個表中一列或若干列值的集合和相應的指向表中物理標識這些值的數據頁的邏輯指針清單。 索引提供指向存儲在表的指定列中的數據值的指針,然後根據您指定的排序順序對這些指針排序。資料庫使用索引的方式與您使用書籍中的索引的方式很相似:它搜索索引以找到特定值,然後順指針找到包含該值的行。 在資料庫關系圖中,可以在選定表的「索引/鍵」屬性頁中創建、編輯或刪除每個索引類型。當保存索引所附加到的表,或保存該表所在的關系圖時,索引將保存在資料庫中。
③ 關於SQLSERVER的索引
這要看你的數據如何規劃,訪問時主要以什麼方式。
如果主要是以varchar列進行查詢,就按varchar列建立聚集索引,按int列建立非聚集索引。
如果主要是按int列進行排序查詢,就按int列建立聚集索引,按varchar列建立非聚集索引。
(注意上面說的int列不是主鍵,是你用來排序的列。)
配置資料庫索引是門很高深的學問,有興趣的話可以多搜索下相關資料。我都只是一知半解呢:)
④ sqlserver 索引
索引和主鍵有什麼關系:主鍵是唯一且非空欄位,且主鍵本身就是個索引,所以無需對主鍵欄位再建索引
select * from 表名 這樣的語句用不到索引,索引其實類似於書的目錄,你要查的是整個表,所以這目錄就起不到作用
select * from 表名 where 欄位 = 條件 如果這時候這個欄位上有索引,這時一般是會用到索引的,就像你要從一本書中找某個內容,翻目錄找到對應的頁號,直接翻到這頁就可以了
select * from 表名 order by 欄位 如果這個欄位是有索引的,那麼會用這個索引來查找數據,因為按索引查詢會比冒泡類演算法效率高(沒索引的情況下,就是把整表數據取出來,然後用冒泡類演算法排除順序的)
表格設置索引了和沒設置索引查詢的效率會有不同么?:
查詢效率的不同主要就是資料庫系統分析你的sql語句後定出的執行路徑,如果這個執行路徑可以用到你建的索引,那麼基本上效率就會比全表掃描來的快
還是那個舉例,一本書,有目錄頁,你查東西的時候是塊了還是慢了?
⑤ sqlserver 怎麼建索引
語法:
CREATE [索引類型] INDEX 索引名稱
ON 表名(列名)
WITH FILLFACTOR = 填充因子值0~100
GO
/*實例*/
USE 庫名
GO
IF EXISTS (SELECT * FROM SYSINDEXES WHERE NAME='IX_TEST_TNAME')--檢測是否已經存在IX_TEST_TNAME索引
DROP INDEX TEST.IX_TEST_TNAME--如果存在則刪除
--創建索引
CREATE NONCLUSTERED INDEX IX_TEST_TNAME --創建一個非聚集索引
ON TEST(TNAME) --為TEST表的TNAME欄位創建索引
WITH FILLFACTOR = 30 --填充因子為30%
GO
附錄:
1.什麼是索引:資料庫中的索引是某個表中一列或多列值的集合和相應的指向表中物理標識這些值的數據頁的邏輯指針清單。
2.分類:
唯一索引(UNIQUE):不允許兩行具有相同的索引值(創建了唯一約束,系統將自動創建唯一索引)
主鍵索引:主鍵索引要求主鍵中的每個值是唯一的,(創建主鍵自動創建主鍵索引)
聚集索引(CLUSTERED):表中各行的物理順序與鍵值的邏輯(索引)順序相同,表中只能包含一個聚集索引,主鍵列默認為聚集索引
非聚集索引(NONCLUSTERED):表中各行的物理順序與鍵值的邏輯(索引)順序不匹配,表中可以有249個非聚集索引
3.創建索引的標准:用語頻繁搜索的列;用語對數據進行排序的列
⑥ 關於SqlServer索引問題
要不要建索引,首先要看你的數據量如何,如果數據量不大,就沒有必要建立索引了,因為作用不大,還增加了索引的維護工作。
另外所謂根據select語句建立索引,就是對你經常查詢的列來建立索引,如果你建立了一個索引,可是在你的select語句中很少用到這個索引,那就沒有必要了。具體方法是看你的select語句中的where子句條件是針對哪個欄位的,就對這個欄位建立索引。
⑦ sqlserver 怎麼建索引
表的主關鍵字自動建立唯一索引
select * from Ad_Meter
直接條件查詢的欄位
Ad_Meter 表中 作為條件查詢的 S_ip
select * from Ad_Meter where S_Ip='314111963400'
查詢中與其它表關聯的欄位
Ad_Meter 表的SYSID_Floor
select * from Ad_Meter m inner join Ad_Floor f on M.SYSID_Floor=f.SYSID_Floor
查詢中排序的欄位
Ad_Meter 的 s_ip ,按s_ip的倒序查詢
select * from Ad_Meter order by S_Ip desc
查詢中統計或分組統計的欄位
select MAX(SYSID_Floor) from Ad_Meter
select S_Ip ,COUNT (*) from Ad_Meter group by S_Ip
6
步驟二:直接條件查詢的欄位
select * from Ad_Meter where S_Ip='314111963400'
舉例建一個索引。
找到有添加索引的表 Ad_Meter,展開找到 索引,右鍵--》新建--》添加選擇作為索引的欄位--》確定
⑧ 在SQLServer中使用索引的技巧
在SQL Server中 為了查詢性能的優化 有時我們就需要對數據表通過建立索引的方式 目的主要是根據查詢要求 迅速縮小查詢范圍 避免全表掃描
索引有兩種類型 分別是聚集索引(clustered index 也稱聚類索引 簇集索引)和非聚集索引(nonclustered index 也稱非聚類索引 非簇集索引)
聚集索引在一個表中只能有一個 默認情況下在主鍵建立的時候創建 它是規定數據在表中的物理存儲順序 我們也可以取消主鍵的聚集索引 所以必須考慮資料庫可能用到的查詢類型以及使用的最為頻繁的查詢類型 對其最常用的一個欄位或者多個欄位建立聚集索引或者組合的聚集索引 它就是SQL Server會在物理上按升序(默認)或者降序重排數據列 這樣就可以迅速的找到被查詢的數據
非聚集索主要是數據存儲在一個地方 索引存儲在另一個地方 索引帶有指針指向數據的存儲位置 索引中的項目按索引鍵值的順序存儲 而表中的信息按另一種順序存儲 可以在一個表格中使用高達 個非聚集的索引 在查詢的過程中先對非聚集索引進行搜索 找到數據值在表中的位置 然後從該位置直接檢索數據 這使非聚集索引成為精確匹配查詢的最佳方法 因為索引包含描述查詢所搜索的數據值在表中的精確位置的條目
所以我們在選擇創建聚集索引的時候要注意以下幾個方面
) 對表建立主鍵時 就會為主鍵自動添加了聚集索引 如自動編號欄位 而我們沒有必要把聚集索引浪費在主鍵上 除非你只按主鍵查詢 所以會把聚集索引設置在按條件查詢頻率最高的那個欄位或者組合的欄位
) 索引的建立要根據實際應用的需求來進行 並非是在任何欄位上建立索引就能提高查詢速度 聚集索引建立遵循下面幾個原則
包含大量非重復值的列
使用下列運算符返回一個范圍值的查詢 BEEEN > >= < 和 <=
被連續訪問的列
返回大型結果集的查詢
經常被使用聯接或 GROUP BY 子句的查詢訪問的列;一般來說 這些是外鍵列 對ORDER BY 或 GROUP BY 子句中指定的列進行索引 可以使 SQL Server 不必對數據進行排序 因為這些行已經排序 這樣可以提高查詢性能
OLTP 類型的應用程序 這些程序要求進行非常快速的單行查找(一般通過主鍵) 應在主鍵上創建聚集索引
舉例來說 銀行交易日誌中對交易日期建立聚合索引 數據物理上按順序存於數據頁上 重復值也排列在一起 因而在范圍查找時 可以先找到這個范圍的起末點 且只在這個范圍內掃描數據頁 避免了大范圍掃描 提高了查詢速度 而如果我們對員工的基本信息表中性別的欄位列上建立聚集索引 就完全沒有必要 因為內容里只涉及到 男 與 女 兩個不同值
) 在聚集索引中按常用的組合欄位建立索引 形成復合索引 一般在為表建立多個主鍵的時候就會產生 如果一個表中的數據在查詢時有多個欄位總是同時出現則這些欄位就可以作為復合索引 這樣能形成索引覆蓋 提高where語句的查詢效率
)索引對查詢有一這的優化 但由於改變一個表的內容 將會引起索引的變化 頻繁的對數據操作如insert update delete語句將導致系統花費較大的代價進行索引更新 引起整體性能的下降 一般來講 在對查詢性能的要求高於對數據維護性能要求時 應該盡量使用索引 有時在這種操作資料庫比較頻繁的某些極端情況下 可先刪除索引 再對資料庫表更新大量數據 最後再重建索引 新建立的索引總是比較好用
索引在使用了長久的時候 就會產生很多的碎片 查詢的性能就會受到影響 這時候有兩種方法解決 一是利用DBCC INDEXDEFRAG整理索引碎片 還有就是利用DBCC DBREINDEX重建索引
DBCC INDEXDEFRAG 命令是聯機操作 所以索引只有在該命令正在運行時才可用 而且可以在不丟失已完成工作的情況下中斷該操作 這種方法的缺點是在重新組織數據方面沒有聚集索引的除去/重新創建操作有效
重新創建聚集索引將對數據進行重新組織 其結果是使數據頁填滿 填滿程度可以使用 FILLFACTOR 選項進行配置 這種方法的缺點是索引在除去/重新創建周期內為離線狀態 並且操作屬原子級 如果中斷索引創建 則不會重新創建該索引
我們來看看索引重建使用的方法
語法 DBCC DBREINDEX ( [ TableName [ index_name [ fillfactor ] ] ] )
參數 TableName
是要重建其指定的索引的表名 資料庫 所有者和表名必須符合標識符的規則 有關更多信息 請參見使用標識符 如果提供 database 或 owner 部分 則必須使用單引號 ( )
將整個 database owner table_name 括起來 如果只指定 table_name 則不需要單引號
index_name 是要重建的索引名 索引名必須符合標識符的規則 如果未指定 index_name 或指定為 就要對表的所有索引進行重建
fillfactor 是創建索引時每個索引頁上要用於存儲數據的空間百分比 fillfactor替換起始填充因子以作為索引或任何其它重建的非聚集索引(因為已重建聚集索引)的新默認值 如果 fillfactor 為 DBCC DBREINDEX 在創建索引時將使用指定的起始fillfactor
我們在查詢分析器中輸入如下的命令
DBCC DBREINDEX ( MyTable )
lishixin/Article/program/SQLServer/201311/22210
⑨ SQLSERVER對索引的利用及非SARG運算符認識
寫SQL語句的時候很多時候會用到filter篩選掉一些記錄,SQL對篩選條件簡稱:SARG(search
argument/SARG)
復制代碼
代碼如下:
where
amount>4000
and
amount<6000上面這句就是篩選條件
當然這里不是說SQLSERVER的where子句,是說SQLSERVER對索引的利用在SQLSERVER對於沒有SARG運算符的表達式,索引是沒有用的,SQLSERVER對它們很難使用比較優化的做法。
意思是說,如果你的SQL語句中沒有where子句包括非SARG運算符,那麼你的SQL語句是不會用到表格中的索引的
下面說一下哪些是非SARG運算符:
非SARG運算符包括
NOT、
<>、
NOT
EXISTS、
NOT
IN、
NOT
LIKE
規律就是有「NOT」
關鍵字
或者
不等於的意思
基本上利用不了索引
還有一些內部函數,如果使用這些內部函數SQLSERVER也不會用到索引
內部函數,例如:CONVERT(),UPPER()等