🚫 Ad Blocker Detected

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 刷新頁面

0%

前文

現在CICD越來越普遍,如要提高開發效率和自動化部屬跟Deploy系統有密不可分關係.

今天跟大家分享我開源專案ElectronicInvoice_TW如何利用
Github + Appveyor 來完成自動Deploy Package至Nuget上.

關於Appveyor

Appveyor是一個CI平台,可以透過Github Webhock來觸發一列動作來完成自動化部屬和建置

甚至Appveyor也有提供Nuget平台提供給開發人員.

使用GitHub帳號登入後,我們透過NEW PROJECT建立一個CI Job.

選擇我們要建立CICD專案.

Read more »

Agenda

前文

本篇會分享在撰寫SQL時建議和比較分享

永遠先考慮T-SQL改寫

  1. 符合SARG Statement進行撰寫
    • <、>、=、<=、>=、LIKE(視%所在位置,前面有%讓DB engine選擇不走INDEX)
  2. 不要在Where欄位做運算
  3. 使用ANSI 92相容的Join方式連接資料庫(避免使用舊式Join)
  4. 避免row by row操作

符合SARG格式的撰寫 + 適當Index設計可以解決大部分的效能問題

使用Like查詢建議

  • 盡量別把%放在前面
  • 如果查詢條件是CNAME LIKE '%范'想讓讓查詢走索引(seek 查詢),在後面加一個條件AND CNAME > ''讓查詢走Seek.
1
2
3
4
5
SELECT [MID]
,[NickName]
,[CName]
FROM [Member_Basic] WITH (NOLOCK)
WHERE CNAME LIKE '%范' AND CNAME > ''
Read more »

前文

本篇會跟大家對於SQL-Server資料表深入淺出的介紹.

關於子頁層

資料會存在子頁層中(page),一個Page大小為 8K/Page => 8092(8060 bytes)

每個Page除了存取資料還會存放一些MetaData,我們可以先當作是每個Page大小是8K

Heap資料表

如果一張資料表沒有Clustered Index就會為Heap資料表,這意味著Heap資料表的資料不會有排序一直把資料新增進資料表中,Heap資料表Insert資料快

適合使用在Log資料表、Event資料表、稽核資料表….一直新增資料但比較少查詢表

IAM(index allocation map)

當Heap資料表要搜尋資料SQL-Server透過IAM(index allocation map)去尋要掃描Page範圍,因為IAM會以範圍存在於檔案中的順序來表示它們,這代表循序的堆積掃描都將依檔案順序進行。

Read more »

Agenda

前文

本篇會分享在撰寫SQL時建議和比較分享

永遠先考慮T-SQL改寫

  1. 符合SARG Statement進行撰寫
    • <、>、=、<=、>=、LIKE(視%所在位置,前面有%讓DB engine選擇不走INDEX)
  2. 不要在Where欄位做運算
  3. 使用ANSI 92相容的Join方式連接資料庫(避免使用舊式Join)
  4. 避免row by row操作

符合SARG格式的撰寫 + 適當Index設計可以解決大部分的效能問題

使用Like查詢建議

  • 盡量別把%放在前面
  • 如果查詢條件是CNAME LIKE '%范'想讓讓查詢走索引(seek 查詢),在後面加一個條件AND CNAME > ''讓查詢走Seek.
1
2
3
4
5
SELECT [MID]
,[NickName]
,[CName]
FROM [Member_Basic] WITH (NOLOCK)
WHERE CNAME LIKE '%范' AND CNAME > ''
Read more »

前文

本篇會跟大家對於SQL-Server資料表深入淺出的介紹.

關於子頁層

資料會存在子頁層中(page),一個Page大小為 8K/Page => 8092(8060 bytes)

每個Page除了存取資料還會存放一些MetaData,我們可以先當作是每個Page大小是8K

Heap資料表

如果一張資料表沒有Clustered Index就會為Heap資料表,這意味著Heap資料表的資料不會有排序一直把資料新增進資料表中,Heap資料表Insert資料快

