久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

sql數據庫語句如何優化

153次閱讀
沒有評論

共計 4635 個字符,預計需要花費 12 分鐘才能閱讀完成。

這篇文章主要介紹 sql 數據庫語句如何優化,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

通常 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、創建數據庫連接,也可以稍后創建。填好連接信息,點擊“Connect”按鈕。

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

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

2、輸入有性能問題的 SQL

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

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

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

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

以上是“sql 數據庫語句如何優化”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注丸趣 TV 行業資訊頻道!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-28發表,共計4635字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 新平| 淳安县| 廉江市| 台江县| 闽清县| 湘乡市| 泰州市| 宜兰县| 五原县| 崇信县| 平舆县| 海南省| 洛南县| 包头市| 屯留县| 尖扎县| 定西市| 吴堡县| 五河县| 武清区| 通山县| 姜堰市| 中方县| 西吉县| 嘉鱼县| 年辖:市辖区| 临江市| 普定县| 乐清市| 晴隆县| 区。| 弋阳县| 额尔古纳市| 淄博市| 南投县| 嫩江县| 密山市| 南漳县| 松江区| 宁武县| 玛曲县|