前文
隨著業務量增長,資料庫的複雜程度也會成正比增長
這裡跟大家分享一個好用壓測資料庫工具SqlQueryStress
在Dev可以模擬高併發時產生的問題,下面會分享我之前Prod遇到問題並解決問題過程
詳細資訊可以看SQLServer-Merge-condition-problem
SQLQueryStress介紹
在執行效能調教和測試高併發產生問題時,我們會關注幾個特別資訊
- CPU執行時間
- logical read數值
- Total執行時間
在此工具都有相對應的資訊提供給我們觀看
Please disable your AD blocker to continue using this site. Ads help us keep the content free! please press keyboard F5 to refresh page after disabled AD blocker
請關閉廣告攔截器以繼續使用本網站。廣告有助於我們保證內容免費。謝謝! 關閉後請按 F5 刷新頁面
隨著業務量增長,資料庫的複雜程度也會成正比增長
這裡跟大家分享一個好用壓測資料庫工具SqlQueryStress
在Dev可以模擬高併發時產生的問題,下面會分享我之前Prod遇到問題並解決問題過程
詳細資訊可以看SQLServer-Merge-condition-problem
在執行效能調教和測試高併發產生問題時,我們會關注幾個特別資訊
在此工具都有相對應的資訊提供給我們觀看
隨著業務量增長,資料庫的複雜程度也會成正比增長
這裡跟大家分享一個好用壓測資料庫工具SqlQueryStress
在Dev可以模擬高併發時產生的問題,下面會分享我之前Prod遇到問題並解決問題過程
詳細資訊可以看SQLServer-Merge-condition-problem
在執行效能調教和測試高併發產生問題時,我們會關注幾個特別資訊
在此工具都有相對應的資訊提供給我們觀看
在系統中多少會遇到某些交易間需要互斥(不然容易造成DeadLock
).
在我們當前系統中有許多動作間需要互斥,不然會有DeadLock問題
藉由已經分析DeadLock Report後,我開始構思如何讓建立Lock可以變得更容易且好理解.
所以就建構出此Lock架構.
我們只需要做幾個步驟:
LockerInterceptor
攔截器標籤. LockAttribute
標籤[Lock(LockKey = "Your lock Key")]
(Key
屬性是必填的)目前寫法是針對單一Server Mutiple Thread來建立互斥Lock. 假如有遇到多台Servers需要建立互斥模式可以,參考Redis的
Redlock.Net
.
使用方法如下,這樣在多執行緒系統中MethodA1
跟MethodB_A
就不會有同時執行問題,這樣就可以造成這兩個動作互斥.
在系統中多少會遇到某些交易間需要互斥(不然容易造成DeadLock
).
在我們當前系統中有許多動作間需要互斥,不然會有DeadLock問題
藉由已經分析DeadLock Report後,我開始構思如何讓建立Lock可以變得更容易且好理解.
所以就建構出此Lock架構.
我們只需要做幾個步驟:
LockerInterceptor
攔截器標籤. LockAttribute
標籤[Lock(LockKey = "Your lock Key")]
(Key
屬性是必填的)目前寫法是針對單一Server Mutiple Thread來建立互斥Lock. 假如有遇到多台Servers需要建立互斥模式可以,參考Redis的
Redlock.Net
.
使用方法如下,這樣在多執行緒系統中MethodA1
跟MethodB_A
就不會有同時執行問題,這樣就可以造成這兩個動作互斥.
前文:
寫.Net 寫一陣子了 突然覺得一些基本功好重要
之前都沒發現原來.Net 有三種區塊的記憶體空間
這三個區域都有他們各自的含義….
</div>
.Net 有三種區塊的記憶體空間
Globle:
Heap :
之前有跟大家介紹資料庫交易中的ACID,今天我們就來談談常常聽到Lock
在討論Lock前我們必須先了解,為什麼會有Lock?
假如你的系統能保證只有一個使用著操作每個資源,其實也就不用lock存在,但現實生活中往往有個命令對於同一個資源操作.這時候我們為了確保資料正確性,必須使用lock來避免Racing Condition.
在早期系統我們要儲存資料會存放檔案在Disk並使用類似Excel方式來儲存,但這會導致每次讀取只有有一個使用者(因為對於檔案上Lock),被lock資源其他人就無法存入
在Sql-Server
Lock有分兩種圍度
之前有跟大家介紹資料庫交易中的ACID,今天我們就來談談常常聽到Lock
在討論Lock前我們必須先了解,為什麼會有Lock?
假如你的系統能保證只有一個使用著操作每個資源,其實也就不用lock存在,但現實生活中往往有個命令對於同一個資源操作.這時候我們為了確保資料正確性,必須使用lock來避免Racing Condition.
在早期系統我們要儲存資料會存放檔案在Disk並使用類似Excel方式來儲存,但這會導致每次讀取只有有一個使用者(因為對於檔案上Lock),被lock資源其他人就無法存入
在Sql-Server
Lock有分兩種圍度
JOIN
條件範圍時,執行計畫預估值容易不準確,這也間接導致查詢效能不好.
就算有建立Index也會遇到上述問題
假如我們想要提升JOIN
條件範圍效能並讓Index可以發揮最大最用可以怎麼做?
就讓我利用一個範例來跟大家分享.
此範例有使用到三張表
1 | CREATE TABLE [dbo].[Product]( |
我們利用
T99.CreateDate
來跟ReportPeriod
判斷是屬於哪期報表.
JOIN
條件範圍時,執行計畫預估值容易不準確,這也間接導致查詢效能不好.
就算有建立Index也會遇到上述問題
假如我們想要提升JOIN
條件範圍效能並讓Index可以發揮最大最用可以怎麼做?
就讓我利用一個範例來跟大家分享.
此範例有使用到三張表
1 | CREATE TABLE [dbo].[Product]( |
我們利用
T99.CreateDate
來跟ReportPeriod
判斷是屬於哪期報表.
假如要判斷資料是否存在於資料表中,存在就更新,不存在就新增.
這時我們可以使用Merge
來幫助我們完成.
當兩個資料表有複雜的比對的特性時,
MERGE
陳述式的條件式行為表現最佳。
有了Merge
我們就不用使用IF EXISTS
.
一切都是這麼完美…
直到到有一天Merge
在Prod撞到一個問題..
使用語法user defined table type & Table如下
1 |
|