91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2021-04-25 09:29:40 來源:億速云 閱讀:236 作者:小新 欄目:MySQL數據庫

小編給大家分享一下數據庫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調優的方式有哪些”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

县级市| 镇原县| 东明县| 泰宁县| 大冶市| 怀宁县| 太和县| 崇礼县| 威宁| 渝北区| 谷城县| 富锦市| 屏边| 榆树市| 陆川县| 报价| 湘阴县| 南充市| 尚志市| 平果县| 贵阳市| 九龙城区| 天长市| 钦州市| 阳山县| 贺兰县| 华池县| 大兴区| 灯塔市| 紫云| 习水县| 尉氏县| 龙门县| 泰来县| 介休市| 桃园县| 新乡县| 永济市| 宁明县| 巴林左旗| 江华|