共計 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 行業資訊頻道!