<form id="hz9zz"></form>
  • <form id="hz9zz"></form>

      <nobr id="hz9zz"></nobr>

      <form id="hz9zz"></form>

    1. 明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

      sql數據庫語句優化區分與優化技巧總結(sql優化工具)

      [摘要]通常sql數據庫需要進行優化分析,并且還有一定的技巧,sql優化的幾種方法這里就不做詳細介紹了,本文將會sql語句優化進行總結,后面還附了優化工具SQL Tuning Expert for Orac...
      通常sql數據庫需要進行優化分析,并且還有一定的技巧,sql優化的幾種方法這里就不做詳細介紹了,本文將會sql語句優化進行總結,后面還附了優化工具SQL Tuning Expert for Oracle及使用方法,首先我們要遵隨數據庫優化的幾個原則:

      1.盡量避免在列上做運算,這樣會導致索引失;

      2.使用join是應該用小結果集驅動大結果集,同時把復雜的join查詢拆分成多個query。不然join的越多表,就會導致越多的鎖定和堵塞。

      3.注意like模糊查詢的使用,避免使用%%,例如select * from a where name like '%de%';

      代替語句:select * from a where name >= 'de' and name < 'df';

      4.僅列出需要查詢的字段,不要使用select * from ...,節省內存;

      5.使用批量插入語句,節省交互;

      insert into a (id ,name)
      values(2,'a'),
      (3,'s');

      6.limit基數比較大時,使用between ... and ...

      7.不要使用rand函數隨機獲取記錄;

      8.避免使用null ,這就需要在建表時,盡量設置為not null,提升查詢性能;

      9,不要使用count(id),而應該是count(*)

      10.不要做無謂的排序,盡可能在索引中完成排序;

      我們先來看一個sql:

       select
                          ii.product_id, 
                          p.product_name, 
                          count(distinct pim.pallet_id) count_pallet_id, 
                          if(round(sum(itg.quantity),2) > -1 && round(sum(itg.quantity),2) < 0.005, 0, round(sum(itg.quantity),2)) quantity,
                          round(ifnull(sum(itag.locked_quantity), 0.00000),2) locked_quantity,
                          pc.container_unit_code_name,
                          if(round(sum(itg.qoh),2) > -1 && round(sum(itg.qoh),2) < 0.005, 0, round(sum(itg.qoh),2)) qoh,
                          round(ifnull(sum(itag.locked_qoh), 0.00000),2) locked_qoh,
                          p.unit_code,
                          p.unit_code_name
                      from (select 
                              it.inventory_item_id item_id, 
                              sum(it.quantity) quantity, 
                              sum(it.real_quantity) qoh 
                          from 
                              ws_inventory_transaction it
                          where 
                              it.enabled = 1 
                          group by 
                              it.inventory_item_id  
                          ) itg 
                          left join (select 
                                          ita.inventory_item_id item_id, 
                                          sum(ita.quantity) locked_quantity, 
                                          sum(ita.real_quantity) locked_qoh 
                                     from 
                                          ws_inventory_transaction_action ita
                                     where 
                                          1=1 and ita.type in ('locked', 'release') 
                                     group by 
                                          ita.inventory_item_id 
                                     )itag on itg.item_id = itag.item_id
                          inner join ws_inventory_item ii on itg.item_id = ii.inventory_item_id 
                          inner join ws_pallet_item_mapping pim on ii.inventory_item_id = pim.inventory_item_id  
                          inner join ws_product p on ii.product_id = p.product_id and p.status = 'OK'
                          left join ws_product_container pc on ii.container_id = pc.container_id
      //總起來說關聯太多表,設計表時可以多一些冗余字段,減少表之間的關聯查詢;
                      where 
                          ii.inventory_type = 'raw_material' and 
                          ii.inventory_status = 'in_stock' and 
                          ii.facility_id = '25' and 
                          datediff(now(),ii.last_updated_time) < 3  //違反了第一個原則
                           and p.product_type = 'goods'
                           and p.product_name like '%果%'   // 違反原則3
      
                      group by 
                          ii.product_id
                      having 
                          qoh < 0.005
                      order by 
                          qoh desc

      上面的sql我們在from 中使用了子查詢,這樣對查詢是非常不利的;

      更好的一種做法是下面的語句:

      select  
                      t.facility_id,
                      f.facility_name,
                      t.inventory_status,
                      wis.inventory_status_name,
                      t.inventory_type,
                      t.product_type,
                      t.product_id, 
                      p.product_name,
                      t.container_id, 
                      t.unit_quantity, 
                      p.unit_code,
                      p.unit_code_name,
                      pc.container_unit_code_name,
                      t.secret_key,
                      sum(t.quantity) quantity,
                      sum(t.real_quantity) real_quantity,
                      sum(t.locked_quantity) locked_quantity,
                      sum(t.locked_real_quantity) locked_real_quantity
                  from ( select 
                              ii.facility_id,
                              ii.inventory_status,
                              ii.inventory_type,
                              ii.product_type,
                              ii.product_id, 
                              ii.container_id, 
                              ii.unit_quantity, 
                              ita.secret_key,
                              ii.quantity quantity,
                              ii.real_quantity real_quantity,
                              sum(ita.quantity) locked_quantity,
                              sum(ita.real_quantity) locked_real_quantity
                          from 
                              ws_inventory_item ii 
                              inner join ws_inventory_transaction_action ita on ii.inventory_item_id = ita.inventory_item_id
                          where 
                              ii.facility_id = '{$facility_id}' and 
                              ii.inventory_status = '{$inventory_status}' and 
                              ii.product_type = '{$product_type}' and 
                              ii.inventory_type = '{$inventory_type}' and
                              ii.locked_real_quantity > 0 and 
                              ita.type in ('locked', 'release') 
                          group by 
                              ii.product_id, ita.secret_key, ii.container_id, ita.inventory_item_id
                          having 
                              locked_real_quantity > 0 
                  ) as t
                      inner join ws_product p on t.product_id = p.product_id 
                      left join ws_facility f on t.facility_id = f.facility_id
                      left join ws_inventory_status wis on wis.inventory_status = t.inventory_status
                      left join ws_product_container pc on pc.container_id = t.container_id            
                  group by 
                      t.product_id, t.secret_key, t.container_id

      注意:

      1、from 語句中一定不要使用子查詢;

      2、使用更多的where加以限制,縮小查找范圍;

      3、合理利用索引;

      4、通過explain查看sql性能;

      使用工具 SQL Tuning Expert for Oracle 優化SQL語句


      對于SQL開發人員和DBA來說,根據業務需求寫出一條正確的SQL很容易。但是SQL的執行性能怎么樣呢?能優化一下跑得更快嗎?如果不是資深
      DBA,估計很多人都沒有信心。

      幸運的是,自動化優化工具可以幫助我們解決這個難題。這就是今天要介紹的 Tosska SQL Tuning Expert for Oracle 工具。

      下載 https://tosska.com/tosska-sql-tuning-expert-tse-oracle-free-download/

      本工具發明人Richard To, Dell的前首席工程師, 擁有超過20年的SQL優化經驗.

      1.png

      1、創建數據庫連接,也可以稍后創建。填好連接信息,點擊 “Connect” 按鈕。

      如果您已經安裝Oracle客戶端,并且在Oracle客戶端配置了TNS,可以在本窗口選擇“TNS”作為”Connection Mode”,然后在”Database Alias”中選擇配置好的TNS作為數據庫別名。

      2.png

      如果您沒有安裝Oracle客戶端或者不想安裝Oracle客戶端, 可以選擇“Basic Type”作為”Connection Mode”,只需數據庫服務器IP, 端口和服務名即可。

      1.png

      2、輸入有性能問題的SQL

      1.png

      3、點擊Tune按鈕,自動生成大量的等價SQL并且開始執行。雖然測試還沒有完成,我們已經可以看到 SQL 20 的性能提升了100%。

      1.png

      讓我們仔細看一下SQL 20, 它使用了兩個Hints, 以最快的執行速度脫穎而出。原來的SQL要0.99秒,優化后的SQL執行時間接近0秒。

      由于這條SQL每天要在數據庫中執行上萬次,優化后可節省大約 165秒的數據庫執行時間。1.png

      最后,用等價的SQL 20 替換 應用程序源代碼中有性能問題的SQL。重新編譯應用程序,性能得到了提高。

      調優任務順利完成!

      相關文章:

      Sql效能優化總結與sql語句優化篇

      SQL語句優化原則,sql語句優化

      相關視頻:

      MySQL優化視頻教程—布爾教育

      以上就是sql數據庫語句優化分析和優化技巧總結(sql優化工具)的詳細內容,更多請關注php中文網其它相關文章!


      學習教程快速掌握從入門到精通的SQL知識。




      日韩精品一区二区三区高清