国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

sql數據庫語(yǔ)句如何優(yōu)化

發(fā)布時(shí)間:2021-09-14 18:07 來(lái)源:億速云 閱讀:0 作者:小新 欄目: Mysql 歡迎投稿:712375056

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

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

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

2.使用join是應該用小結果集驅動(dòng)大結果集,同時(shí)把復雜的join查詢(xún)拆分成多個(gè)query。不然join的越多表,就會(huì )導致越多的鎖定和堵塞。

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

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

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

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

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

6.limit基數比較大時(shí),使用between ... and ...

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

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

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

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

我們先來(lái)看一個(gè)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
//總起來(lái)說(shuō)關(guān)聯(lián)太多表,設計表時(shí)可以多一些冗余字段,減少表之間的關(guān)聯(lián)查詢(xún);
                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  //違反了第一個(gè)原則
                     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 中使用了子查詢(xún),這樣對查詢(xún)是非常不利的;

更好的一種做法是下面的語(yǔ)句:

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 語(yǔ)句中一定不要使用子查詢(xún);

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

3、合理利用索引;

4、通過(guò)explain查看sql性能;

使用工具 SQL Tuning Expert for Oracle 優(yōu)化SQL語(yǔ)句

對于SQL開(kāi)發(fā)人員和DBA來(lái)說(shuō),根據業(yè)務(wù)需求寫(xiě)出一條正確的SQL很容易。但是SQL的執行性能怎么樣呢?能優(yōu)化一下跑得更快嗎?如果不是資深
DBA,估計很多人都沒(méi)有信心。

幸運的是,自動(dòng)化優(yōu)化工具可以幫助我們解決這個(gè)難題。這就是今天要介紹的 Tosska SQL Tuning Expert for Oracle 工具。

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

本工具發(fā)明人Richard To, Dell的前首席工程師, 擁有超過(guò)20年的SQL優(yōu)化經(jīng)驗.

1、創(chuàng )建數據庫連接,也可以稍后創(chuàng )建。填好連接信息,點(diǎn)擊 “Connect” 按鈕。

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

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

2、輸入有性能問(wèn)題的SQL

3、點(diǎn)擊Tune按鈕,自動(dòng)生成大量的等價(jià)SQL并且開(kāi)始執行。雖然測試還沒(méi)有完成,我們已經(jīng)可以看到 SQL 20 的性能提升了100%。

讓我們仔細看一下SQL 20, 它使用了兩個(gè)Hints, 以最快的執行速度脫穎而出。原來(lái)的SQL要0.99秒,優(yōu)化后的SQL執行時(shí)間接近0秒。

由于這條SQL每天要在數據庫中執行上萬(wàn)次,優(yōu)化后可節省大約 165秒的數據庫執行時(shí)間。

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

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。

一本精品99久久精品77| 成全视频观看免费高清第6季| 国产无套护士在线观看| 亚洲综合色成在线观看| 国产午夜福利100集发布| 中文字幕无码热在线视频|