日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQL优化准则

發布時間:2023/12/19 数据库 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL优化准则 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?1. 在長時間運行的查詢和短查詢中使用事務

如果預期有一個長時間運行的查詢,并且有大量的數據輸出時,開發者就應該在BEGIN TRAN 和END TRAN之間使用事務。

這樣事務會在緩沖區緩存為獨立事務,并會被分配特定內存,以此來提高處理速度。

2. 不要使用SELECT *

如果使用SELECT * 來選擇表中的所有記錄,那么一些不必要的記錄也被讀取、緩存,增加了磁盤的I/O和內存消耗。

3. 避免在WHERE子句中使用顯式或隱式函數,比如Convert ()

4. 避免在觸發器中執行長時間的操作

5. 適當使用臨時表和表變量

當結果集較小的時候,請盡量使用表變量;當結果集相當大時,使用臨時表。

6. 使用連接(JOIN)代替子查詢(Sub-Queries)

子查詢通常作為內聯代碼來使用,而連接(JOIN)則作為表來使用,這樣速度會更快。所以,應盡量避免在連接中使用子查詢。

7. 連接條件中表的順序

在連接條件中,應盡量首先使用較小的表,然后逐步使用較大的表。

8. 循環優化

如果操作在循環內部沒有任何影響,那么應盡量將操作放到循環外面,這樣可以減少不必要的重復工作。因為,SQL Server優化器不會自動識別這種低效率的代碼,更不會自動優化(其他一些語言的編譯器可以)。

9. 參數探測

不要在正執行的SP(存儲過程)中使用SP參數,這樣會導致參數探測(Parameter Sniffing)。應該在聲明和設置后再使用SP參數。由于這個原因,SP的行為在每次運行期間都不相同。

10. 當使用條件語句時,可以使用Index(索引)Hint(提示)

比如在SQL Server 2008中,可以使用Index hint,也可以使用fixed plan hint強制在查詢中使用hint,以提高運行速度。

11. 在聲明中明確指定存儲過程中數據類型的大小

開發者隨機聲明數據類型的大小是不可取的,如:Varchar (500)。這在執行時會在緩沖區中增加不必要的預留空間。

12. 在查詢中有效利用MAXDOP(最大并行度)設置

詢問數據庫管理員關于四核CPU可用性的設置,包括內存的設置,然后適當使用hint,可以有效改善查詢速度。

13. SQL Server 2008中的GROUPING SETS

如果數據庫服務器為SQL Server 2008,那么可以在所有的Unions中使用Grouping Set來代替Group By。這樣在Union中重新進行group by排序時,優化器不會每次都制定一個計劃。

14. 當發生死鎖時,總是使用With (nolock) 和With (rowlock)

15. 使用Update From,而不是簡單的Update

Sql代碼
  • UPDATE titleauthor
  • SET royaltyper = 90
  • WHERE au_id = (SELECT au_id FROM authors
  • WHERE au_lname = ‘Ringer’ AND au_fname = ‘Albert’)
  • AND title_id = (SELECT title_id FROM titles
  • WHERE title = ‘Life without Fear’)
  • Update from
  • UPDATE titleauthor
  • SET royaltyper = 90
  • FROM authors a, titles t
  • WHERE titleauthor.au_id = a.au_id
  • AND a.au_lname = ‘Ringer’
  • AND a.au_fname = ‘Albert’
  • AND titleauthor.title_id = t.title_id
  • AND t.title = ‘Life Without Fear’
  • UPDATE titleauthor SET royaltyper = 90 WHERE au_id = (SELECT au_id FROM authors WHERE au_lname = ‘Ringer’ AND au_fname = ‘Albert’) AND title_id = (SELECT title_id FROM titles WHERE title = ‘Life without Fear’) Update from UPDATE titleauthor SET royaltyper = 90 FROM authors a, titles t WHERE titleauthor.au_id = a.au_id AND a.au_lname = ‘Ringer’ AND a.au_fname = ‘Albert’ AND titleauthor.title_id = t.title_id AND t.title = ‘Life Without Fear’


    16. 使用UNION ALL代替UNION

    UNION和UNION ALL的差別就在于UNION會對數據做一個distanct的動作,而這個distanct動作的速度則取決于現有數據的數量,數量越大時間越長。因此盡量使用UNION ALL來代替UNION。

    17. 避免高成本操作,如NOT LIKE?

    轉載于:https://blog.51cto.com/yaomingkai/1131609

    總結

    以上是生活随笔為你收集整理的SQL优化准则的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。