sql中的大資料量資料提速(二)

2021-05-22 19:28:18 字數 3313 閱讀 4480

資料庫優化--使用索引優化儲存過程

現有資料庫中有乙個儲存過程的查詢時間為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欄位

(二)建立索引以提高查詢速度,以下索引是使用「資料庫引擎優化顧問」生成了相應的索引,然後根據實際情況進行選擇或增減

create nonclustered index [index_monthunitstock_7_1585037028__k1_k2_k3_k5_7] on [dbo].[monthunitstock]

([g_no] asc,

[co_no] asc,

[si_no] asc,

[area_no] asc

)with (pad_index  = off, statistics_norecompute  = off, sort_in_tempdb = off

, ignore_dup_key = off, drop_existing = off, online = off, allow_row_locks  = on, allow_page_locks  = on) on [primary]

gocreate nonclustered index [index_unitcost_g_co_si_cost] on [dbo].[unitcost]

([g_no] asc,

[si_no] asc,

[co_no] asc

)include ( [cost]) with (pad_index  = off, statistics_norecompute  = off, sort_in_tempdb = off,

ignore_dup_key = off, drop_existing = off, online = off, allow_row_locks  = on, allow_page_locks  = on) on [primary]

gocreate nonclustered index [index_goods_7_626621821__k2_k13] on [dbo].[goods]

([g_no] asc,

[gc_name2] asc

)with (pad_index  = off, statistics_norecompute  = off, sort_in_tempdb = off, ignore_dup_key = off,

drop_existing = off, online = off, allow_row_locks  = on, allow_page_locks  = on) on [primary]

go

sql中的大資料量資料提速

最近做個專案接近千萬條資料,對資料的讀取速度,要求比較高。對此作了乙個簡單的總結。1.sql語句書寫的我們應該注意,盡量少使用in or 和虛擬表。也有高人說,盡量多使用臨時表能夠減少磁碟的i o操作,這個還有待驗證 2.建立索引,通常我們會把,聚集索引建立在使用多,但出現少的字段上。例如 時間 3...

大資料量演算法

給40億個不重複的unsigned int的整數,沒排過序的,然後再給乙個數,如何快速判斷這個數是否在那40億個數當中 位圖思想解法 include stdio.h include stdlib.h include memory.h define max num 4294967295 int mai...

大資料量處理

看看這個,異曲同工,永遠不超時 該程式是針對非常龐大的資料庫開發的,沒有用迴圈 用途 對過萬條資料的資料庫字段內容批量替換 資料庫連線 dim beeyee dbname,connstr,conn,intsn1 dim content,num,intsn,intidno,strcodea,strco...