一、數據查詢部分
1、 看到執行計划有兩種方式,對sql語句按Ctrl+L,或按Ctrl+M打開顯示執行計划窗口每次執行sql都會顯示出相應的執行計划
2、 執行計划的圖表是從右向左看的
3、 SQL Server有幾種方式查找數據記錄
[Table Scan] 表掃描(最慢),對表記錄逐行進行檢查
[Clustered Index Scan] 聚集索引掃描(較慢),按聚集索引對記錄逐行進行檢查
[Index Scan] 索引掃描(普通),根據索引濾出部分數據在進行逐行檢查
[Index Seek] 索引查找(較快),根據索引定位記錄所在位置再取出記錄
[Clustered Index Seek] 聚集索引查找(最快),直接根據聚集索引獲取記錄
(如果有些sql執行很慢可以看一下執行計划是否包含太多“掃描”操作,如果有可以考慮為這些字段建立索引,建立索引切記不要再經常有更新操作的字段上建立,每次更新都會導致重建索引的操作,也會影響性能,0或1這種標識狀態的字段因為大部分數據都是一樣的建立索引也沒有什么作用)
(索引就兩種,1是聚集索引,2個非聚集索引,聚集索引每張表只能有一個,非聚集索引每張表可以有多個,主鍵Id就是典型的聚集索引,聚集索引是順序排列的類似於字典查找拼音a、b、c……和字典文字內容順序是相同的,非聚集索引與內容是非順序排列的,類似字典偏旁查找時,同一個偏旁‘馬’的漢字可能一個在第10頁一個在第100頁)
4、
⑴沒有主鍵的表查詢[表掃描]
⑵有主鍵的表查詢[聚集索引掃描]
⑶建立非聚集索引的表查詢[索引掃描+書簽查找]
書簽查找:通過非聚集索引找到所求的行,但這個索引並不包含顯示的列,因此還要額外去基本表中找到這些列,所以要進行鍵查找,如果基本表在堆中則Key Lookup會變成RID查找,這兩個查找統稱為書簽查找。
⑷建立非聚集索引並把其他顯示列加入索引中[索引查找]
⑸建立非聚集索引並把其他顯示列加入索引中並把聚集索引列當作條件[聚集索引查找]
性能優化,提升效率,資源優化配置,壓榨系統性能,OOM,CPU,GC,JVM
1.方法內聯
方法中的對象大部分是朝生夕死
棧(生命周期結束回收)--》堆(GC)
2.SQLServer技巧-
強大的插件 Redgate SQL Toolbelt,sql monitor,redgote deploy
www.Redgate.com
4. sql pretty printer
轉載:
https://blog.csdn.net/zy925165472/article/details/87164096
https://blog.csdn.net/timchen44
https://www.cnblogs.com/taiyonghai/p/5594826.html
5.優化方法:
5.1 添加索引:快速定位數據查找
5.2 in 查詢用臨時表,表值參數
5.3. 多表多條件left join,先執行inner join 根據輸入條件篩選數據后在left 其他表,減少查詢數據,第1次過濾調大部數據;
5.4.盡量減少回主表查詢的字段,節約查詢時間,少量字段可以添加包含列,大量字段可以先inner joion,在left join,或根據分頁獲取100條再left join
5.5.查詢條件 WHERE a.PayTime >= DATEADD(DAY, -30, GETDATE()) AND a.PayTime< GETDATE()
最好寫成變量或明文:WHERE a.PayTime >= ‘2021-12-06 17:15:00’ AND a.PayTime< ‘2022-01-05 17:15:00’, 函數不會走索引;
5.6. 臨時表建主鍵,建索引在聯合查詢,速度會很快;
5.7. 將聯合查詢的結果集放到臨時表里,在和表Join 查詢,查詢篩選的主要條件需建索引。
5.8 select count() 留一個id,去掉其他多余的查詢字段和left join 查詢(注意業務需要的left 表中的重復行,主表1個id對應left表中多行,會把多行查詢出來)
5.9多表join,通過把查詢列里不同表的字段注釋后,看查詢速度,看執行計划走的索引,添加包含索引后,來優化整個慢查詢
----------建立索引的原則----------------------------
DB 優化:
客戶端-->協議層--》執行計划
數據庫是把東西有序放好,還能隨時找到,在硬盤上,是一個應用程序
索引:page數據頁,IAM page ,index page 索引頁
建立索引的原則:
1.主鍵必須建立索引(推薦數值主鍵,性能最高)
2.外鍵列也要索引
3.經常查詢的建立索引
4.經常在where里面
5.order by group by distinct
執行計划:
1.table scan 全表掃描
2.cluster index scan
3.index scan
常規的sql 優化建議
1.避免對列的計算,任務形式的都要避免
2.In 查詢,or 查詢,索引會失效,
3.in 換exists
not in 不要用,不走索引
4. is null ,is not null 都不走索引;
5.<> 也不走索引,可以拆分成 > 和<
6. join時,連接越少,性能越高
SQL Server執行計划中圖標的功能說明
https://blog.csdn.net/TimChen44/article/details/117901370
[轉] 50種方法巧妙優化你的SQL Server數據庫
https://www.cnblogs.com/pctzhang/archive/2010/04/08/1706984.html