衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

30種SQL語句優化方法

數據分析與開發 ? 來源:數據分析與開發 ? 作者:CSDN-青春微涼不離 ? 2020-11-19 16:05 ? 次閱讀

在SQL查詢中為了提高查詢效率,我們常常會采取一些措施對查詢語句進行SQL優化,下面總結一些方法,供大家參考。

01

對查詢進行優化,應盡量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引

02

應盡量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描。

03

應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如:

select id from t where num is null

可以在num上設置默認值0,確保表中num列沒有null值,然后這樣查詢:

select id from t where num=0

04

應盡量避免在 where 子句中使用 or 來連接條件,否則將導致引擎放棄使用索引而進行全表掃描,如:

select id from t where num=10 or num=20

可以這樣查詢:

selectidfromtwherenum=10unionallselect id from t where num=20

05

下面的查詢也將導致全表掃描:

selectidfromtwherenamelike'%abc%'

若要提高效率,可以考慮全文檢索。

06

in 和 not in 也要慎用,否則會導致全表掃描,如:

select id from t where num in(1,2,3)

對于連續的數值,能用 between 就不要用 in 了:

select id from t where num between 1 and 3

07

如果在 where 子句中使用參數,也會導致全表掃描。因為SQL只有在運行時才會解析局部變量,但優化程序不能將訪問計劃的選擇推遲到運行時;它必須在編譯時進行選擇。然而,如果在編譯時建立訪問計劃,變量的值還是未知的,因而無法作為索引選擇的輸入項。如下面語句將進行全表掃描:

select id from t where num=@num

可以改為強制查詢使用索引:

select id from t with(index(索引名)) where num=@num

08

應盡量避免在 where 子句中對字段進行表達式操作,這將導致引擎放棄使用索引而進行全表掃描。如:

select id from t where num/2=100

應改為:

selectidfromtwherenum=100*2

09

應盡量避免在where子句中對字段進行函數操作,這將導致引擎放棄使用索引而進行全表掃描。如:

select id from t where substring(name,1,3)='abc'--name以abc開頭的idselect id from t where datediff(day,createdate,'2005-11-30')=0--'2005-11-30'生成的id

應改為:

selectidfromtwherenamelike'abc%'select id from t where createdate>='2005-11-30' and createdate<'2005-12-1'

10

不要在 where 子句中的“=”左邊進行函數、算術運算或其他表達式運算,否則系統將不能正確使用索引。

11

在使用索引字段作為條件時,如果該索引是復合索引,那么必須使用到該索引中的第一個字段作為條件時才能保證系統使用該索引,否則該索引將不會被使用,并且應盡可能的讓字段順序與索引順序相一致。

12

不要寫一些沒有意義的查詢,如需要生成一個空表結構:

select col1,col2 into #t from t where 1=0

這類代碼不會返回任何結果集,但是會消耗系統資源的,應改成這樣:

create table #t(...)

13

很多時候用 exists 代替 in 是一個好的選擇:

select num from a where num in(select num from b)

用下面的語句替換:

selectnumfromawhereexists(select1frombwherenum=a.num)

14

并不是所有索引對查詢都有效,SQL是根據表中數據來進行查詢優化的,當索引列有大量數據重復時,SQL查詢可能不會去利用索引,如一表中有字段sex,male、female幾乎各一半,那么即使在sex上建了索引也對查詢效率起不了作用。

15

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

16

應盡可能的避免更新 clustered 索引數據列,因為 clustered 索引數據列的順序就是表記錄的物理存儲順序,一旦該列值改變將導致整個表記錄的順序的調整,會耗費相當大的資源。若應用系統需要頻繁更新 clustered 索引數據列,那么需要考慮是否應將該索引建為 clustered 索引。

17

盡量使用數字型字段,若只含數值信息的字段盡量不要設計為字符型,這會降低查詢和連接的性能,并會增加存儲開銷。這是因為引擎在處理查詢和連接時會逐個比較字符串中每一個字符,而對于數字型而言只需要比較一次就夠了。

18

盡可能的使用 varchar/nvarchar 代替 char/nchar ,因為首先變長字段存儲空間小,可以節省存儲空間,其次對于查詢來說,在一個相對較小的字段內搜索效率顯然要高些。

19

任何地方都不要使用 select * from t ,用具體的字段列表代替“*”,不要返回用不到的任何字段。

20

盡量使用表變量來代替臨時表。如果表變量包含大量數據,請注意索引非常有限(只有主鍵索引)。

21

避免頻繁創建和刪除臨時表,以減少系統表資源的消耗。

22

