資料庫優化--使用索引優化儲存過程
現有資料庫中有乙個儲存過程的查詢時間為25s,最大的乙個表的資料記錄在70-80萬條記錄,感覺還有潛力可以挖掘。
經過一系列的優化最後,這個儲存過程的執行時間為3s-4s。下面就講講此次優化的過程。
首先是要講一下,這次主要使用到了索引這乙個工具。先說一下索引。
一、聚集索引基於資料行的鍵值在表內排序和儲存這些資料行。每個表只能有乙個聚集索引,因為資料行本身只能按乙個順序儲存。
對錶中的什麼樣的列來定義聚集索引呢,有以下三個原則:
1)可用於經常使用的查詢。
2)提供高度唯一性。
3)可用於範圍查詢。
定義聚集索引的列需要注意的事項:
1)定義聚集索引鍵時使用的列越少越好。考慮具有下列乙個或多個屬性的列:
2)唯一或包含許多不重複的值
3)按順序被訪問
4)經常用於對錶中檢索到的資料進行排序。
5)按該列對錶進行聚集(即物理排序)是乙個好方法,它可以在每次查詢該列時節省排序操作的成本。
聚集索引不適用於具有下列屬性的列:
1)頻繁更改的列
二、非聚集索引包含索引鍵值和指向表資料儲存位置的行定位器。
可以對錶或索引檢視建立多個非聚集索引。通常,設計非聚集索引是為改善經常使用的、沒有建立聚集索引的查詢的效能。
與使用新華字典的方式相似,查詢優化器在搜尋資料值時,先搜尋非聚集索引以找到資料值在表中的位置,然後直接從該位置檢索資料。
這使非聚集索引成為完全匹配查詢的最佳選擇,因為索引包含說明查詢所搜尋的資料值在表中的精確位置的項。
定義非聚集索引時需要注注意事項:
1) 更新要求較低但包含大量資料的資料庫或表可以從許多非聚集索引中獲益從而改善查詢效能。
2) 聯機事務處理應用程式和包含大量更新表的資料庫應避免使用過多的索引。
3) 索引應該是窄的,即列越少越好。
在建立非聚集索引之前,應先了解訪問資料的方式。考慮對具有以下屬性的查詢使用非聚集索引:
1) 使用 join 或 group by 子句。
2) 應為聯接和分組操作中所涉及的列建立多個非聚集索引,為任何外來鍵列建立乙個聚集索引。
3) 不返回大型結果集的查詢。
4) 包含經常包含在查詢的搜尋條件(例如返回完全匹配的 where 子句)中的列。
注意:索引不是越多越好,任何東西都有個度。
乙個表如果建有大量索引會影響 insert、update 和 delete 語句的效能,因為所有索引都必須隨錶中資料的更改進行相應的調整。
三、下面我們來看乙個例項
(一)----1建立臨時表
---分析一下這條sql語句,符合上面建立非聚集索引來提高查詢效能的情況。見上面1)與4)
---此sql中使用到了monthunitstock表,goods表,unitcost表,其中表monthunitstock的資料最多,而且要與unitcos進行聯接
---monthunitstock與unitcost表的聯接條件有三個g_no,co_no,si_no同時使用到了monthunitstock表中的qty欄位與unitcost表中的cost欄位
(二)建立索引以提高查詢速度,以下索引是使用「資料庫引擎優化顧問」生成了相應的索引,然後根據實際情況進行選擇或增減
-----1。現在來分析這一段sql語句,問題出在什麼地方呢?
-----2. 首先看一下面的sql語句,即2)這一部分,這部分在sql中執行時間為9s-10s,那麼能不能優化呢?
----- 這2)這部分的sql,符合上面建立非聚集索引來提高查詢效能的情況。見上面1)與4)
----- 我們仔細看一下這段sql,發現他的查詢條件為小於輸入的引數日期,與數量不為0,而且這兩個查詢條件都是表
----- c_inoutdetail中的,而且這張表中在進行聯接是還會用到g_no,co_no,si_no,那麼在這些欄位上建立索引,結果
----- 會如何,見下面的sql語句。結果相當不錯,時間縮短到了2s左右.
(四)建立索引以提高查詢速度,以下索引是使用「資料庫引擎優化顧問」生成了相應的索引,然後根據實際情況進行選擇或增減
/*create clustered index [index_c_inoutdetail_c_7_453381180__k6_k7_k8_k5_k9_k3] on [dbo].[c_inoutdetail]
([g_no] asc,
[co_no] asc,
[si_no] asc,
[thedate] asc,
[qty] asc,
[shp_name] asc
)with (sort_in_tempdb = off, ignore_dup_key = off, drop_existing = off, online = off) on [primary]
*/............
set nocount off
五、 最終通過一系統的索引建立,把這個儲存過程的執行時間由25s縮減到3s-4s
最後記錄一點,以備查:查詢中多用exists,少用 in 以提高查詢速度
exists只檢查存在性,效能比in強很多,有些朋友不會用exists,就舉個例子
例,想要得到有**號碼的人的基本資訊,table2有冗餘資訊
select * from table1;--(id,name,age)
select * from table2;--(id,phone)
in:
select * from table1 t1 where t1.id in (select t2.id from table2 t2 where t1.id=t2.id);
exists:
select * from table1 t1 where exists (select 1 from table2 t2 where t1.id=t2.id);
*/在sql 2005及2008中有二個工具(sql server profilter與資料庫引擎優化顧問)是非常實用的,具體介紹見:
資料庫優化方法 (一)
資料庫優化方法(二)
資料庫優化方法(三)
資料庫 儲存過程 索引 優化概念
mysql儲存過程是一組為了完成特定功能的 sql語句集,經過編譯之後儲存在資料庫中,當需要使用該組 sql語句時使用者只需要通過指定儲存過程的名字並給定引數就可以呼叫執行它了,簡而言之就是一組已經寫好的命令,需要使用的時候拿出來用就可以了。因為是提前寫好的,所以執行速度相對於批處理要快 可以多次被...
資料庫索引 索引優化
二 三星索引 三 合適設計理想索引 謂詞簡單謂詞和複雜謂詞 where字句中的每個條件稱為乙個謂詞。過濾因子 描述了謂詞的選擇性,即表中滿足謂詞條件的記錄行數所佔的比例 過濾因子 ff 結果集的數量 錶行的數量 平均過濾因子 1 不同列值的數量 索引片及匹配列 乙個索引定義乙個索引片,如果where...
資料庫優化 索引
鑑於csdn無故刪除博文,本部落格不再更新,暫時遷至 2索引每一本書的前幾頁一般都是目錄,而最後幾頁通常會有乙個關鍵字索引。對於資料庫來講系統表 如 sysobjects等 就是目錄,而標字段上的索引就如同書本後面的關鍵字索引。資料庫中,目錄 資料字典 和索引的區別 目錄縱向 索引橫向。優化器根據統...