• <sub id="h4knl"><ol id="h4knl"></ol></sub>
    <sup id="h4knl"></sup>
      <sub id="h4knl"></sub>

      <sub id="h4knl"><ol id="h4knl"><em id="h4knl"></em></ol></sub><s id="h4knl"></s>
      1. <strong id="h4knl"></strong>

      2. SQL語句的優化問題教程

        時間:2024-10-03 00:19:15 SQL 我要投稿
        • 相關推薦

        SQL語句的優化問題教程

          在實際的工作中,尤其是在生產環境里邊,SQL語句的優化問題十分的重要,它對數據庫的性能的提升也起著顯著的作用.我們總是在抱怨機器的性能問題,總是在抱怨并發訪問所帶來的瑣問題,但是如果我們對沒一條SQL語句進行優化,盡管不能說可以解決全部問題,但是至少可以解決大部分問題.

          1.Top排序問題.

          我們經常要對表某個字段進行排序,然后取前N名.所以我們會寫如下的SQL語句:

          selecttop100*from表

          orderbyScoredesc

          如果表非常大的話,那么這樣的操作是非常消耗資源的,因為SQLSERVER要對整個表進行排序,然后取前N條記錄.這樣的造作是在Temdb里邊進行的,所以極端的時候會報Log已滿這樣的錯誤.為了避免進行全表的排序,我們要做的僅僅是在Score上建立索引,這樣因為Score索引的葉級是有序的,只要在Score所以的頁級取前100個,然后根據書簽查找到實際的記錄,這樣對DB的性能就會有極大的提升.

          2.同一天問題.

          我們經常要查找和一個日期同一天的記錄,所以我們回寫如下的SQL語句;

          declare@DateTimedatetime

          set@DateTime=getdate()

          select*from表

          whereconvert(10),F_Time,120)=convert(10),@DateTime,120)

          但是這樣寫的SQL語句帶來的問題就是不能使用F_Time上的索引了.為了近可能的使用F_Time上的索引,我們可以使用時間段查詢的方式來代替上邊的語句.

          declare@startdatetime

          declare@enddatetime

          declare@datetimedatetime

          set@datetime=getdate()

          tart=convert(10),@datetime,120)--一天的其始時間

          set@end=dateadd(ss,-1,dateadd(d,1,@start))--一天的結束時間

          select*from表whereF_Timebetween@startand@end

          這樣就解決了使用不上索引的問題.

          3.利用索引進行分組操作.】我們經常要對某一字段進行分組,而對另外一些字段進行聚合操作.如果我們對分組的字段合理的使用索引,可以加快我們分組的速度.下邊以Northwind的Orders表為例:

          --orders表的EmployeeID上建有索引.

          selectEmployeeID,count(*)

          fromorders

          groupbyEmployeeID

          --查看執行計劃,此查詢利用了EmployeeID上的索引.如改成如下查詢:

          selectEmployeeID,sum(Freight)

          fromorders

          groupbyEmployeeID

          --查看執行計劃,此查詢則沒有使用EmployeeID上的索引.而是使用了全表掃描.那么原因是什么呢?是因為Freight沒有在EmployeeID的索引上,所以通過索引不能得到結果.而如果通過書簽查詢的成本太高,所以SQLSERVER選擇了使用全表掃描.而如果我們執行在EmployeeID和Freight上建立復合索引呢?

          createindexidx_EmployeeIDonorders(EmployeeID,Freight)

          --再次執行第二個查詢.查看執行計劃.SQLSERVER使用的我們建立的索引.只需要使用索引就可以查詢到結果,極大的提高了我們的查詢速度.

        《&.doc》
        将本文的Word文档下载到电脑,方便收藏和打印
        推荐度:
        点击下载文档

        【SQL語句的優化問題教程】相關文章:

        SQL優化大全09-09

        oracle的sql語句01-21

        關于sql多條件多字段排序的教程10-23

        SQL查詢語句大全10-24

        SQL語句的理解原則10-05

        mysql SQL語句積累參考10-02

        sql語句的各種模糊查詢08-25

        Oracle的sql語句模擬試題及答案10-12

        SQL語句中的正則表達示07-28

        關于硬盤的維護與優化問題02-20

        在线咨询
        国产高潮无套免费视频_久久九九兔免费精品6_99精品热6080YY久久_国产91久久久久久无码
      3. <sub id="h4knl"><ol id="h4knl"></ol></sub>
        <sup id="h4knl"></sup>
          <sub id="h4knl"></sub>

          <sub id="h4knl"><ol id="h4knl"><em id="h4knl"></em></ol></sub><s id="h4knl"></s>
          1. <strong id="h4knl"></strong>

          2. 亚洲国产h在线 | 久久免费看少妇A级精品视频 | 亚洲欧美伊人久久综合一区二区 | 亚洲色婷婷踪合久久二区 | 欧美视频一区二区 | 亚洲国产精品综合久久20 |

            SQL語句的優化問題教程

              在實際的工作中,尤其是在生產環境里邊,SQL語句的優化問題十分的重要,它對數據庫的性能的提升也起著顯著的作用.我們總是在抱怨機器的性能問題,總是在抱怨并發訪問所帶來的瑣問題,但是如果我們對沒一條SQL語句進行優化,盡管不能說可以解決全部問題,但是至少可以解決大部分問題.

              1.Top排序問題.

              我們經常要對表某個字段進行排序,然后取前N名.所以我們會寫如下的SQL語句:

              selecttop100*from表

              orderbyScoredesc

              如果表非常大的話,那么這樣的操作是非常消耗資源的,因為SQLSERVER要對整個表進行排序,然后取前N條記錄.這樣的造作是在Temdb里邊進行的,所以極端的時候會報Log已滿這樣的錯誤.為了避免進行全表的排序,我們要做的僅僅是在Score上建立索引,這樣因為Score索引的葉級是有序的,只要在Score所以的頁級取前100個,然后根據書簽查找到實際的記錄,這樣對DB的性能就會有極大的提升.

              2.同一天問題.

              我們經常要查找和一個日期同一天的記錄,所以我們回寫如下的SQL語句;

              declare@DateTimedatetime

              set@DateTime=getdate()

              select*from表

              whereconvert(10),F_Time,120)=convert(10),@DateTime,120)

              但是這樣寫的SQL語句帶來的問題就是不能使用F_Time上的索引了.為了近可能的使用F_Time上的索引,我們可以使用時間段查詢的方式來代替上邊的語句.

              declare@startdatetime

              declare@enddatetime

              declare@datetimedatetime

              set@datetime=getdate()

              tart=convert(10),@datetime,120)--一天的其始時間

              set@end=dateadd(ss,-1,dateadd(d,1,@start))--一天的結束時間

              select*from表whereF_Timebetween@startand@end

              這樣就解決了使用不上索引的問題.

              3.利用索引進行分組操作.】我們經常要對某一字段進行分組,而對另外一些字段進行聚合操作.如果我們對分組的字段合理的使用索引,可以加快我們分組的速度.下邊以Northwind的Orders表為例:

              --orders表的EmployeeID上建有索引.

              selectEmployeeID,count(*)

              fromorders

              groupbyEmployeeID

              --查看執行計劃,此查詢利用了EmployeeID上的索引.如改成如下查詢:

              selectEmployeeID,sum(Freight)

              fromorders

              groupbyEmployeeID

              --查看執行計劃,此查詢則沒有使用EmployeeID上的索引.而是使用了全表掃描.那么原因是什么呢?是因為Freight沒有在EmployeeID的索引上,所以通過索引不能得到結果.而如果通過書簽查詢的成本太高,所以SQLSERVER選擇了使用全表掃描.而如果我們執行在EmployeeID和Freight上建立復合索引呢?

              createindexidx_EmployeeIDonorders(EmployeeID,Freight)

              --再次執行第二個查詢.查看執行計劃.SQLSERVER使用的我們建立的索引.只需要使用索引就可以查詢到結果,極大的提高了我們的查詢速度.