域名預(yù)訂/競(jìng)價(jià),好“米”不錯(cuò)過
針對(duì)SQL SELECT語句進(jìn)行性能調(diào)優(yōu)是一個(gè)非常耗時(shí)的工作,可以說任何一個(gè)工程都不具備足夠的時(shí)限讓我們來完成這項(xiàng)工作,因此從日常的編寫和測(cè)試過程中總結(jié)技巧,是當(dāng)前優(yōu)化性能的主要措施。那么有哪些較為快捷的技巧呢?
第一,整理數(shù)據(jù)集大小
當(dāng)庫表中僅有幾千行數(shù)據(jù)時(shí),查詢指令總是可以順利執(zhí)行,但是當(dāng)應(yīng)用程度增加,庫表容量也增加時(shí),查詢速度自然會(huì)降低不少,面對(duì)這種情況,我們可采取的解決辦法其實(shí)十分簡(jiǎn)單,首先檢查SELECT語句中用到的表是否可以應(yīng)用WHERE子句進(jìn)行過濾,然后我們的查詢語句帶有子查詢時(shí),一定要將其進(jìn)行過濾,而且過濾時(shí)針對(duì)的是內(nèi)部語句而不是外部語句。
第二,限定選擇需要的字段
使用帶有報(bào)告和分析功能的應(yīng)用程序時(shí),有時(shí)報(bào)告性能低是因?yàn)閳?bào)告工具必須對(duì)收到的、帶有詳細(xì)形式的數(shù)據(jù)做聚合操作。
偶爾查詢也可能運(yùn)行地足夠快,但你的問題可能是一個(gè)網(wǎng)絡(luò)相關(guān)的問題,因?yàn)榇罅康脑敿?xì)數(shù)據(jù)通過網(wǎng)絡(luò)發(fā)送到報(bào)告服務(wù)器。
當(dāng)使用一個(gè)面向列的DBMS時(shí),只有你選擇的列會(huì)從磁盤讀取。在你的查詢中包含的列越少,IO開銷就越小。
第三,解除不必要的字段
編寫SQL語句是一個(gè)過程,通常需要大量編寫和測(cè)試SQL語句的迭代過程。開發(fā)過程中,一些同學(xué)常常會(huì)手動(dòng)加入一些額外的表,這些表對(duì)于返回SQL代碼沒有直接的影響,往往在大家跑完代碼并獲得想要的結(jié)果后忽略了之前加入的這些表和字段。這就好像手機(jī)中的照片,一張兩張?zhí)撚罢掌⒉粫?huì)怎樣,但是它仍舊占據(jù)了我們的內(nèi)存,因此每次運(yùn)行完程序,我都建議大家刪除那些對(duì)最終的返回?cái)?shù)據(jù)沒有任何影響和作用的表,通過移除與那些不必要表的JOINS操作,我們可以減少大量數(shù)據(jù)庫必須執(zhí)行的流程。
第四,移除外部連接查詢
當(dāng)然這個(gè)方法并不像說起來這么簡(jiǎn)單,能不能采用這種方法完全取決于它所帶來的影響有多大,即會(huì)改變多少表的內(nèi)容。當(dāng)影響不大時(shí),具體可以這樣操作,在相鄰表中借助占位符進(jìn)行OUTER JOINS刪除操作,比如當(dāng)你有以下的庫表時(shí),可通過定義OUTER JOINS來確保返回所有的數(shù)據(jù):
那么,在customer表的行中增加一個(gè)占位符,并更新sales表中的所有NULL值到占位符就可以有效刪除OUTER JOINS,不僅如此,還能避免其他開發(fā)人員編寫額外的語句。
第五,刪除JOIN和WHERE子句中的計(jì)算字段
同樣,與上述方法相對(duì)應(yīng)的是,刪除join等字段也要根據(jù)其可能帶來的調(diào)整大小來判斷,我們可以將連接語句中用到的計(jì)算字段作為一個(gè)新字段在表中創(chuàng)建。比如下面的SQL語句:
在sales表中利用年和月增加一列,同樣可以提高性能。更新后的SQL語句將如下:
以上內(nèi)容均來自論文發(fā)表,轉(zhuǎn)載請(qǐng)注明,謝謝。
申請(qǐng)創(chuàng)業(yè)報(bào)道,分享創(chuàng)業(yè)好點(diǎn)子。點(diǎn)擊此處,共同探討創(chuàng)業(yè)新機(jī)遇!