前文:
寫.Net 寫一陣子了 突然覺得一些基本功好重要
之前都沒發現原來.Net 有三種區塊的記憶體空間
這三個區域都有他們各自的含義….
</div>
.Net 有三種區塊的記憶體空間
Globle:
- 全域記憶體
- 主要存放全域變數或宣告為static的靜態變數
Heap :
- 存放參考類型(可動態產生的空間)
- 運行期間分配記憶體位置(這就是為什麼參考類型的類別要new)
- 基本是Class關鍵字
前文:
寫.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 |
|
假如要判斷資料是否存在於資料表中,存在就更新,不存在就新增.
這時我們可以使用Merge
來幫助我們完成.
當兩個資料表有複雜的比對的特性時,
MERGE
陳述式的條件式行為表現最佳。
有了Merge
我們就不用使用IF EXISTS
.
一切都是這麼完美…
直到到有一天Merge
在Prod撞到一個問題..
使用語法user defined table type & Table如下
1 |
|
資料庫系統在寫入或新增資料時,為了確保交易正確可靠性,所以具備
這就是我們說的ACID.
下面我會跟大家簡述ACID.
所有Logical Unit都必須符合原子性
整個流程要不是全部成功,不然就整段失敗,不會有部分完成
sample data.
1 | IF (SELECT OBJECT_ID('dbo.ProductTest')) IS NOT NULL |
資料庫系統在寫入或新增資料時,為了確保交易正確可靠性,所以具備
這就是我們說的ACID.
下面我會跟大家簡述ACID.
所有Logical Unit都必須符合原子性
整個流程要不是全部成功,不然就整段失敗,不會有部分完成
sample data.
1 | IF (SELECT OBJECT_ID('dbo.ProductTest')) IS NOT NULL |
下面有兩個虛擬程式碼
1 | int times = 30000000; |
請問下面這兩段程式碼有沒有差別?
1 | s = $"{times}"; |
$""
這個程式碼是string.Format()
語法糖
如果知道差別的同學,恭喜你已經可以下課了
如果不知道差別也沒關係,讓我細細講述.
在String.Format
方法有一個重載方法,可以看到裡面吃參數是params object[]
這可以讓我們傳進東西當作參數(他會在方法中呼叫ToString
方法).