乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      優(yōu)化 SQL SELECT 語句性能的6 個簡單技巧

       weijianian 2016-10-07


      英文:msiman.ga

      譯者:伯樂在線 - xianhu

      鏈接:http://blog./86391/


      SELECT語句的性能調(diào)優(yōu)有時是一個非常耗時的任務(wù),在我看來它遵循帕累托原則。20%的努力很可能會給你帶來80%的性能提升,而為了獲得另外20%的性能提升你可能需要花費80%的時間。除非你在金星工作,那里的每一天都等于地球上的243天,否則交付期限很有可能使你沒有足夠的時間來調(diào)優(yōu)SQL查詢。


      根據(jù)我多年編寫和運行SQL語句的經(jīng)驗,我開始開發(fā)一個檢查列表,當(dāng)我試圖提高查詢性能時供我參考。在進行查詢計劃和閱讀我使用的數(shù)據(jù)庫文檔之前,我會參考其中的內(nèi)容,數(shù)據(jù)庫文檔有時會很復(fù)雜。我的檢查列表絕對說不上全面或科學(xué),它更像是一個保守計算,但我可以說,遵循這些簡單的步驟大部分時間我確實能得到性能提升。檢查列表如下。


      檢查索引


      在SQL語句的WHERE和JOIN部分中用到的所有字段上,都應(yīng)該加上索引。


      限制工作數(shù)據(jù)集的大小


      檢查那些SELECT語句中用到的表,看看你是否可以應(yīng)用WHERE子句進行過濾。一個典型的例子是,當(dāng)表中只有幾千行記錄時,一個查詢能夠很好地執(zhí)行。但隨著應(yīng)用程序的成長,查詢慢了下來。解決方案或許非常簡單,限制查詢來查看當(dāng)前月的數(shù)據(jù)即可。


      當(dāng)你的查詢語句帶有子查詢時,注意在子查詢的內(nèi)部語句上使用過濾,而不是在外部語句上。


      只選擇你需要的字段


      額外的字段通常會增加返回數(shù)據(jù)的紋理,從而導(dǎo)致更多的數(shù)據(jù)被返回到SQL客戶端。另外:


      ·使用帶有報告和分析功能的應(yīng)用程序時,有時報告性能低是因為報告工具必須對收到的、帶有詳細(xì)形式的數(shù)據(jù)做聚合操作。


      ·偶爾查詢也可能運行地足夠快,但你的問題可能是一個網(wǎng)絡(luò)相關(guān)的問題,因為大量的詳細(xì)數(shù)據(jù)通過網(wǎng)絡(luò)發(fā)送到報告服務(wù)器。


      ·當(dāng)使用一個面向列的DBMS時,只有你選擇的列會從磁盤讀取。在你的查詢中包含的列越少,IO開銷就越小。


      移除不必要的表


      移除不必要的表的原因,和移除查詢語句中不需要的字段的原因一致。


      編寫SQL語句是一個過程,通常需要大量編寫和測試SQL語句的迭代過程。在開發(fā)過程中,你可能將表添加到查詢中,而這對于SQL代碼返回的數(shù)據(jù)可能不會有任何影響。一旦SQL運行正確,我發(fā)現(xiàn)許多人不會回顧他們的腳本,不會刪除那些對最終的返回數(shù)據(jù)沒有任何影響和作用的表。通過移除與那些不必要表的JOINS操作,你減少了大量數(shù)據(jù)庫必須執(zhí)行的流程。有時,就像移除列一樣,你會發(fā)現(xiàn)你減少的數(shù)據(jù)又通過數(shù)據(jù)庫返回來了。


      移除外部連接查詢


      這說起來容易做起來難,它取決于改變表的內(nèi)容有多大的影響。一個解決辦法是通過在兩個表的行中放置占位符來刪除OUTER JOINS操作。假設(shè)你有以下的表,它們通過定義OUTER JOINS來確保返回所有的數(shù)據(jù):


      customer_idcustomer_name
      1John Doe
      2Mary Jane
      3Peter Pan
      4Joe Soap

      customer_idsales_person
      NULLNewbee Smith
      2Oldie Jones
      1Another Oldie
      NULLGreenhorn


      解決辦法是在customer表的行中增加一個占位符,并更新sales表中的所有NULL值到占位符。


      customer_idcustomer_name
      0NO CUSTOMER
      1John Doe
      2Mary Jane
      3Peter Pan
      4Joe Soap

      customer_idsales_person
      0Newbee Smith
      2Oldie Jones
      1Another Oldie
      0Greenhorn


      你不只是刪除了對OUTER JOIN操作的依賴,同時標(biāo)準(zhǔn)化了沒有客戶的銷售人員如何表示。其他開發(fā)人員不必編寫額外語句,例如ISNULL(customer_id, “No customer yet”)。


      刪除JOIN和WHERE子句中的計算字段


      這是另外一個有時可能說起來容易做起來難的技巧,它取決于你更改表模式的權(quán)限大小??梢詫⑦B接語句中用到的計算字段作為一個新字段在表中創(chuàng)建。給出以下SQL語句:


      FROM sales a

      JOIN budget b ON    ((YEAR(a.sale_date)* 100) + MONTH(a.sale_date)) = b.budget_year_month


      在sales表中利用年和月增加一列,可以提高性能。更新后的SQL語句將如下:


      SELECT * FROM PRODUCTSFROM sales a

      JOIN budget b ON    a.sale_year_month = b.budget_year_month


      總結(jié)


      上邊的建議可以歸結(jié)為以下幾點:


      ·檢查索引
      ·在所需要的最小數(shù)據(jù)集上操作
      ·移除不必要的字段和表
      ·移除你JOIN和WHERE子句中的計算操作


      如果所有的這些建議都沒能提高你的SQL查詢性能,最后一個建議是搬去金星吧。你需要的就是一天能調(diào)優(yōu)你的SQL語句。



      關(guān)注「數(shù)據(jù)庫開發(fā)」

      看更多精選數(shù)據(jù)庫技術(shù)文章

      ↓↓↓

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多