在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

    文章

    3799

    瀏覽量

    64388
  • MySQL
    +關注

    關注

    1

    文章

    809

    瀏覽量

    26565
  • SQL語句
    +關注

    關注

    0

    文章

    19

    瀏覽量

    7030

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

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

收藏 人收藏

    評論

    相關推薦

    淺談SQL優化小技巧

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

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

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

    SQL錯誤代碼及解決方案

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

    SQL與NoSQL的區別

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

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

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

    QPS提升10倍的sql優化

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

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

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

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

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

    SQL全外連接剖析

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

    assign語句和always語句的用法

    Assign語句和Always語句是在硬件描述語言(HDL)中常用的兩語句,用于對數字電路建模和設計。Assign語句用于連續賦值,而Al
    的頭像 發表于 02-22 16:24 ?2561次閱讀

    查詢SQL在mysql內部是如何執行?

    我們知道在mySQL客戶端,輸入一條查詢SQL,然后看到返回查詢的結果。這條查詢語句在 MySQL 內部到底是如何執行的呢?本文跟大家探討一下哈,我們先來看下MySQL基本架構~
    的頭像 發表于 01-22 14:53 ?572次閱讀
    查詢<b class='flag-5'>SQL</b>在mysql內部是如何執行?

    labview與sql數據庫連接5種方法

    連接LabVIEW和SQL數據庫是一常見的需求,可以通過多種方法實現。本文將介紹五連接LabVIEW和SQL數據庫的
    的頭像 發表于 01-07 16:01 ?4908次閱讀

    單片機if是什么語句

    單片機中的if語句是一條件語句,用于根據不同的條件執行不同的代碼塊。在程序執行過程中,條件語句用來決定是否執行特定的代碼段。在單片機編程中,if
    的頭像 發表于 01-05 14:04 ?1806次閱讀

    單片機中for語句的運用

    單片機中的for語句是一常見的循環控制結構,用于重復執行一段代碼塊,可以簡化程序的編寫和減少代碼量。本文將詳細介紹單片機中for語句的運用。 一、for語句的基本結構和功能 for
    的頭像 發表于 01-05 14:02 ?2453次閱讀

    SQL對象名無效的解決方法

    SQL對象名無效的解決方法 SQL對象名無效是指在SQL查詢或操作中使用了無效的對象名稱,導致無法執行相應的操作。當出現這種情況時,會拋出錯誤信息,指示哪個對象名無效。解決這個問題需要
    的頭像 發表于 12-29 14:45 ?1720次閱讀
    主站蜘蛛池模板: 天天操夜夜摸| 色多多www网站| 日韩99| 丁香婷婷网| 一区二区三区午夜| 色视频网站在线观看| 天堂资源在线观看| 丁香五婷婷| 午夜影院7cdy| 天堂资源在线观看| 真实子伦视频不卡| 国产在线视频h| 日韩欧美高清一区| 天天做天天玩天天爽天天| 国产高清免费午夜在线视频| 99久久精品国产免费| 美女免费视频色在线观看| 男女啪视频大全1000| japanesexxx日本69| 伊人久久成人爱综合网| 色宅男午夜电影在线观看| bt天堂资源| 国产午夜免费一区二区三区| 在线激情网| 国产91丝袜在线播放九色| 日韩啪啪网| 人人射人人干| 免费一级毛片在线播放| 亚洲日韩色综合视频| 成人在线精品| 天堂一区二区三区在线观看| 免费三级毛片| 草久久久久| 日日摸人人拍人人澡| 人人人人草| 网站在线你懂的| 国产美女作爱| 免费在线看视频| 免费观看成人毛片| yy8090韩国日本三理论免费| 日韩免费毛片视频|