最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

常用SQL語句優(yōu)化技巧總結(jié)【經(jīng)典】

 更新時(shí)間:2017年04月12日 14:39:16   作者:FrankYou  
這篇文章主要介紹了常用SQL語句優(yōu)化技巧,結(jié)合實(shí)例形式對比分析,總結(jié)了各種常用的SQL優(yōu)化技巧及相關(guān)原理,需要的朋友可以參考下

本文實(shí)例總結(jié)了常用SQL語句優(yōu)化技巧。分享給大家供大家參考,具體如下:

除了建立索引之外,保持良好的SQL語句編寫習(xí)慣將會(huì)降低SQL性能問題發(fā)生。

①通過變量的方式來設(shè)置參數(shù)

好:

stringsql = "select * from people p where p.id = ? ";

壞:

stringsql = "select * from people p where p.id = "+id;

數(shù)據(jù)庫的SQL文解析和執(zhí)行計(jì)劃會(huì)保存在緩存中,但是SQL文只要有變化,就得重新解析。

“…where p.id = ”+id的方式在id值發(fā)生改變時(shí)需要重新解析,這會(huì)耗費(fèi)時(shí)間。

②不要使用select *

好:

stringsql = "select people_name,pepole_age from people ";

壞:

stringsql = "select * from people ";

使用select *的話會(huì)增加解析的時(shí)間,另外會(huì)把不需要的數(shù)據(jù)也給查詢出來,數(shù)據(jù)傳輸也是耗費(fèi)時(shí)間的,

比如text類型的字段通常用來保存一些內(nèi)容比較繁雜的東西,如果使用select *則會(huì)把該字段也查詢出來。

③謹(jǐn)慎使用模糊查詢

好:

stringsql = "select * from people p where p.id like 'parm1%' ";

壞:

stringsql = "select * from people p where p.id like '%parm1%' ";

當(dāng)模糊匹配以%開頭時(shí),該列索引將失效,若不以%開頭,該列索引有效。

④不要使用列號(hào)

好:

stringsql = "select people_name,pepole_age from people order by name,age";

壞:

stringsql = "select people_name,pepole_age from people order by 6,8";

使用列號(hào)的話,將會(huì)增加不必要的解析時(shí)間。

⑤優(yōu)先使用UNION ALL,避免使用UNION

好:

stringsql = "select name from student union all select name from teacher";

壞:

stringsql = "select name from student union select name from teacher";

UNION 因?yàn)闀?huì)將各查詢子集的記錄做比較,故比起UNION ALL ,通常速度都會(huì)慢上許多。一般來說,如果使用UNION ALL能滿足要求的話,務(wù)必使用UNION ALL。還有一種情況,如果業(yè)務(wù)上能夠確保不會(huì)出現(xiàn)重復(fù)記錄。

⑥在where語句或者order by語句中避免對索引字段進(jìn)行計(jì)算操作

好:

stringsql = "select people_name,pepole_age from people where create_date=date1 ";

壞:

stringsql = "select people_name,pepole_age from people where trunc(create_date)=date1";

當(dāng)在索引列上進(jìn)行操作之后,索引將會(huì)失效。正確做法應(yīng)該是將值計(jì)算好再傳入進(jìn)來。

⑦使用not exist代替not in

好:

stringsql = "select * from orders where customer_name not exist (select customer_name from customer)";

壞:

stringsql = "select * from orders where customer_name not in(select customer_name from customer)";

如果查詢語句使用了not in 那么內(nèi)外表都進(jìn)行全表掃描,沒有用到索引;而not extsts 的子查詢依然能用到表上的索引。

⑧ exist和in的區(qū)別

in 是把外表和內(nèi)表作hash 連接,而exists是對外表作loop循環(huán),每次loop循環(huán)再對內(nèi)表進(jìn)行查詢。因此,in用到的是外表的索引, exists用到的是內(nèi)表的索引。

如果查詢的兩個(gè)表大小相當(dāng),那么用in和exists差別不大。

如果兩個(gè)表中一個(gè)較小,一個(gè)是大表,則子查詢表大的用exists,子查詢表小的用in:

例如:表A(小表),表B(大表)

1:

select * from A where cc in (select cc from B)

效率低,用到了A表上cc列的索引;

select * from A where exists(select cc from B where cc=A.cc)

效率高,用到了B表上cc列的索引。

2:

select * from B where cc in (select cc from A)

效率高,用到了B表上cc列的索引;

select * from B where exists(select cc from A where cc=B.cc)

效率低,用到了A表上cc列的索引。

⑨避免在索引列上做如下操作:

◆避免在索引字段上使用<>,!=
◆避免在索引列上使用IS NULL和IS NOT NULL
◆避免在索引列上出現(xiàn)數(shù)據(jù)類型轉(zhuǎn)換(比如某字段是String類型,參數(shù)傳入時(shí)是int類型)

當(dāng)在索引列上使用如上操作時(shí),索引將會(huì)失效,造成全表掃描。

⑩復(fù)雜操作可以考慮適當(dāng)拆成幾步

有時(shí)候會(huì)有通過一個(gè)SQL語句來實(shí)現(xiàn)復(fù)雜業(yè)務(wù)的例子出現(xiàn),為了實(shí)現(xiàn)復(fù)雜的業(yè)務(wù),嵌套多級(jí)子查詢。造成SQL性能問題。對于這種情況可以考慮拆分SQL,通過多個(gè)SQL語句實(shí)現(xiàn),或者把部分程序能完成的工作交給程序完成。

PS:這里再為大家推薦2款SQL在線工具供大家參考使用:

