前言
假如要判斷資料是否存在於資料表中,存在就更新,不存在就新增.
這時我們可以使用Merge
來幫助我們完成.
當兩個資料表有複雜的比對的特性時,
MERGE
陳述式的條件式行為表現最佳。
有了Merge
我們就不用使用IF EXISTS
.
一切都是這麼完美…
直到到有一天Merge
在Prod撞到一個問題..
問題描述
使用語法user defined table type & Table如下
1 |
|
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 刷新頁面
假如要判斷資料是否存在於資料表中,存在就更新,不存在就新增.
這時我們可以使用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
方法).
SQL Server的QO(Query Optimizer)透過cost-based model
來選擇一個最合適計畫(估算成本最低)來執行查詢
注意每個執行計畫是使用CPU來做估算,使用過的執行計畫一般會Cache起來已便下次使用
QO會依照基數估計(Cardinality estimation)來產生執行計畫,基數估計扮演一個很重要的角色
SQL Server統計值是對於每個Index或欄位資料分布做紀錄,任何型態都支援統計值資料.
過期的統計值資料導致QO誤判產生不良執行計畫
在我們建立Index
時,統計值會自動創建。此外當欄位在查詢裡被使用(作為WHERE條件的一部分,group by子句,join條件)統計值會被自動建立
每個索引都會有自己個統計資訊,在UI
查看統計資訊如下圖.
SQL Server的QO(Query Optimizer)透過cost-based model
來選擇一個最合適計畫(估算成本最低)來執行查詢
注意每個執行計畫是使用CPU來做估算,使用過的執行計畫一般會Cache起來已便下次使用
QO會依照基數估計(Cardinality estimation)來產生執行計畫,基數估計扮演一個很重要的角色
SQL Server統計值是對於每個Index或欄位資料分布做紀錄,任何型態都支援統計值資料.
過期的統計值資料導致QO誤判產生不良執行計畫
在我們建立Index
時,統計值會自動創建。此外當欄位在查詢裡被使用(作為WHERE條件的一部分,group by子句,join條件)統計值會被自動建立
每個索引都會有自己個統計資訊,在UI
查看統計資訊如下圖.
現在CICD越來越普遍,如要提高開發效率和自動化部屬跟Deploy系統有密不可分關係.
今天跟大家分享我開源專案ElectronicInvoice_TW如何利用
Github + Appveyor 來完成自動Deploy Package至Nuget上.
Appveyor是一個CI平台,可以透過Github Webhock來觸發一列動作來完成自動化部屬和建置
甚至Appveyor也有提供Nuget平台提供給開發人員.
使用GitHub帳號登入後,我們透過NEW PROJECT
建立一個CI Job.
選擇我們要建立CICD專案.
現在CICD越來越普遍,如要提高開發效率和自動化部屬跟Deploy系統有密不可分關係.
今天跟大家分享我開源專案ElectronicInvoice_TW如何利用
Github + Appveyor 來完成自動Deploy Package至Nuget上.
Appveyor是一個CI平台,可以透過Github Webhock來觸發一列動作來完成自動化部屬和建置
甚至Appveyor也有提供Nuget平台提供給開發人員.
使用GitHub帳號登入後,我們透過NEW PROJECT
建立一個CI Job.
選擇我們要建立CICD專案.
本篇會分享在撰寫SQL時建議和比較分享
永遠先考慮T-SQL改寫
Where
欄位做運算 ANSI 92
相容的Join方式連接資料庫(避免使用舊式Join
)符合SARG格式的撰寫 + 適當Index設計可以解決大部分的效能問題
%
放在前面CNAME LIKE '%范'
想讓讓查詢走索引(seek 查詢),在後面加一個條件AND CNAME > ''
讓查詢走Seek.1 | SELECT [MID] |