星期五, 9月 28, 2012

[SQL] 字串中特定字串出現次數

直接利用例子來說明如何計算字串中特定字串出現次數。
SELECT 
  T.String ,
  (LEN(T.String) - LEN(REPLACE(T.String,'A',''))) / LEN('A') AS 'A 出現次數',
  (LEN(T.String) - LEN(REPLACE(T.String,'23',''))) / LEN('23')  AS '23 出現次數' ,
  (LEN(T.String) - LEN(REPLACE(T.String,'DEF',''))) / LEN('DEF')  AS 'DEF 出現次數'
FROM
  (
    SELECT '123456123456' AS String
    UNION ALL
    SELECT 'ABCDEF'
    UNION ALL
    SELECT '123ABC321'
    UNION ALL
    SELECT 'DEF456ABC'
  ) AS T
  • 邏輯說明
    利用 REPLACE() 函數來取代特定字串,再利用原字串和特定字串取代後長度相減,除以特定字串長度來計算出現次數,下圖示把文字說明改為數學式來表達。
[SQL] 字串中特定字串出現次數-2
  • 結果
[SQL] 字串中特定字串出現次數-1

星期五, 9月 21, 2012

[SQL] 複合索引 - 第一欄位

複合索引是利用多個欄位來組成索引。

利用 AdventureWorks2012 內的 Person 資料表的非叢集式索引(NonClustered Index,簡稱索引) IX_Person_LastName_FirstName_MiddleName 來說明欄位順序的影響。

IX_Person_LastName_FirstName_MiddleName 索引是由 LastName、FirstName 和 MiddleName 三個欄位依序組成

[SQL] 複合索引欄位順序的影響-3

從 Person 資料表中選定一位人名針對三個欄位組合來搜尋資料並觀察 Query Optimizer(簡稱 QO) 選擇執行計畫時使用索引的狀態
  1. 針對 LastName、FirstName 和 MiddleName 搜尋
    SELECT LastName , FirstName , MiddleName  
    FROM  [Person].[Person] 
    WHERE LastName = 'Ting' AND FirstName = 'Hung-Fu' AND MiddleName = 'T'
    
    [SQL] 複合索引欄位順序的影響-1
  2. 針對 LastName 和 MiddleName 搜尋
    SELECT LastName , FirstName , MiddleName  
    FROM  [Person].[Person] 
    WHERE LastName = 'Ting' AND MiddleName = 'T'
    
    [SQL] 複合索引欄位順序的影響-1
  3. 針對 FirstName 和 MiddleName 搜尋
    SELECT LastName , FirstName , MiddleName  
    FROM  [Person].[Person] 
    WHERE FirstName = 'Hung-Fu' AND MiddleName = 'T'
    
    [SQL] 複合索引欄位順序的影響-2
從上面三個例子可以看出搜尋條件中有包含 LastName 欄位的話,QO 會利用索引搜尋(Index Seek)來搜尋資料,沒有的話則是利用索引掃描(Index Scan)。

複合索引(IX_Person_LastName_FirstName_MiddleName)雖由多個欄位組成,但其資料在索引分頁( Index Page)上,只有第一個欄位(LastName)資料是經過排序。下圖是擷取 Person 資料表內部分資料,來模擬資料在索引分頁(Index Page)上的理論資料排序情況。

[SQL] 複合索引欄位順序的影響-4

而從統計資訊來觀察,會發現複合索引統計資訊內只會保存第一個欄位(LastName )的資料長條圖(Histogram)

[SQL] 複合索引欄位順序影響-5

複合索引的第一個欄位選擇非常重要,因為它是唯一一個欄位資料有經過排序,且能發揮複合索引效能的關鍵。

星期五, 9月 14, 2012

[Win] 開機自動連線

家人說可以開機後自動連上網路嗎?還要按一下連線才可以使用網路很麻煩(OS:有這麼誇張嗎?)

這篇說明在 Windows 7 上設定,讓電腦一開機就自動連線。
  • Windows 7 控制台 => 網路和網際網路 => 網路和共用中心 => 變更介面卡設定內,可以看見網路連線(我的設定是 So-Net)
[Windows] 開機自動連線-1
  • 在 So-Net 上右鍵內容 => 選項 => 取消[撥號選項]內的[提示名稱、密碼、憑證等]。
[Windows] 開機自動連線-2
  • 取消[撥號選項]內的[提示名稱、密碼、憑證等]可以避免詢問視窗出現(下圖)。
[Windows] 開機自動連線-3

星期五, 9月 07, 2012

[SQL] Database Mail 設定

完成 [Winodws] SMTP 設定 後,本篇說明如何設定 SQL Server Database Mail。
  • SSMS => 管理 => Database Mail => 滑鼠右鍵 => 設定 Database Mail。
[SQL] Database Mail 設定-1
  • Database Mail 組態精靈頁面,使用此精靈必須是系統管理員(sysadmin)。
[SQL] Database Mail 設定-2
  • 建立一個新的電子郵件設定檔(以下簡稱 Profile)
[SQL] Database Mail 設定-13
  • 設定 Profile 時,假如還未啟用 SQL Database Mail 預存程序的話,會出現此畫面(啟動一),按是的話就會啟動,後面提供另外兩種事先啟動方式,事先啟動的話,則不會出現此畫面。
[SQL] Database Mail 設定-4
  • 在 Surace Area Configuration 內啟用(啟動二)
[SQL] Database Mail 設定-4-2
  • 利用 T-SQL 啟動 (啟動三)
sp_configure 'show advanced options',1
reconfigure
GO
sp_configure 'Database Mail XPs' -- 檢視起否啟動

sp_configure 'Database Mail XPs',1 -- 1 為啟動、2 為停止
reconfigure