SQL在線壓縮/格式化工具:
http://tools.jb51.net/code/sql_format_compress

sql代碼在線格式化美化工具:
http://tools.jb51.net/code/sqlcodeformat

希望本文所述對大家數(shù)據(jù)庫程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • 2023年最新Navicat永久激活安裝使用教程

    2023年最新Navicat永久激活安裝使用教程

    Navicat中文版是強(qiáng)大的可視化數(shù)據(jù)庫管理工具,用于開發(fā)和管理MySQL|SQL?Server|SQLite|Oracle等數(shù)據(jù)庫,Navicat以直覺化的圖形用戶界面符合數(shù)據(jù)庫管理員、開發(fā)人員及中小企業(yè)的需要,本文給大家分享2023年最新Navicat永久激活安裝使用教程,感興趣的朋友一起看看吧
    2023-05-05
  • Linux環(huán)境下瀚高數(shù)據(jù)庫授權(quán)文件替換與過期問題解決辦法

    Linux環(huán)境下瀚高數(shù)據(jù)庫授權(quán)文件替換與過期問題解決辦法

    這篇文章主要介紹了Linux環(huán)境下瀚高數(shù)據(jù)庫授權(quán)文件替換與過期問題解決辦法的相關(guān)資料,文中強(qiáng)調(diào)了授權(quán)文件的規(guī)范路徑與命名要求、錯(cuò)誤操作示例及正確步驟,需要的朋友可以參考下
    2026-06-06
  • 使用DataGrip連接Hive的詳細(xì)步驟

    使用DataGrip連接Hive的詳細(xì)步驟

    這篇文章主要介紹了DataGrip連接Hive的詳細(xì)圖文教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • DBeaver操作數(shù)據(jù)表的拷貝的實(shí)現(xiàn)

    DBeaver操作數(shù)據(jù)表的拷貝的實(shí)現(xiàn)

    這篇文章主要介紹了DBeaver操作數(shù)據(jù)表的拷貝的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • SQL查詢連續(xù)號(hào)碼段的巧妙解法

    SQL查詢連續(xù)號(hào)碼段的巧妙解法

    在ITPUB上有一則非常巧妙的SQL技巧,學(xué)習(xí)一下,記錄在這里
    2013-09-09
  • 記一次SQL優(yōu)化的實(shí)戰(zhàn)記錄

    記一次SQL優(yōu)化的實(shí)戰(zhàn)記錄

    作為開發(fā)人員,我們免不了與sql打交道,有些sql可能在業(yè)務(wù)的最開始,執(zhí)行是毫無問題的,但是隨著業(yè)務(wù)量的提升以及業(yè)務(wù)復(fù)雜度的加 深,可能之前的sql就會(huì)需要優(yōu)化了,下面這篇文章主要給大家介紹了關(guān)于一次SQL優(yōu)化的實(shí)戰(zhàn)記錄,需要的朋友可以參考下
    2022-07-07
  • 數(shù)據(jù)庫librarydb多表查詢的操作方法

    數(shù)據(jù)庫librarydb多表查詢的操作方法

    這篇文章主要介紹了數(shù)據(jù)庫librarydb多表查詢的操作方法,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2023-12-12
  • [轉(zhuǎn)載]讓SQL運(yùn)行得更快

    [轉(zhuǎn)載]讓SQL運(yùn)行得更快

    筆者在工作實(shí)踐中發(fā)現(xiàn),不良的SQL往往來自于不恰當(dāng)?shù)乃饕O(shè)計(jì)、不充份的連接條件和不可優(yōu)化的where子句。在對它們進(jìn)行適當(dāng)?shù)膬?yōu)化后,其運(yùn)行速度有了明顯地提高!下面我將從這三個(gè)方面分別進(jìn)行總結(jié)
    2007-02-02
  • 如何取得一個(gè)表的所有字段名用逗號(hào)分割

    如何取得一個(gè)表的所有字段名用逗號(hào)分割

    如何取得一個(gè)表的所有字段名用逗號(hào)分割...
    2006-12-12
  • Dbeaver如何從一個(gè)數(shù)據(jù)庫復(fù)制表到另外一個(gè)數(shù)據(jù)庫

    Dbeaver如何從一個(gè)數(shù)據(jù)庫復(fù)制表到另外一個(gè)數(shù)據(jù)庫

    在數(shù)據(jù)庫管理中,導(dǎo)出表是一項(xiàng)常見操作,可以通過特定的工具或數(shù)據(jù)庫自帶的功能實(shí)現(xiàn),步驟包括:1.在數(shù)據(jù)庫管理軟件中找到需導(dǎo)出的表,右鍵選擇導(dǎo)出數(shù)據(jù),2.選擇目標(biāo)數(shù)據(jù)庫,并進(jìn)行表映射設(shè)置,3.根據(jù)需求調(diào)整導(dǎo)出參數(shù),4.執(zhí)行操作完成數(shù)據(jù)導(dǎo)出
    2024-10-10

最新評(píng)論

吉安市| 通州市| 进贤县| 紫阳县| 克拉玛依市| 望谟县| 轮台县| 黄山市| 龙山县| 山丹县| 凯里市| 宝山区| 遵义市| 雅安市| 陆河县| 西城区| 东光县| 凤台县| 墨玉县| 滕州市| 罗平县| 内江市| 云南省| 汝南县| 新宾| 阳朔县| 泰宁县| 静乐县| 古蔺县| 英山县| 高邑县| 界首市| 左贡县| 甘孜| 麦盖提县| 仪陇县| 奎屯市| 浦东新区| 遂宁市| 龙岩市| 荔波县|