適合使用在Log資料表、Event資料表、稽核資料表….一直新增資料但比較少查詢表

IAM(index allocation map)

當Heap資料表要搜尋資料SQL-Server透過IAM(index allocation map)去尋要掃描Page範圍,因為IAM會以範圍存在於檔案中的順序來表示它們,這代表循序的堆積掃描都將依檔案順序進行。

Read more »

Agenda

前文

本系列文章

兩種基本索引

  • Clustered Index(叢集索引)
  • NonClustered Index(非叢集索引)

兩種Lookup(如果NonClustered Index無法滿足查詢結果執行)

  • RID Lookup
  • Key Lookup

本篇會介紹其他種類Index

Read more »

Agenda

前文

本系列文章

兩種基本索引

  • Clustered Index(叢集索引)
  • NonClustered Index(非叢集索引)

兩種Lookup(如果NonClustered Index無法滿足查詢結果執行)

  • RID Lookup
  • Key Lookup

本篇會介紹其他種類Index

Read more »

前文

Index第一個欄位至關重要它會影響資料統計值結果,Index一般建立在查詢條件的欄位

每個Index都擁有自己的B+ tree.

Index使用的資料結構(B+ tree)

B+ tree是一種資料結構這個資料結構被Index拿來使用,關於B+ tree網路上有很多資源可再自行尋找,所以我們來談談為什麼DataBase會使用B+ tree

Wiki講述B+ tree有其中一段

B+ tree是能夠保持資料穩定有序,其插入與修改擁有較穩定的對數時間複雜度。B+ tree元素由下而上插入,通過最大化在每個內部節點內的子節點的數目減少樹的高度,平衡操作不經常發生,而且效率增加了。這種價值得以確立通常需要每個節點在次級儲存中占據完整的磁碟塊或近似的大小。

簡白來說B+ tree有一個特性是他會把資料存在子頁(Leaf Page)中透過一個參考把每個子頁串聯起來,提高穩定度.

B+ tree資料結構如下圖,這個資料結在在範圍查詢時較B tree來的更穩定

Read more »

前文

Index第一個欄位至關重要它會影響資料統計值結果,Index一般建立在查詢條件的欄位

每個Index都擁有自己的B+ tree.

Index使用的資料結構(B+ tree)

B+ tree是一種資料結構這個資料結構被Index拿來使用,關於B+ tree網路上有很多資源可再自行尋找,所以我們來談談為什麼DataBase會使用B+ tree

Wiki講述B+ tree有其中一段

B+ tree是能夠保持資料穩定有序,其插入與修改擁有較穩定的對數時間複雜度。B+ tree元素由下而上插入,通過最大化在每個內部節點內的子節點的數目減少樹的高度,平衡操作不經常發生,而且效率增加了。這種價值得以確立通常需要每個節點在次級儲存中占據完整的磁碟塊或近似的大小。

簡白來說B+ tree有一個特性是他會把資料存在子頁(Leaf Page)中透過一個參考把每個子頁串聯起來,提高穩定度.

B+ tree資料結構如下圖,這個資料結在在範圍查詢時較B tree來的更穩定

Read more »

前言:

假如在系統中null散佈在有許多地方且null有相對應的邏輯或行為.這時候就很適合使用NullObject Pattern來解決,已Null Object取代null邏輯.

Null可能引申出來問題

我們知道在.Net或Java中大部分都是參考類型,而null是參考類型的預設值,我們來看看以下程式.

1
2
Person p = null;
Console.WriteLine(p.Age);

如果物件p指向null且取得p.Age時就會throw NullReferenceException,所以我們在使用一些參考類型物件前都會先判斷此物件是否為null,在執行後續邏輯.

在系統中某一兩個地方這樣判斷還好,但如果一直重複這樣的判斷會造成程式碼不必要的膨脹….

相較於「不帶有null邏輯」的程式碼,面對null邏輯往往需要花費更多心力.

範例程式

下面有段程式碼在calculate方法中會判斷CartModel物件是否為null並執行相對應邏輯

Read more »