臨時表并不是不可使用,適當地使用它們可以使某些例程更有效,例如,當需要重復引用大型表或常用表中的某個數據集時。但是,對于一次性事件,最好使用導出表。

23

在新建臨時表時,如果一次性插入數據量很大,那么可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;如果數據量不大,為了緩和系統表的資源,應先create table,然后insert。

24

如果使用到了臨時表,在存儲過程的最后務必將所有的臨時表顯式刪除,先 truncate table ,然后 drop table ,這樣可以避免系統表的較長時間鎖定。

25

盡量避免使用游標,因為游標的效率較差,如果游標操作的數據超過1萬行,那么就應該考慮改寫。

26

使用基于游標的方法或臨時表方法之前,應先尋找基于集的解決方案來解決問題,基于集的方法通常更有效。

27

與臨時表一樣,游標并不是不可使用。對小型數據集使用 FAST_FORWARD 游標通常要優于其他逐行處理方法,尤其是在必須引用幾個表才能獲得所需的數據時。在結果集中包括“合計”的例程通常要比使用游標執行的速度快。如果開發時間允許,基于游標的方法和基于集的方法都可以嘗試一下,看哪一種方法的效果更好。

28

在所有的存儲過程和觸發器的開始處設置 SET NOCOUNT ON ,在結束時設置 SET NOCOUNT OFF 。無需在執行存儲過程和觸發器的每個語句后向客戶端發送 DONE_IN_PROC 消息。

29

盡量避免向客戶端返回大數據量,若數據量過大,應該考慮相應需求是否合理。

30

盡量避免大事務操作,提高系統并發能力。

責任編輯:xj

原文標題:30 種 SQL 語句優化,進階必備!

文章出處:【微信公眾號:數據分析與開發】歡迎添加關注!文章轉載請注明出處。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據庫
    +關注

    關注

    7

    文章

    3846

    瀏覽量

    64685
  • MySQL
    +關注

    關注

    1

    文章

    829

    瀏覽量

    26742
  • SQL語句
    +關注

    關注

    0

    文章

    19

    瀏覽量

    7076

原文標題:30 種 SQL 語句優化,進階必備!

