|
導讀數據庫,簡而言之可視為電子化的文件柜——存儲電子文件的處所,用戶可以對文件中的數據進行新增、截取、更新、刪除等操作。所謂“數據庫”是以一定方式儲存在一起、能與多個用戶共享、具有盡可能小的冗余度、與應... 數據庫,簡而言之可視為電子化的文件柜——存儲電子文件的處所,用戶可以對文件中的數據進行新增、截取、更新、刪除等操作。所謂“數據庫”是以一定方式儲存在一起、能與多個用戶共享、具有盡可能小的冗余度、與應用程序彼此獨立的數據集合。 每個數據庫平臺上的SQL開發人員都是在困難中求得生存,我們總是一次又一次犯同樣的錯誤,這是因為數據庫領域還相對不成熟,是的,每個數據庫廠商都在做著各種不同的努力,但作為開發人員仍然要克服各種問題,無論是在SQL Server,Oracle,DB2,Sybase,MySQL數據庫,還是其它關系數據庫平臺上編寫SQL代碼,并發性、資源管理、空間管理和SQL運行速度總是困擾著開發人員。 遺憾的是,其中部分問題的解決沒有靈丹妙藥,也幾乎沒有最佳實踐。通常,開發人員有自己喜歡的SQL書寫習慣,一般不愿意去研究其它可行方案,當然這可能是因為缺少培訓的原因。我見得最多的就是在測試環境中SQL查詢運行良好,但尚未在生產系統上進行試運行,就草草收場了,至于后來發現有問題,再被動式修改,因此最終用戶就痛苦了。 我不期望開發人員成為DBA,但我們編寫代碼時必須考慮生產時的問題,如果不在開發初期這么做,DBA發現后只能迫使我們返工。 我們通常說數據庫調試是一門技術,更是一門藝術,這是因為很少有現成的規則可以適應一切問題的解決,你在一個系統上解決的問題在另一個系統上可能就不是問題了,反之亦然。涉及到查詢調整時,沒有一個答案是完全正確的,但這并不意味著你應該放棄。 適當遵循一些原則可以讓工作變得更加輕松,本文就列舉7個可以靈活運用的原則,它們可以幫助你提高SQL查詢速度,當然這些技巧你可以咨詢DBA獲得更多的信息。 1、用case代替update 要更新一條記錄,我們立即會想到update,這個問題非常常見,許多開發人員經常忽視這個原則,因為使用update看起來非常自然,非常合乎邏輯。 假設你從Customer表中提取記錄,你想將超過10萬美元的訂單標記為“Preferred”,因此你會想到使用一條update語句將CustomerRank列更新為“Preferred”,問題是update語句是有日志的,這就意味著每條記錄它會寫兩次,解決這個問題的辦法就是在SQL查詢中內嵌case語句,在向表寫入“Preferred”標志前,它會用訂單金額條件對每一行進行檢查,滿足條件的才會更新,性能的提升是驚人的。 2、不要盲目地重用代碼 這個問題也非常常見,在工作中直接用別人寫好的代碼是一件痛快的事情,你知道這些代碼可以查詢出你需要的數據,但問題是往往有些數據不是你需要的,但我們常常不愿意做一下修改,因此返回的數據集往往是一個超集,很可能多用一個外連接或是一個where子句就可以解決問題,因此在復用代碼時最好檢查一下,如有必要略做適應性修改。 3、只提取你需要的列 這個問題和2有點類似,但這次是指定具體的列。也許我們在使用select * 時感覺很暢快,多省事呀!如果要將每個列名都寫出來,太麻煩了,這是很多人的想法,但這種想法是錯誤的,因為這樣做會取出多余的數據列,我無數次看到犯這種錯誤的代碼,曾經有一位開發人員對一張有120列,上百萬行數據的表使用select * 查詢,但他只會用到其中的三五列,這是對資源的極大浪費,我們建議拒絕書寫select * ,你要什么就查詢什么,多余的返回結果對你沒用,雖然不影響你要實現的功能,但對數據庫性能卻有極大的影響。 4、盡可能只查詢一次大表 這也是我看到很多人犯的錯誤,例如,某存儲過程從一張上百萬條記錄的大表中取數據,開發人員想提取居住在加利福利亞且收入高于4萬美元的客戶信息,因此它先將居住在加利福利亞的客戶取出放在一張臨時表中,然后再查詢收入高于4萬美元的客戶,將查詢結果放入另一張臨時表中,最后,他連接這兩張臨時表查詢出最終的結果。 可能有人認為我是在開玩笑吧?但事實是確實有人這么做,這應該在一個查詢中就能完成,卻查詢了兩次大表。 有種稍微不同的情況是,當一個過程中的多個步驟需要大表的子集時,每一步可能都必須查詢一次大表。避免多次查詢的辦法是持久化第一次查詢的子集,然后將后面的步驟指向該持久化子集。 全新的路由器不僅讓你更穩定快速地連接無線網絡,更可以讓家中的智能設備連接在一起。 |
溫馨提示:喜歡本站的話,請收藏一下本站!