国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

如何創建索引

2024-07-21 02:47:52
字體:
來源:轉載
供稿:網友
如何創建索引

通過前面二篇文章我們基本學會了如何結合執行計劃分析出某Sql語句的性能問題,既然有性能問題的地方已經找到了,接下來就是如何優化查詢來提高查詢性能,而優化查詢最重要的武器就是創建索引,這篇文章就來總結如何創建索引來提高查詢速度,主要從以下幾個方面來總結。

  1. 了解索引
  2. 創建索引的語法
  3. 結合實例演示如何創建索引
了解索引

  1,索引是什么?

    在Sql Server中,索引是一種增強式的存在,這表示即使沒有索引,Sql Server的功能并不會受到影響。索引是對數據庫表中一列或多列的值進行排序的一種結構(B樹),使用索引可快速訪問數據庫表中的特定信息。

  2,為什么要使用索引?

    就是提高查詢性能。

  3,有哪些索引?

    主要分為聚集索引(CLUSTERED INDEX)和非聚集索引(NONCLUSTERED INDEX)兩種,聚集索引指的是一列或多列的物理順序和邏輯順序是一致的,一個數據庫表只能有一個聚集索引,我們通常將主鍵(一般為自增int型)設為聚集索引。而非聚集索引則可以有多個,而且非聚集索引并不會改變數據庫表的物理結構。

創建索引的語法

  1,創建索引,sql語法如下。  

-- 建立索引IF NOT EXISTS (SELECT * FROM sysindexes WHERE id=OBJECT_ID('Sales.Orders') AND name='idx_nc_orderdate')    CREATE NONCLUSTERED INDEX idx_nc_orderdate ON Sales.Orders(orderdate);GO

  2,刪除索引,sql語法如下。

-- 刪除索引IF EXISTS (SELECT * FROM sysindexes WHERE id=OBJECT_ID('Sales.Orders') AND name='idx_nc_orderdate')    DROP INDEX idx_nc_orderdate ON Sales.Orders;GO
結合實例演示如何創建索引

  表結構如下:

  現在的需求是,查詢2006年7月1日到2007年7月31日的所有訂單,并按requireddate字段排序,查詢sql代碼如下:

USE TSQLFundamentals2008;GO-- 查詢2006年7月1日到2007年7月31日的所有訂單,并按requireddate字段排序SELECT orderid,orderdate,requireddate,shippeddate,shipname,shipaddress FROM Sales.OrdersWHERE orderdate>='20060701' AND orderdate<'20070801'ORDER BY requireddate;

  注意,這個表只有主鍵orderid的聚集索引外,沒有建立任何索引。執行查詢查看執行計劃,如下圖。

  從上面的執行計劃可以看出,在排序和聚集索引查找方面比較耗時。首先看排序,因為是byrequireddate排序的,所以對requireddate字段要建立單個字段索引,代碼如下。

IF NOT EXISTS (SELECT * FROM sysindexes WHERE id=OBJECT_ID('Sales.Orders') AND name='idx_nc_requireddate')    CREATE NONCLUSTERED INDEX idx_nc_requireddate ON Sales.Orders(requireddate);GO

  然后因為where條件中是按orderdate字段來限定范圍的,所以對orderdate字段要建立單個字段索引,代碼如下。

IF NOT EXISTS (SELECT * FROM sysindexes WHERE id=OBJECT_ID('Sales.Orders') AND name='idx_nc_orderdate')    CREATE NONCLUSTERED INDEX idx_nc_orderdate ON Sales.Orders(orderdate);GO

  因為要查詢的字段為orderid,orderdate,requireddate,shippeddate,shipname,shipaddress,所以我們可以針對這幾個字段建立一個組合字段索引,代碼如下。

IF NOT EXISTS (SELECT * FROM sysindexes WHERE id=OBJECT_ID('Sales.Orders') AND name='idx_orders_orderid_orderdate_shipaddress')    CREATE NONCLUSTERED INDEX idx_orders_orderid_orderdate_shipaddress ON Sales.Orders(orderid,orderdate,requireddate,shippeddate,shipname,shipaddress);GO

  最后,我們再重新運行一次查詢,查看執行計劃,如下圖。

  從執行計劃中可以看到,后面那個已經變成了非聚集索引查詢了,說明我們創建的索引起作用了。具體是創建單個字段索引,組合字段索引還是兩個都要創建,這個要在實際的項目中反復試驗。

參考資料

1,CareySon的T-SQL查詢進階--理解SQL Server中索引的概念,原理以及其他

2,田園里的蟋蟀的程序員眼中的 SQL Server-執行計劃教會我如何創建索引?


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 鹤庆县| 汤原县| 定结县| 内丘县| 如皋市| 淮北市| 通州区| 天峻县| 会昌县| 松潘县| 寻甸| 泽普县| 离岛区| 沧州市| 儋州市| 贺州市| 江达县| 随州市| 仪征市| 通河县| 育儿| 肇东市| 黄龙县| 临海市| 栾川县| 泌阳县| 西乌珠穆沁旗| 定南县| 天台县| 琼中| 绿春县| 兴海县| 沅陵县| 铜川市| 和政县| 麻城市| 寿宁县| 宜章县| 常熟市| 乌拉特前旗| 武邑县|