亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 8585 | 回復(fù): 11
打印 上一主題 下一主題

加速SQL查詢效能的七大秘訣 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2010-12-06 15:44 |只看該作者 |倒序?yàn)g覽
任何平臺的SQL開發(fā)者都有自身的困惑,似乎他們一直糾纏在DO WHILE循環(huán)里,這個(gè)循環(huán)讓他們不斷地重復(fù)同樣的錯(cuò)誤。這是因?yàn)閿?shù)據(jù)庫的發(fā)展依然不夠成熟。當(dāng)然,供應(yīng)商們也在不斷進(jìn)步,但是他們還是需要處理更嚴(yán)重的問題。并發(fā)性,資源管理,空間管理和速度依然制約著SQL開發(fā)者對開發(fā)平臺的選擇。

  部分問題是因?yàn)闆]有訣竅可以實(shí)現(xiàn)解決這些問題,也沒有任何實(shí)踐表明已經(jīng)解決了這些問題。但是,至少我可以告訴你這里有一個(gè)例外。通常,開發(fā)者會(huì)找到自己喜歡的方法,盡管這些方法無法實(shí)現(xiàn)性能架構(gòu)和并發(fā)性,但是開發(fā)者也不會(huì)再自找麻煩地去尋找別的方式了;蛟S這是缺少教育的后果,或許是因?yàn)殚_發(fā)者太接近這些進(jìn)程了,所以就沒辦法認(rèn)清他們產(chǎn)生的錯(cuò)誤。可能在本地測試系統(tǒng)上這些查詢代碼可以運(yùn)行良好,但是在運(yùn)行系統(tǒng)上就會(huì)產(chǎn)生極大的錯(cuò)誤。

  我并不期望SQL開發(fā)者能成為管理員,但是在寫代碼的時(shí)候,他們必須重視生產(chǎn)問題。如果在開發(fā)初期他們就不做這些工作,那么,DBAs將強(qiáng)制他們回過頭來考慮這個(gè)問題,以此同時(shí),使戶也會(huì)受到影響。

  我們之所以說調(diào)整數(shù)據(jù)庫是一件藝術(shù)性和科學(xué)性結(jié)合的事情,是因?yàn)樵趹?yīng)用上來看有很多必須遵守的規(guī)則。你在一個(gè)系統(tǒng)里解決的問題,在另一個(gè)系統(tǒng)里依然會(huì)出現(xiàn),反之亦然。在調(diào)整數(shù)據(jù)庫方面沒有萬能的答案,但是你依然不能放棄。

  下面我將總結(jié)出在SQL編程中容易被忽略的一些注意要點(diǎn),哪些是可以做的,哪些是不可以做的。這些要點(diǎn)將幫你更加深入地理解DBAs,也可以增強(qiáng)你從面向生產(chǎn)的角度思考進(jìn)程。

  1.不要用UPDATE代替CASE

  盡管這個(gè)問題經(jīng)常被忽略,但是卻是一個(gè)很普遍的問題。很多開發(fā)者都會(huì)忽略這個(gè)問題,因?yàn)槭褂肬PDATE看起來是一個(gè)具有邏輯性的自然流。

  在這種情況下,例如:你插入一個(gè)臨時(shí)表格,在存在另一個(gè)值的時(shí)候,讓它顯示某個(gè)值。你要從客戶表中按順序列出超過10萬美金的人,以便把他們設(shè)置為“首選”。這時(shí),你就要把數(shù)據(jù)插入表格中,運(yùn)行UPDATEA命令來設(shè)置CustomerRank列,來順序定義那些超過10萬美金的人。問題是,UPDATE命令已經(jīng)被記錄了,這就意味著針對每一個(gè)表寫入你都要進(jìn)行兩次操作。當(dāng)然,針對這個(gè)過程可以使用SQL查詢語言本身的CASE語句。它將測試每一行是否符合總體條件,并在寫入表格前,給它一個(gè)“首選”的標(biāo)簽。這種性能的提高是驚人的。

  2.不要盲目使用代碼

  這個(gè)也是很普遍的。這很容易復(fù)制別人的代碼,因?yàn)槟阒浪@段代碼可以查詢到你需要的資料。問題是,很多時(shí)候復(fù)制別人的代碼會(huì)讓你得到很多你不需要的額外資料。但是很少有開發(fā)者有功夫去挑選這些數(shù)據(jù)。所以他們也只是通過這些代碼得到了需要數(shù)據(jù)的父集。這樣的代碼通常是以外部鏈接的方式或者是在WHERE語句中出現(xiàn)。所以說如果你有針對性地修改代碼,SQL的性能就會(huì)得到大大的提升。

  3.只查詢對你游泳的列

  這個(gè)問題和第二個(gè)問題類似,但是,是針對列來講的。用SELECT * 查詢,而不是分別對每列查詢在代碼實(shí)現(xiàn)方面也簡單地多。但是這時(shí),問題再一次出現(xiàn),你再次得到了比你需要的數(shù)據(jù)多得多的數(shù)據(jù)。我已經(jīng)無數(shù)次地看到這種現(xiàn)象發(fā)生了。開發(fā)者用SELECT * 語句查詢一個(gè)120列、幾百萬行的表以后最后只得到了3到5行的有用數(shù)據(jù)。在這一點(diǎn)上,你不是僅僅查詢了比你所需要的數(shù)據(jù)多的數(shù)據(jù),你還從別的進(jìn)程中搶奪了資源,降低了整體速度。

  4.不要做兩次查詢

  還有一個(gè)常見的現(xiàn)象是:寫一個(gè)從擁有無數(shù)行的表里取數(shù)據(jù)的存儲進(jìn)程。開發(fā)者需要查詢到符合這樣以下條件的用戶:住在加利福尼亞州,收入超過$40,000。這時(shí),他把住在加利福尼亞州的客戶查出來放到一張零時(shí)表中,然后把收入在$40,000以上的客戶查出來放到另一張零時(shí)表中。最后,他合并這兩個(gè)表得到最終的查詢結(jié)果。然后,通過更小的數(shù)據(jù)集,來加強(qiáng)后續(xù)步驟。

  你在開玩笑吧?這個(gè)查詢應(yīng)該是一個(gè)單一的查詢,可是,你卻對一個(gè)如此大型的表進(jìn)行了兩次查詢。不要再做這樣的傻事了:對大型表格說,盡可能地只進(jìn)行一次查詢。這時(shí),你會(huì)發(fā)現(xiàn)你的程序執(zhí)行起來效率更高了。

  稍微不同的地方是,當(dāng)我們需要通過幾個(gè)步驟查詢一個(gè)大型表的子集時(shí),它將導(dǎo)致對大型表的多次查詢。一定要通過查詢子集避免這種事情的發(fā)生。

  5.確定使用臨時(shí)表的時(shí)機(jī)。

  這是一個(gè)比較難以處理的問題,但是你可以從這里得到很多好處。很多情況下,都是可以使用臨時(shí)表的,比如:在避免兩次從一個(gè)大型表格里查詢時(shí)。在連接兩個(gè)表格的時(shí)候,你也可以使用臨時(shí)表來大大降低處理程序所占用的內(nèi)存。如果你必須把一個(gè)表合并到一個(gè)大型表格中,你可以通過先從大型表中檢索出你所需要的數(shù)據(jù)合并到臨時(shí)表中,然后用把這些數(shù)據(jù)合并的方法來優(yōu)化命令。如果在進(jìn)程中,你必須對同一個(gè)表進(jìn)行同樣的合并的時(shí)候,臨時(shí)表是一個(gè)非常有用的方式。

  6.必須預(yù)存數(shù)據(jù)。

  這是我比較喜歡的一個(gè)話題,因?yàn)檫@是一個(gè)比較容易被忽略的老方法。如果你有一個(gè)報(bào)告或者一個(gè)進(jìn)程,它們需要向一個(gè)大型表里做類型的合并,這時(shí),如果你能通過提前合并表格或者是插入表格的方法來預(yù)存數(shù)據(jù),這將對你的操作大大有益。

  一般情況下,你是不能使用這個(gè)技巧的。但是,如果你可以,你會(huì)發(fā)現(xiàn)這將是一個(gè)非常完美的節(jié)約服務(wù)器資源的方法。

  注意到這樣的問題,一般開發(fā)者通過關(guān)注查詢本身而避開這樣的合并問題,創(chuàng)建一個(gè)只可見的合并,以致于不能一而再,再而三地定義它們的合并環(huán)境。通過預(yù)存數(shù)據(jù),你只需執(zhí)行一次合并,同時(shí)別人也避免了大型的合并。我非常喜歡用這種方法,大多數(shù)情況下,有很多流行表總是執(zhí)行合并,所以沒有任何理由說不能預(yù)存數(shù)據(jù)。

  7,分批地刪除和更新。

  還有一個(gè)常被忽略的簡單技巧。如果你的操作錯(cuò)誤,從一個(gè)大型表里刪除和更新大量的數(shù)據(jù)將是一個(gè)噩夢。問題是這兩個(gè)命令執(zhí)行起來就像是一個(gè)命令,如果你需要放棄他們,或者如果你在工作的時(shí)候系統(tǒng)發(fā)生了什么事情,系統(tǒng)就必須從頭開始所有命令的執(zhí)行。這會(huì)花費(fèi)很多時(shí)間。這些操作也會(huì)妨礙別的命令的執(zhí)行,甚至?xí)蔀檎麄(gè)系統(tǒng)的瓶頸。

  解決這個(gè)問題的辦法是,小批量地刪除和更新數(shù)據(jù)?梢酝ㄟ^兩種方式來解決這個(gè)問題:一,如果命令的執(zhí)行因?yàn)槿魏卧虮唤K止,那就必須有一小部分行從頭開始執(zhí)行,所以數(shù)據(jù)庫恢復(fù)得將會(huì)快得多。二,當(dāng)更少的數(shù)據(jù)被存在了硬盤上時(shí),別的命令也可以做一些工作,所以并發(fā)性就被大大地優(yōu)化了。

  按照這個(gè)指示,很多開發(fā)者企圖在一天之內(nèi)把這些刪除和更新操作完成。但是,這并不是總是正確的,特別是當(dāng)你在存檔的時(shí)候。只要你需要,你可以盡可能地?cái)U(kuò)展這些炒作,而且這些小批量的數(shù)據(jù)也可以幫助你完成這些。如果你可以花費(fèi)更多的時(shí)間來做更多的操作,那么就花費(fèi)一些多余的時(shí)間吧,同時(shí)不要讓你的系統(tǒng)停下來。

  當(dāng)你寫代碼來優(yōu)化你的SQL性能的時(shí)候,在任何你可以遵守這些事項(xiàng)的時(shí)候,就去遵守它們。但是,請分別評價(jià)這些解決方法來看看哪種方法是最有效的,可以說沒有一個(gè)萬能的或者是固定的方法來解決這些問題。你將會(huì)發(fā)現(xiàn)很多竅門都是和ikyi提高并發(fā)性,并可以讓整體運(yùn)行通暢的。同時(shí),你也會(huì)注意到這些物理實(shí)現(xiàn)會(huì)從這個(gè)供應(yīng)商傳遞到下一個(gè)供應(yīng)商,這些概念和問題將會(huì)存在每一個(gè)SQL平臺上。

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2011-01-01 04:17 |只看該作者
回復(fù) ljb_ 的帖子

這些概念和問題將會(huì)存在每一個(gè)SQL平臺上

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2010-12-29 13:46 |只看該作者
深受啟發(fā),謝謝樓主

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2011-03-23 12:17 |只看該作者
寫的不夠精華

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2011-03-23 14:54 |只看該作者
回復(fù) AndyHu168 的帖子

哈哈,歡迎補(bǔ)充~

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2011-03-28 08:22 |只看該作者
是的,說的有道理,可以借鑒的。

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2012-07-17 15:12 |只看該作者
hopehappyguowang 發(fā)表于 2012-7-17 10:27
朋友你好,想和你聊天!

一起成長哎

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2012-06-07 15:56 |只看該作者
謝謝樓主...

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2012-07-17 10:27 |只看該作者
朋友你好,想和你聊天!

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2012-08-07 23:41 |只看該作者
相信樓主的說,非常支持你
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP