久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

數據庫SQL調優的方式有哪些

125次閱讀
沒有評論

共計 2356 個字符,預計需要花費 6 分鐘才能閱讀完成。

自動寫代碼機器人,免費開通

丸趣 TV 小編給大家分享一下數據庫 SQL 調優的方式有哪些,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

方式:1、創建索引時,盡量避免全表掃描;2、避免在索引上使用計算;3、盡量使用參數化 SQL;4、盡量將多條 SQL 語句壓縮到一句 SQL 中;5、用 where 字句替換 HAVING 字句;6、連接多個表時,使用表的別名;7、盡量避免使用游標等等。

本教程操作環境:windows7 系統、mysql8 版本、Dell G3 電腦。

一. 創建索引

1、要盡量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引

2、(1) 在經常需要進行檢索的字段上創建索引,比如要按照表字段 username 進行檢索,那么就應該在姓名字段上創建索引,如果經常要按照員工部門和員工崗位級別進行檢索,那么就應該在員工部門和員工崗位級別這兩個字段上創建索引。

(2) 創建索引給檢索帶來的性能提升往往是巨大的,因此在發現檢索速度過慢的時候應該首先想到的就是創建索引。

(3) 一個表的索引數最好不要超過 6 個,若太多則應考慮一些不常使用到的列上建的索引是否有 必要。索引并不是越多越好,索引固然可以提高相應的 select 的效率,但同時也降低了 insert 及 update 的效率,因為 insert 或 update 時有可能會重建索引,所以怎樣建索引需要慎重考慮,視具體情況而定。

二. 避免在索引上使用計算

在 where 字句中,如果索引列是計算或者函數的一部分,DBMS 的優化器將不會使用索引而使用全表查詢, 函數
屬于計算的一種, 同時在 in 和 exists 中通常情況下使用 EXISTS,因為 in 不走索引
效率低:

 select * from user where salary*22 11000(salary 是索引列)

效率高:

 select * from user where salary 11000/22(salary 是索引列)

三. 使用預編譯查詢

程序中通常是根據用戶的輸入來動態執行 SQL,這時應該盡量使用參數化 SQL,這樣不僅可以避免 SQL 注入漏洞

攻擊,最重要數據庫會對這些參數化 SQL 進行預編譯,這樣第一次執行的時候 DBMS 會為這個 SQL 語句進行查詢優化

并且執行預編譯,這樣以后再執行這個 SQL 的時候就直接使用預編譯的結果,這樣可以大大提高執行的速度。

四. 盡量將多條 SQL 語句壓縮到一句 SQL 中

每次執行 SQL 的時候都要建立網絡連接、進行權限校驗、進行 SQL 語句的查詢優化、發送執行結果,這個過程
是非常耗時的,因此應該盡量避免過多的執行 SQL 語句,能夠壓縮到一句 SQL 執行的語句就不要用多條來執行。

五. 用 where 字句替換 HAVING 字句

避免使用 HAVING 字句,因為 HAVING 只會在檢索出所有記錄之后才對結果集進行過濾,而 where 則是在聚合前
刷選記錄,如果能通過 where 字句限制記錄的數目,那就能減少這方面的開銷。HAVING 中的條件一般用于聚合函數
的過濾,除此之外,應該將條件寫在 where 字句中。

六. 使用表的別名

當在 SQL 語句中連接多個表時,請使用表的別名并把別名前綴于每個列名上。這樣就可以減少解析的時間并減
少哪些友列名歧義引起的語法錯誤。

七. 用 union all 替換 union

當 SQL 語句需要 union 兩個查詢結果集合時,即使檢索結果中不會有重復的記錄,如果使用 union 這兩個結果集
同樣會嘗試進行合并,然后在輸出最終結果前進行排序,因此如果可以判斷檢索結果中不會有重復的記錄時候,應
該用 union all,這樣效率就會因此得到提高。

八. 考慮使用“臨時表”暫存中間結果

簡化 SQL 語句的重要方法就是采用臨時表暫存中間結果,但是,臨時表的好處遠遠不止這些,將臨時結果暫存在臨時表,后面的查詢就在 tempdb 中了,這可以避免程序中多次掃描主表,也大大減少了程序執行中“共享鎖”阻塞“更新鎖”,減少了阻塞,提高了并發性能。
但是也得避免頻繁創建和刪除臨時表,以減少系統表資源的消耗。

九. 只在必要的情況下才使用事務 begin translation

SQL Server 中一句 SQL 語句默認就是一個事務,在該語句執行完成后也是默認 commit 的。其實,這就是 begin tran 的一個最小化的形式,好比在每句語句開頭隱含了一個 begin tran,結束時隱含了一個 commit。
有些情況下,我們需要顯式聲明 begin tran,比如做“插、刪、改”操作需要同時修改幾個表,要求要么幾個表都修改成功,要么都不成功。begin tran 可以起到這樣的作用,它可以把若干 SQL 語句套在一起執行,最后再一起 commit。好處是保證了數據的一致性,但任何事情都不是完美無缺的。Begin tran 付出的代價是在提交之前,所有 SQL 語句鎖住的資源都不能釋放,直到 commit 掉。
可見,如果 Begin tran 套住的 SQL 語句太多,那數據庫的性能就糟糕了。在該大事務提交之前,必然會阻塞別的語句,造成 block 很多。
Begin tran 使用的原則是,在保證數據一致性的前提下,begin tran 套住的 SQL 語句越少越好!有些情況下可以采用觸發器同步數據,不一定要用 begin tran。

十. 盡量避免使用游標

盡量避免向客戶端返回大數據量,若數據量過大,應該考慮相應需求是否合理。因為游標的效率較差,如果游標操作的數據超過 1 萬行,那么就應該考慮改寫。

十一. 用 varchar/nvarchar 代替 char/nchar

以上是“數據庫 SQL 調優的方式有哪些”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注丸趣 TV 行業資訊頻道!

向 AI 問一下細節

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-12-04發表,共計2356字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 麟游县| 焦作市| 济南市| 新竹县| 万年县| 堆龙德庆县| 清徐县| 肥东县| 静安区| 双辽市| 德江县| 邓州市| 彭水| 县级市| 忻城县| 建湖县| 太白县| 宁夏| 宜川县| 南城县| 会理县| 弥渡县| 中阳县| 郸城县| 凯里市| 阳新县| 德阳市| 黄大仙区| 黔南| 本溪市| 阜新市| 谢通门县| 公安县| 临海市| 东港市| 中西区| 渝中区| 东乡县| 武定县| 衡阳县| 四平市|