文章出處:【微信號:DBDevs,微信公眾號:數據分析與開發】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    焊接技術流程優化方法

    焊接是現代制造業中不可或缺的一部分,廣泛應用于建筑、汽車、航空、船舶等領域。隨著科技的發展,對焊接技術的要求越來越高,優化焊接流程顯得尤為重要。 1. 焊接工藝的優化 1.1 選擇合適的焊接方法
    的頭像 發表于 01-19 13:52 ?352次閱讀

    Devart: dbForge Compare Bundle for SQL Server—比較SQL數據庫最簡單、最準確的方法

    ? dbForge Compare Bundle For SQL Server:包含兩個工具,可幫助您節省用于手動數據庫比較的 70% 的時間 dbForge數據比較 幫助檢測和分析實時SQL數據庫
    的頭像 發表于 01-17 11:35 ?138次閱讀

    dbForge Studio For SQL Server:用于有效開發的最佳SQL Server集成開發環境

    dbForge Studio For SQL Server:用于有效開發的最佳SQL Server集成開發環境 SQL編碼助手 SQL代碼分析 查詢分析器 可視化查詢生成器 數據和模式
    的頭像 發表于 01-16 10:36 ?110次閱讀

    淺談SQL優化小技巧

    作者:京東零售 王軍 回顧:MySQL的執行過程回顧 MySQL的執行過程,幫助 介紹 如何進行sql優化。 (1)客戶端發送一條查詢語句到服務器; (2)服務器先查詢緩存,如果命中緩存,則立即返回
    的頭像 發表于 12-25 09:59 ?580次閱讀

    不用編程不用電腦,快速實現多臺Modbus協議的PLC、智能儀表對接SQL數據庫

    的參數按照任務組自動生成SQL命令語句,實現多設備SQL命令與數據庫軟件對接,支持MySQL、SQLServer、PostgreSQL、Oracle等。
    的頭像 發表于 12-09 10:53 ?338次閱讀
    不用編程不用電腦,快速實現多臺Modbus協議的PLC、智能儀表對接<b class='flag-5'>SQL</b>數據庫

    深入理解C語言:循環語句的應用與優化技巧

    在程序設計中,我們常常需要重復執行某一段代碼。為了提高效率和簡化代碼,循環語句應運而生。C語言作為一門經典的編程語言,提供了多種循環控制結構,幫助程序員高效地實現重復操作。掌握循環語句的使用,不僅
    的頭像 發表于 12-07 01:11 ?251次閱讀
    深入理解C語言:循環<b class='flag-5'>語句</b>的應用與<b class='flag-5'>優化</b>技巧

    SQL錯誤代碼及解決方案

    SQL數據庫開發和管理中,常見的錯誤代碼及其解決方案可以歸納如下: 一、語法錯誤(Syntax Errors) 錯誤代碼 :無特定代碼,但通常會在錯誤消息中明確指出是語法錯誤。 原因 :SQL語句
    的頭像 發表于 11-19 10:21 ?2895次閱讀

    常用SQL函數及其用法

    SQL(Structured Query Language)是一用于管理和操作關系數據庫的編程語言。SQL 提供了豐富的函數庫,用于數據檢索、數據更新、數據刪除以及數據聚合等操作。以下是一些常用
    的頭像 發表于 11-19 10:18 ?431次閱讀

    SQL與NoSQL的區別

    在信息技術領域,數據庫是存儲和管理數據的核心組件。隨著互聯網的發展和大數據時代的到來,對數據庫的需求也在不斷變化。SQL和NoSQL作為兩主流的數據庫管理系統,各自有著獨特的優勢和應用場
    的頭像 發表于 11-19 10:15 ?234次閱讀

    大數據從業者必知必會的Hive SQL調優技巧

    不盡人意。本文針對Hive SQL的性能優化進行深入研究,提出了一系列可行的調優方案,并給出了相應的優化案例和優化前后的SQL代碼。通過合理
    的頭像 發表于 09-24 13:30 ?330次閱讀

    QPS提升10倍的sql優化

    本次慢sql優化是大促準備時的一個優化優化4c16g單實例mysql支持QPS從437到4610,今天發文時618大促已經順利結束,該mysql庫和應用在整個大促期間運行也非常穩定。
    的頭像 發表于 08-21 11:12 ?419次閱讀
    QPS提升10倍的<b class='flag-5'>sql</b><b class='flag-5'>優化</b>

    IP 地址在 SQL 注入攻擊中的作用及防范策略

    數據庫在各個領域的逐步應用,其安全性也備受關注。SQL 注入攻擊作為一常見的數據庫攻擊手段,給網絡安全帶來了巨大威脅。今天我們來聊一聊SQL 注入攻擊的基本知識。 SQL 注入攻擊的
    的頭像 發表于 08-05 17:36 ?366次閱讀

    什么是 Flink SQL 解決不了的問題?

    覆蓋不了的問題,但 SQL 的易用性又難以讓人釋懷。所以有些場景在使用 FLink SQL 開始就與需要額外注意,下面就介紹一多表關聯時存在部分列更新(partial Update)場景,在
    的頭像 發表于 07-09 20:50 ?381次閱讀

    SQL全外連接剖析

    SQL中的全外連接是什么? 在SQL中,FULLOUTERJOIN組合左外連接和右外連接的結果,并返回連接子句兩側表中的所有(匹配或不匹配)行。接下面sojson給大家詳細講解。 ? 圖解:SQL
    的頭像 發表于 03-19 18:28 ?2304次閱讀
    <b class='flag-5'>SQL</b>全外連接剖析

    assign語句和always語句的用法

    Assign語句和Always語句是在硬件描述語言(HDL)中常用的兩語句,用于對數字電路建模和設計。Assign語句用于連續賦值,而Al
    的頭像 發表于 02-22 16:24 ?2772次閱讀
    888娱乐城返水| 百家乐影院| 法拉利百家乐官网的玩法技巧和规则 | 威尼斯人娱乐城活动| 免费百家乐官网追号软件| 百家乐官网高手和勒威| 百家乐娱乐网备用网址| 反赌百家乐官网的玩法技巧和规则| 百家乐官网从哪而来| 大发888下载df888| 百家乐娱乐皇冠世界杯| 百家乐官网单打| 百家乐官网官网下载| 大发888娱乐场下载地址| 百家乐打闲赢机会多| 百家乐官网棋牌游戏币| 百家乐官网高命中投注| 巴里| 赌球术语| 百家乐能破解| 百家乐路单破解器| 澳门百家乐官网下路写法| 新龙县| 德州扑克辅助软件| 怎么看百家乐的路| 百家乐仿水晶筹码| 百家乐官网号解码器| 百家乐官网太阳城球讯网| 台南县| 盛大69棋牌游戏| 东莞水果机遥控器| 伯爵百家乐娱乐平台| 百家乐游戏免费| 百家乐官网娱乐官网| 百家乐官网视频网络游戏| 宁都县| 足球赌球网| 顶级赌场dj| 大发888娱乐城网页版lm0| 百家乐游戏什么时间容易出对| 壹贰博百家乐娱乐城|