精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

    文章

    3767

    瀏覽量

    64278
  • MySQL
    +關注

    關注

    1

    文章

    802

    瀏覽量

    26448
  • SQL語句
    +關注

    關注

    0

    文章

    19

    瀏覽量

    7020

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

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

收藏 人收藏

    評論

    相關推薦

    SQL錯誤代碼及解決方案

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

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

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

    QPS提升10倍的sql優化

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

    assign語句和always語句的用法

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

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

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

    SQL對象名無效的解決方法

    SQL對象名無效的解決方法 SQL對象名無效是指在SQL查詢或操作中使用了無效的對象名稱,導致無法執行相應的操作。當出現這種情況時,會拋出錯誤信息,指示哪個對象名無效。解決這個問題需要
    的頭像 發表于 12-29 14:45 ?1658次閱讀

    SQL改寫消除相關子查詢實踐

    GaussDB (DWS) 根據子查詢在 SQL 語句中的位置把子查詢分成了子查詢、子鏈接兩形式。
    的頭像 發表于 12-27 09:51 ?473次閱讀

    MySQL的執行過程 SQL語句性能優化常用策略

    回顧 MySQL 的執行過程,幫助介紹如何進行 sql 優化。
    的頭像 發表于 12-12 10:26 ?627次閱讀
    MySQL的執行過程 <b class='flag-5'>SQL</b><b class='flag-5'>語句</b>性能<b class='flag-5'>優化</b>常用策略

    MySQL執行過程:如何進行sql 優化

    (1)客戶端發送一條查詢語句到服務器; (2)服務器先查詢緩存,如果命中緩存,則立即返回存儲在緩存中的數據; (3)未命中緩存后,MySQL 通過關鍵字將 SQL 語句進行解析,并生成一顆對應的解析樹,MySQL 解析器將使用
    的頭像 發表于 12-12 10:19 ?383次閱讀
    MySQL執行過程:如何進行<b class='flag-5'>sql</b> <b class='flag-5'>優化</b>

    Oracle如何執行sql腳本文件

    Oracle是一關系型數據庫管理系統,可用于存儲、查詢和管理大量的數據。在Oracle中,可以通過執行SQL腳本文件來一次性地執行多個SQL語句或者批量處理數據。在下面的文章中,我將
    的頭像 發表于 12-06 10:51 ?6455次閱讀

    oracle執行sql查詢語句的步驟是什么

    Oracle數據庫是一常用的關系型數據庫管理系統,具有強大的SQL查詢功能。Oracle執行SQL查詢語句的步驟包括編寫SQL
    的頭像 發表于 12-06 10:49 ?899次閱讀

    oracle sql 定義變量并賦值

    賦值可以通過使用PL/SQL語句塊或使用SQL*Plus工具來實現。下面將詳細介紹這兩種方法以及它們的具體用法。 使用PL/SQL
    的頭像 發表于 12-06 10:46 ?2703次閱讀

    oracle sql基本命令大全

    Oracle SQL(Structured Query Language)是一用于管理和操作關系型數據庫的標準化語言。它具有強大的查詢和操作數據庫的能力,通過簡單的指令可實現復雜的操作。下面
    的頭像 發表于 12-06 10:40 ?1208次閱讀

    oracle用的是sql語句

    是的,Oracle使用的是SQL語言。SQL(Structured Query Language)是一用于管理和操作關系型數據庫的標準編程語言,被廣泛應用于企業級數據庫系統中,包括Oracle
    的頭像 發表于 12-06 10:30 ?1022次閱讀

    SQL語句大全實例

    SQL 1:從 idc_evaluating 數據庫的 ns_active_ip 表中查詢省份代碼為 110000 的所有行數據
    的頭像 發表于 11-30 11:33 ?500次閱讀