国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

使用SQL不當將會嚴重影響Sybase IQ性能

2024-07-21 02:42:48
字體:
來源:轉載
供稿:網友
項目中使用SQL不當導致Sybase IQ嚴重性能問題的真實案例:

需求如下:

有一個A表,它的記錄數約在50萬左右,一個B表,它的記錄數在800萬左右,B表需要以每月約50條的記錄數增長。而A表和B表的唯一索引都是key1和key2,這兩個字段大家也可以看作兩表的主鍵。

目前的要求是:

1、需要將B表中與A表中有相同主鍵的記錄的其它字段更新為A表中的字段值。

2、需要將A表中不在B表中的記錄插入B表中。

我的同事根據上面這兩個要求寫出的SQL:

#1:   update Bset a.col1=b.col1,a.col2=b.col2,.......from Awhere A.key1=B.key1and A.key2=B.key2#2    insert Bselect key1,key2,col1,col2.....from Awhere not exist(select 1 from B where key1=A.key1)

出錯現象:

在將以上兩步的SQL語句放入一個存儲過程中去運行后,出現的結果讓人使料不及,連續運行了11個小時竟然沒有出來結果,并且把8個CPU和24G內存的一臺小型機資源耗盡,連telnet都連接不上。后來,在仔細檢查了該存儲過程后,發現第二步中漏掉了一個關聯字段,我們將第二步改成:

#2   insert Bselect key1,key2,col1,col2.....from Awhere not exist(select 1 from B where key1=A.key1 and key2=A.key2)

在執行此SQL語句后,依然許久都沒有出現結果。 通過分析運行該存儲過程時Sybase IQ的日志記錄,發現問題的關鍵出在第2步上。一執行到這里就卡殼。于是,把重點放在對該語句的優化上。看起來用not exists對大表操作時會導致嚴重的性能問題。所以,我們就將第2步分成以下幾個步驟:

#3  select * into #tmp from A# 4 delete #tmp from Bwhere #tmp.key1=A.key1 and #tmp.key2=A.key2#5  insert  into B select * from #tmp

再次執行改存儲過程后,通過觀察Sybase IQ的運行日志,發現執行完3-5步耗時在100秒左右。整個存儲過程的執行時間不超過2分鐘。

總結:

1、小心“燈下黑”,千萬不要忽略簡單的問題;

2、在日常的數據庫管理中,為了實現同樣的目標,不同的的SQL寫法性能相差可能上萬倍,而這些性能的差異都是可以通過變換思路的方法得以解決;

3、雖然Sybase IQ是目前最快,性能最優良的數據庫引擎,但我們也不應忽視SQL的性能問題;

4、在Sybase IQ中,盡可能用臨時表,并且最好使用update和delete操作,盡可能避免使用not exists操作(對于小表,假如數據在1萬行左右,可以忽略不計), 因為not exists可能會導致對大表操作的性能問題。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 祁连县| 武强县| 建昌县| 贵南县| 连云港市| 江源县| 吐鲁番市| 五河县| 辰溪县| 扎兰屯市| 江安县| 镇巴县| 锦屏县| 万安县| 阳新县| 锦州市| 万州区| 张家川| 德惠市| 金华市| 静安区| 黑河市| 中超| 张家川| 栾川县| 宜兴市| 鄱阳县| 沛县| 宜良县| 台江县| 枣强县| 金湖县| 义马市| 贡嘎县| 桃园县| 鄂尔多斯市| 南溪县| 万盛区| 蒙阴县| 丰镇市| 景洪市|