2013年12月31日 星期二

異動資料擷取

什麼是「異動資料擷取」

在 DW 的設定過程中,有些來源資料表會隨著時間不停的在變更,例如訂單資料表。 若要將這些變更定期載入到 DW 中,不可能每次都 Copy 整個來源快照集,因為這樣會耗費較多時間和資源。 所以「遞增載入」(Incremental Load)的需求就此產生,也就是每次執行 ETL 時只會轉移新增或異動的資料。

在處理這類問題時,你可以會遇到情況:

  • 你可以區分出何謂新的資料,所以,你只要轉移新增或異動的資料即可。
  • 你無法區分新舊的界線,但是你可以區分特定區間的資料,例如每次轉移特定月或特定天的資料。
  • 沒有任何資訊可以讓你區分新舊資料的界線。

本章節將介紹幾種方法來解決「異動資料擷取」的問題。

2013年12月24日 星期二

緩時變維度

緩時變維度(Slowly Changing Dimensions, SCD)

當 OLTP 資料庫中的資料發生變更時,如何在 DW 中適當的反應出這個資訊,這就是緩時變維度要解決的問題。 例如:因為每個業務員有其所屬的銷售區域,所以我們可以由銷售員的角度,來檢視各區的報表。可是如果這個銷售員轉換了銷售區域,那該時何來處理這樣子的變化,以反應出正確的報表結果。

「緩時變維度」問題是設計 DW 時很常遇到的狀況,在 SSIS 中,你除了可以在 Control Flow 和 Data Flow 中自訂解決方法外, 最簡單的方法,就是直接使用 Slowly Changing Dimension Transformation 來簡化處理緩時變問題。

變數、運算式、主要封裝

2013年12月19日 星期四

SSIS安裝

由 SQL Server 2005 開始,新的 SSIS 平台取代了原本的 DTS 功能,你可以在這個平台上執行資料整合與工作流程作業。 而 SSIS 的核心元素就是「SSIS Service」,無論封裝是部署到檔案系統或者資料庫系統,所有的封裝都會掛載到這個服務之中,由該服務負責執行。

不過,到了 SQL Server 2012 ,「SSIS Service」這個服務程式就不再是必須的,它的存的,只是為了回溯相容於舊的封裝部署模式。 而封裝的管理與執行都由新的服務程式「SSIS Server」負責,它就是 SQL Server 執行個體本身,只不過要在執行個體上,特別掛載 SSISDB catalog 。 因為所有的 project, package, parameter 等等的資料,都儲存在這個 catalog 之中。

Lab5:資料流程設計2

前一個練習中,我們已經可以將資料 ETL 到倉儲資料庫。 在這個練習中,我們將變換一些轉換技巧,來提升整個 ETL 轉換過程的執行效率。

Lab4:資料流程設計

在建立倉儲資料庫時,常會需要使用到 Stage 資料表,所以底下的 Lab 一開始會使用三個簡單的方法,來練習(1)如何在 Data Flow 將來源資料 ETL 到 Stage 資料表。 (2)再使用較進階的方法將 Stage 資料匯整成倉儲資料庫所要的資料。 (3)最後再練習如何在 Data Flow 中,判斷一筆資料是要新增或更新到倉儲資料庫。

2013年12月15日 星期日

Data Flow

Control Flow

控制流程(Control Flow)是 SSIS package 中很重要的元素。 每一個 SSIS package 都會包含一個「控制流程」和數個「資料流程」構成的。

SSIS 中的「控制流程」,大至包含以下三種不同類型的元素:

  • 工作(Tasks):負責內容的執行。
  • 容器 (Containers):結構化封裝內容。
  • 優先順序條件約束(Precedence Constraints) Constraints:控管工作或容器的執行順序。

建立 SSIS 專案

要建立倉儲資料,就一定會用到資料轉移。 要轉移資料,使用匯出匯入精靈是最方便的,但是如果有下列情況,它就變的不太好用。 例如:轉移資料前必須做適當的資料修改或資料轉換,或者轉移的資料必須與目標中已存在的資料做合併。 而 SSIS 正是用來協助執行資料轉移的好工具。

前言

資料倉儲資料載入

Loading large fact tables can be a problem. You have only a limited time window in which to do the load, so you need to optimize the load operation. In addition, you might be required to track the loads.

資料倉儲效能維護

Data warehouses are often very large, so you have to deal with performance problems. You can use index, data compression, columnstored indexed, T-SQL query skill ... to enhance performance.

2013年12月13日 星期五

Lab3:控制流程設計

若要使用 SSIS 來設計 ETL 執行工作, 首要目標就是決定使用何種 Task 來處理需求, 然後選擇適當的 Container 來優化效能。

底下例子練習,我們將練習如何由指定目錄中讀取 .csv 檔案, 並進行匯入到資料庫的操作。 如果執行成功,將檔案搬移到 data_success 目錄, 如果執行失敗,將檔案搬移到 data_failed 目錄。

2013年12月10日 星期二

Lab2:建立倉儲資料庫

在以下的練習中,我們將建立一個 DW 資料庫,並使用 AdventureWorksDW2012 資料庫當做資料來源執行 ETL。

2013年12月4日 星期三

資料倉儲設計

建構資料倉儲,就是要完成 ETL (extrac-transform-load)。 也就將資料從來源端經過萃取(extract)、轉置(transform)、載入(load)至目的端的過程。 而 SSIS 就是用來協助完成這項作業的工具。

2013年12月1日 星期日

資料倉儲簡介

Terminology

  • LOB:line-of-business
  • OLTP:online transational processing
  • OLAP:online analytical processing
  • SSAS:SQL Server Analysis Service
  • SSIS:SQL Server Integration Service
  • SCD:Slowly Changing Dimension
  • CDC:Change Data Capture
  • DQS:Data Quality Services
  • MDS:Master Data Service
  • BISM:Business Intelligence Semantic Model
  • DAX:Data Anaysis Expression, The query in the BISM tabular model
  • MDX:Mulit-Dimensional Expression, The query for the SSAS dimensional model

Tools

  • SSIS:SQL Server Integration Services
  • BIDS:Business Intelligence Development Studio (support VS2008 , SQL2008)
  • SSDT:SQL Server Data Tools (support VS2010)
  • DTS:Data Transformation Services (SQL2000)

2013年11月21日 星期四

資料庫主控台命令

SQL Server 提供了很多圖形化介面的管理功能,但是同時它也提供相對的指令來執行管理工作,這些指令式的陳述式就稱為「資料庫主控台命令」(Database Console Commands, DBCC)。

DBCC陳述式可分成以下類別目錄:

  • 維護:Maintenance tasks on a database, index, or filegroup.
  • 驗證:Validation operations on a database, table, index, catalog, filegroup, or allocation of database pages.
  • 資訊:Tasks that gather and display various types of information
  • 其他:Miscellaneous tasks such as enabling trace flags or removing a DLL from memory.

資料庫

索引

2013年11月14日 星期四

遠端連線

這篇文章包含三個主題:

  • 如何啟用 TCP/IP 協定,提供遠端連線功能( remote access )。
  • 如何設定防火牆,允許遠端連線通過。
  • 如何設定遠端管理員連接( remote admin connections )。

FileTable

檔案資料表」( FileTable)是 SQL Server 2012 開始提供的新功能。 一般的資料表欄位中存放的是使用者資料,但是檔案資料表則是根據 SQL Server FILESTREAM 技術,直接將磁碟中的檔案和目錄資訊儲存在資料庫的資料表中。 也就是說,您可以將檔案和文件儲存在 FileTable 中,而從 Windows 應用程式存取它們,就像它們儲存在檔案系統中一樣,並不需要對用戶端應用程式進行任何變更。

2013年11月8日 星期五

資料庫快照集

資料庫快照集(Snapshot)

  • 資料庫快照集是來源資料庫的一個靜態檢視,並且唯讀。
  • 必需與來源資料庫位在同一個SQL執行個體。
  • Snapshot 會與來源資料庫維持交易的一致性。
  • 當來源資料庫更新時,Snapshot 也會更新。
  • 一個來源資料庫可以建立多個 Snapshot 。

2013年10月24日 星期四

交易記錄管理

交易記錄檔是記錄每筆交易對資料庫所做的修改狀況。 記錄範圍從 BEGIN TRANSACTION 開始,到 COMMIT TRANSACTION 結束,這之間所有的資料表異動狀況都會被記錄下來。 所以系統的更新很頻繁,其交易記錄檔膨脹速度就會很快。

--查看交易記錄檔資訊
EXEC sp_helpfile;

--查看交易記錄檔使用狀況
DBCC SQLPERF('LOGSPACE')

資料分割

透明資料加密

透明資料加密(Transparent Data Encryption, TDE), 這個功能是 SQL2008 才開始有的,它透過存在資料庫 boot record 中的資料庫密碼金鑰(DEK),對整個資料庫的資料和記錄檔進行加密。 這個功能可以預防當實體資料庫不填被竊取後,遭附加或還原而導至資料被瀏覽。

同時要注意的是,若執行個體中的任何一個資料庫啟用 TDE ,則系統資料庫 tempdb 也會同時被加密。

資料表和索引結構

資料壓縮

在資料庫中使用「壓縮」,大至可分成幾種狀況。

  1. 資料庫壓縮
    資料庫壓縮並不是透過什麼壓縮技術來縮小資料庫的大小,它只是把沒有用到空間清理出來,即使不壓縮,這些空間也會被資料庫重新使用。 你可以直接對資料庫設定自動壓縮,或者手動使用 DBCC SHRINKDATABASEDBCC SHRINKFILE 陳述式來壓縮整個資料庫或各別的資料庫檔案。
  2. 資料壓縮
    資料壓縮可以用來對資料表和索引進行壓縮,壓縮方法又分成資料列頁面壓縮
  3. 備份壓縮
    備份壓縮是針對備份媒體進行壓縮,因為備份資料壓縮後會使用較少的空間,I/O相對減少,所以通常可以有效提升備份速度。

本文僅討論資料壓縮。

2013年9月24日 星期二

自主資料庫

自主資料庫 (Contained Database)

一般將資料庫透過備份與還原方法複製到另外一台Server時,往往還需要完成其他的資料庫設定才算完成,例如登入、角色與設定等等。 「自主資料庫(Contained Database)」是 SQL Server 2012 新推出的功能,它可以讓整個「自主資料庫」與「執行個體」層級之間是獨立隔離的,將來在搬移「自主資料庫」到另外一個「執行個體」時,無需額外的管理組態作業,並且提供了資料庫層級的使用者驗證機制。

自主使用者 (Contained Users)

自主資料庫不使用原有的 SQL logins 進行登入,它使用一種稱為「自主使用者(Contained Users)」或者 Windows 主體(Principle)進行連線。

2013年9月23日 星期一

稽核

稽核是來追蹤 SQL Server 上的活動(activity),例如查看誰更新了資料,誰更改了權限等等。

稽核系統是在SQL Server 2008版本開始導入一套全新的系統:SQL Server Audit,它讓管理人員可以精確地紀錄所需要之稽核資訊,也可以利用「擴充事件(Extended Event)」來監視系統。

排除安全性問題

資料庫狀況百百種,該如何對症下藥:
若有人在固定伺服器角色中加入或刪除成員,你要使用什麼方法記錄到Application Log?Server Audit Specification
若資料庫發生無法挽回的錯誤,你要使用什麼方法立即得到通知?Alert
若資料庫發生死結,你要用什麼方法去錄製這個過程以便可以在另一台測試機重現?SQL Profiler
你要使用什麼方法防止有人將稽核停掉?Policy

2013年7月11日 星期四

AlwaysOn 可用性群組

微軟的 SQL Server 提供以下四種做法來達到 High Availability (HA) 功能。

  1. 複寫(Replication)
    複寫機制是透過 SQL Agent 將主資料庫中的特定資料,透過發行與訂閱技巧,複製到另一個資料庫上。
  2. 記錄傳送(Log Shipping)
    記錄傳送是以整個資料庫為對象進行複寫,利用排程於固定時間時,將主資料庫,複寫到目標資料庫中。
  3. 鏡像(Database Mirroring)
    鏡像機制也是針對整個資料庫進行覆寫,除了有 Log Shipping 的功能,還有可以進行 auto failover 切換。
  4. 容錯移轉叢集(Failover Clustering)
    「容錯移轉叢集」是一組獨立的伺服器,會一起運作以提高應用程式和服務的可用性。 「容錯移轉叢集」會隨時保持叢集中每一個節點(SQL Server Instance)的同步,於預防問題發生時,可以快速切換!

AlwaysOn 容錯移轉叢集執行個體

AlwaysOn 容錯移轉叢集執行個體是 SQL Server AlwaysOn 產品的一部分,它必須搭配 Windows Server 容錯移轉叢集 (WSFC) 功能,透過伺服器執行個體層級 (「容錯移轉叢集執行個體」(Failover Cluster Instance,FCI)) 的備援性提供本機高可用性。 FCI 是跨 Windows Server 容錯移轉叢集 (WSFC) 節點且可能跨多個子網路安裝的單一 SQL Server 執行個體。 在網路上,FCI 看似單一電腦上的 SQL Server 執行個體,但是 FCI 提供容錯移轉,可以在目前的 WSFC 節點無法使用時,從該節點容錯移轉到另一個節點。

資料庫鏡像

Users and DatabaseRoles

Permissions

SQL Server 是採用角色為基礎的授權模型(Role-base security, RBS)。 這個模型是依據使用者名稱所屬群組來控制使用者存取資料的權限。 它主要包含兩個機制:

  • 驗證 (Authentication) :取得識別認證的程序。
  • 授權 (Authurization) :授予特定資源的存取權限給通過驗證的識別。

例如,一個主體(Principal)使用特定的使用者名稱和密碼,交由驗證程序進行驗證。 如果認證結果為有效,則回傳給該實體一個已通過驗證的識別。 每個主體都有一個專屬的「識別碼(principal_id)」和「安全性識別碼(SID)」。 這些識別碼資訊,可以利用 sys.server_principals 查閱。

select * from sys.server_principals

Logins and Server Roles

2013年7月9日 星期二

SSIS

DTS

Data Transformation Services (DTS) 是 SQL 2000 中用來建立封裝,進行資料轉移的服務。

SSIS

Microsoft Integration Services (SSIS) 是 SQL 2005 才開始提供服務,它取代了 SQL 2000 的 DTS 功能,可用來建立企業級資料整合和資料轉換方案的平台。 您可利用 SSIS 來解決複雜的商務問題:複製或下載檔案、傳送電子郵件訊息以回應事件、更新資料倉儲、清理和採礦資料,以及管理 SQL Server 物件和資料。

DTS 由 SQL 2005 開始由 SSIS 取代,若是想要在 SQL 2005, SQL 2008 上繼續支援 DTS 功能,則必須安裝適當的回溯相容元件。但是,SQL 2012 就不再支援 DTS 功能。 如何在 SQL 2008 中繼續使用 DTS ,可參考這篇教學:匯入與執行 DTS 封裝檔案,以 SQL Server 2008 R2 x64 版本為例

BIDS

SQL 2008 提供 Business Intelligence Development Studio (BIDS) 這個工具,可用於開發「商務智慧方案」。 不過,它只整合在 VS 2008 的開發環境,無法在 VS 2010 中使用。

商務智慧方案包括:

  • Reporting Service 專案
  • Analysis Service 專案
  • Integration Service 專案

所以,使用 BIDS 可以用來建立及維護 Integration Services 專案

SSDT

到了 VS2010 ,微軟又提供了新的封裝開發工具,命名為 SQL Server Data Tools(SSDT)。 不過它並不包含在 VS2010 之中,你必須另外下載安裝。 你可以使用 SSDT 建立與維護 Integration Services、Analysis Services、Reporting Services 等專案類型; 也可以使用 SSDT 開發資料庫專案,進行資料庫的建置、偵錯、維護和重構等工作。

這個工具到了 VS2012 或 SQL2012 已內建在安裝程序裡。

如何清除交易記錄

SQL 資料庫系統的 Log記錄檔,會隨著系統的使用,不停的成長。若是長大到影響到其他系統,我們可以讓它瘦身一下。

2013年7月4日 星期四

SQL Server Management Studio

SQL Server Management Studio 是一個整合式環境,您可以用以存取、設定、管理及開發 SQL Server 的所有元件。 SQL Server Management Studio 利用許多豐富的指令碼編輯器來組合一群非常廣泛的圖形工具,使所有開發人員和管理員 (不管他們的技術水準如何) 都能夠存取 SQL Server。

如何找出資料庫中特定名稱的物件

2013年6月24日 星期一

如何清除交易記錄

如何安裝 AdventureWorks2012

如何查詢 Store Procedure 使用情況

效能調校(7)-使用 DMV 查詢系統消耗資源

資料庫管理師常常面臨不知 SQL Server 如何使用資源的困擾,尤其是程式開發人員誤用 T-SQL 語法,索引設計不佳、大量來回存取…等,造成多人同時使用時耗盡系統資源,或是互相鎖定等狀況。 但要資料庫管理師抓出元兇,或是分析使用趨勢,利用既有工具程式如 SQL Server Management Studio 所內建的報表、活動監視器、SQL Trace/Profiler、Windows 效能監視器…等,仍力有未逮。 還要再進一步深入分析 SQL Server,則需使用動態管理物件(Dynamic Management Object, DMOs)

使用優化器提示來改善查詢效能

查詢優化器(Optimizer)

查詢優化器(Optimizer) 是一個 SQL Server 引擎中的元件,負責決定查詢陳述式該如何最佳化執行。 例如 indexes 如何使用、表格排序、合併(JOIN)表格時該如何執行等等。 簡單講,這個元件就是將查詢指令自動最佳化的工具。

提示(Hints)

Hints 是 SQL Server 中的指令,用來告訴 SQL Server 查詢處理器在執行 SQL 陳述式時,應該要強制執行的選項或策略。 當使用 Hints 指令時, Hints 指令可能會覆寫查詢優化器原本預計選取的執行計畫。

使用統計資料來改善查詢效能

2013年6月20日 星期四

順序物件

CREATE SEQUENCE 可以用來建立順序物件(sequence object )。 順序物件是一個由使用者定義的物件,它會根據定義規格產生數值序列。 不同於新增資料時使用的識別資料行(identity),應用程式可以藉由呼叫 NEXT VALUE FOR 函數取得下一個序號,而不需要插入資料列。

2013年6月19日 星期三

使用同義字

PIVOT 和 UNPIVOT

分組查詢

GROUP BY 的延伸類型有:

分析函式

以下幾個分析函數(Analytic Functions)都是 SQL 2012 新增功能。 分析函數會根據資料列群組計算出彙總值。 但不同於彙總函式,其可以傳回每個群組的多個資料列。 您可以使用分析函數計算群組中的移動平均、最新總數、百分比或前 N 個結果。

2013年6月14日 星期五

空間資料類型

Service Broker

Service Broker 是 SQL Server 提供的一種訊息佇列(Message Queuing)。 它可以與原本獨立運作的元件結合,共同建立非同步、鬆散偶合的的應用程式。

使用 Service Broker ,讓應用程式開發人員不需要撰寫複雜的通訊和傳訊間隔程式,即可將資料工作負載分散在多個資料庫。 這可減少開發和測試工作,因為 Service Broker 會處理交談內容中的通訊路徑。 此外,還可提升效能。 例如,支援網站的前端資料庫可記錄資訊,並將必須大量運算處理的工作傳送到後端資料庫的佇列中。 Service Broker 可確保所有工作都在同一交易內容中管理,以確保可靠性和技術一致性。

全文檢索查詢

使用全文檢索

全文檢索搜尋是由全文檢索引擎( Full-Text Engine)所提供。 要使用全文檢索,資料庫管理員必須先在給定的資料表上建立全文檢索索引,然後才能在此資料表上執行全文檢索查詢。

全文檢索索引是由資料表中一個或多個欄位構成,這些欄位可以是以下資料類型: char、varchar、nchar、nvarchar、text、ntext、image、xml、varbinary 或 varbinary(max)。

要使用 SQL Server 的全文檢索查詢資料,大至需要以下四個步驟:

  1. 安裝全文檢索服務。
  2. 建立全文檢索目錄。
  3. 擴展索引(Population)。
  4. 使用全文索引進行查詢。

2013年6月7日 星期五

資料表

使用 FileStream

有許多資料都是未結構化的,如文字檔、圖檔、影音檔。這些資料一般統稱二進位大型物件(BLOB)。 若將這些未結構化的資料儲存在資料庫外面,管理上往往造成許多困擾,所以在 SQL 裡,也提供了 varbinary(max) 型別來存放 BLOG 資料。

在 SQL Server 2008 新增了 FILESTREAM 功能,可以讓 SQL Server 直接存取位於檔案系統上的非結構化資料。 它的方式是使用 varbinary(max) 型別,並整合 NTFS 檔案系統,當你存取 BLOB 資料時,實際上 SQL Server 是存取在檔案系統上資料,而不是存取位於資料庫中的資料。

至於該使用哪一種來作業,來存取 BLOG 資料呢?MSDN 提到: 若儲存的物件平均大於 1 MB,請使用 FILESTREAM varbinary(max); 如果是較小的物件,直接使用 varbinary(max) 將物件資料儲存在資料庫之中通常會提供較好的資料流處理效能。

2013年6月4日 星期二

使用 SQLCLR 和 FileStream

自 SQL 2005 後,SQL Server 開始與 .NET 的 CLR 平台整合,讓 SQL Server 可以輕鬆的使用 .NET 程式語言的強大功能,以擴充 SQL Server 功能性及延展性。

CLR 可以為 SQL Server 撰寫五種擴充功能,分別是:

  • 預存程序 (Stored Procedure)
  • 自訂函式 (User Defined Function)
  • 觸發程序 (Trigger)
  • 彙總函式 (Aggregation Function)
  • 自訂型別 (User Defined Type)

在資料庫中使用 XML 欄位型別

早期的資料庫管理系統並不支援XML格式的欄位,因此資料庫管理系統本身無法對XML資料做最佳化的儲存與管理,更無法利用XML的查詢功能,例如:XPath語法直接查閱。 現今新版本的資料庫管理系統幾乎都支援XML的資料格式,並且增加特殊指令來處理XML資料,同時亦可直接將關聯式資料轉換成XML階層式的資料做輸出,軟體系統將不必再做資料轉換的動作,即可將關聯式資料以XML格式做處理。

2013年5月30日 星期四

效能調校(5)-使用資料表分割

分割資料表(Partition Table)就如同資料表,只是在分割資料表中的資料會被分割成數個分割區(Partition)。 你可以將分割資料表建立在特定的檔案群組上,則所有分割區都會使用同一個檔案群組。 當然你也可以將分割資料表建立在特定的分割配置(Partition Scheme)上,則每個分割區都會使用不同的檔案群組,藉此提升存取效能。

只有 SQL Server Enterprise、Developer 和 Evaluation 版本上才可使用資料分割資料表和索引。

2013年5月28日 星期二

資料庫物件

SQL Server Data Tools

資料庫專案

Visual Studio 從 2005 版本開始提供資料庫專案範本, 這種專案完全使用TSQL的宣告方式來定義資料庫,可横跨資料庫開發的所以階段。 此外,資料庫專案也可以用來進行資料庫的版本管控,建立測試資料,發佈資料庫,方便整個資料庫的管理作業。

SQL Server Data Tool (SSDT)

到了 Visual Studio 2012 或者 SQL Server 2012 又推出了 SQL Server Data Tool (SSDT)。 它是一套整合在 Visual Studio 裡的資料庫管理工具,讓開發人員幾乎無需使用 SSMS 管理工具,而直接在 Visual Studio 內,就可以完成資料庫的設計、建置、資料庫專案(SSDT-DP)、T-SQL 重構等作業。 SSDT 不僅僅是資料庫管理工具,也是用來開發特殊專案類型工具,如: SSAS、SSRS 和 Integration Services Business Intelligence (BI) 方案 (之前稱為 Business Intelligence Development Studio)。

SSDT 已包含在 SQL Server 2012 或 Visual Studio 2012 的安裝檔案裡, 若使用 Visual Studio 2010 ,必須額外下載安裝程式

2013年5月27日 星期一

效能調校(4)-善用覆蓋索引

通常大家都知道,在資料庫加入索引,可以增進查詢效率。可是若將查詢欄位加上了索引之後,為什麼使用到 RowNumber() 進行查詢時,效率還是很慢? 在說明之前,可先參考這篇,瞭解索引的類型。

下面這二個例子,CreatedTime 和 RevisedTime 這二個欄位都有建立 NonClustered-Index,但分別以該欄位進行排序搜尋後的結果,二者效能上卻差了10倍以上。 問題就在於,這二個索引之中,CreatedTime 欄位沒有使用內含資料行。

2013年5月26日 星期日

效能調校-心得分享

有些程式員在撰寫前端的應用程式時,會透過各種 OOP 語言將存取資料庫的 SQL 陳述式串接起來,卻忽略了 SQL 語法的效能問題。版工曾聽過某半導體大廠的新進程式員,所兜出來的一段 PL/SQL 跑了好幾分鐘還跑不完;想當然爾,即使他前端的 AJAX 用得再漂亮,程式效能頂多也只是差強人意而已。以下是版工整理出的一些簡單心得,讓長年鑽究 ASP.NET / JSP / AJAX 等前端應用程式,卻無暇研究 SQL 語法的程式員,避免踩到一些 SQL 的效能地雷。

效能調校(2)-分析執行計畫

當一道TSQL,由用戶端送出,一直到伺服器端執行完畢,這中間可能包含了很多過程。 不過簡單來看大至包含以下三個步驟:

  1. Parse:先檢查語法,再建立 processor tree(定義logical steps)。
  2. Optimize:使用「Query Optimizer」取得資料的統計資訊(如多少筆資料,有多少唯一的資料,需要多少resources, CPU & I/O等等)。 「Query Optimizer」會依這些資訊建立很多的 plan,然後選擇最好的plan。
  3. Execute:最後就是依「Query Optimizer」送過來的 plan 去執行。

而圖形化的執行計畫是 SQL Server 提供給開發人員或 DBA 用來分析查詢執行成本的工具,以做為 T-SQL 指令碼效能調校的參考。

效能調校-案例探討

建立索引(1)-叢集與非叢集索引

資料庫的索引,就像書本的索引資訊一樣,用來提升資料詢找的效率。 但是索引的建立,卻不是隨便的,也不是越多越好,正確的設定才可以真正提升 SQL Server 的執行效率。

效能調校(1)-善用各種索引

SQL Server 2008 supports two basic types of indexes: clustered and nonclustered. Both indexes are implemented as a balanced tree, where the leaf level is the bottom level of the structure. The difference between these index types is that the clustered index is the actual table; that is, the bottom level of a clustered index contains the actual rows, including all columns, of the table. A nonclustered index, on the other hand, contains only the columns included in the index's key, plus a pointer pointing to the actual data row. If a table does not have a clustered index defined on it, it is called a heap, or an unsorted table. You could also say that a table can have one of two forms: It is either a heap (unsorted) or a clustered index (sorted).

效能調校概說

2013年5月21日 星期二

User Defined Functions

Functions are programmable objects that are used to perform calculations that can be returned to a calling application or integrated into a result set. Functions can access data and return results, but they cannot make any modifications.

You can create your own functions, referred to as user-defined functions, and store the functions in any database for which you have CREATE FUNCTION authority.

2013年5月16日 星期四

Views

檢視(VIEW) 同時也稱為虛擬資料表,它將一連串複雜的 SELECT 陳述式組合成一個虛擬資料表,可以用來簡化日後的查詢操作。 除了這個優點,你也可以透過 VIEW 來更新資料。此外,若搭配使用索引檢視(Indexed View)還可以用來提升查詢效能。

Trigger

TRIGGER 是一種特殊的預存程序,雖然也是由使用者自訂的可程式化物件,但是它不可以直接被使用者執行。 它必須建構在 table 或 view 的特定事件中,如:INSERT, UPDATE, DELETE。 當這些事件發生時,才會自動引發 TRIGGER 執行。

Cursor

SQL Server is built to process sets of data. However, there are times when you need to process data one row at a time. The result of a SELECT statement is returned to a server-side object called a cursor, which allows you to access one row at a time within the result set and even allows scrolling forward as well as backward through the result set.

預存程序的錯誤處理

Stored Procedures

The first time that a stored procedure is accessed, SQL Server generates compile and execution plans that are stored in the query cache and reused for subsequent executions. Therefore, you can receive a slight performance benefit when using a stored procedure by avoiding the need to parse, compile, and generate a query plan on subsequent executions of a stored procedure.

2013年5月8日 星期三

使用內建函式查詢

合併查詢結果

在早期的 SQL Server 版本中就有提供 UNION 運算子,用以結合多個查詢結果。 直到 SQL2005 才又加入了 EXCEPTINTERSECT 運算子,以取得多個查詢結果的差集和交集。

彙總查詢

Aggregate functions allow you to apply calculations on values in a column. Adding the GROUP BY clause allows you to provide aggregate on subsets of the data.

2013年5月7日 星期二

次序函數

排名函數是指可以傳回查詢結果的序號或排名的函式。 自 SQL 2005 關始,SQL Server 開始提供符合 ANSI SQL:2003 標準的排名函數,以方便使用者能夠將資料做相關的其他用途。

  • ROW_NUMBER :為每筆結果加上一個序列號。
  • RANK :若遇到相同資料值,則同序列號;後續資料則跳號。
  • DENSE_RANK :若遇到相同資料值,則同序列號;後續資料不跳號,接續排名。
  • NTILE :根據帶入的參數,將資料分割成 N 群組。
ROW_NUMBER() OVER ( [ <partition_by> ] < order_by_clause > )
RANK()       OVER ( [ <partition_by> ] < order_by_clause > )
DENSE_RANK() OVER ( [ <partition_by> ] < order_by_clause > )
NTILE (n)    OVER ( [ <partition_by> ] < order_by_clause > )

子查詢

子查詢讓關發人員仍夠以較直覺的方式撰寫 TSQL ,也能夠讓較複雜的查詢在單一次的查詢中完成。 子查詢最多能夠使用至 32 層,但仍取決於伺服器的可用記憶體及查詢的複雜度。

通用資料表運算式(CTE)

通用資料表運算式(CTEs)

通用資料表運算式 (Common Table Expression) 是 SQL 2005 才開始支援的查詢語法。 它有二個主要的用途:簡化子查詢與遞迴查詢。

2013年5月2日 星期四

資料完整性

資料的完整性指的就是資料的正確性,通常我們都會在程式端撰寫程式驗證資料,較少在資料庫端驗證,這個文章就是要來介紹如何設計資料的驗證。

資料型別

2013年5月1日 星期三

Transactions

Output 與 Merge

The OUTPUT clause allows you to return information from rows affected by an INSERT, UPDATE, or DELETE statement. With this functionality, you can perform additional tasks more cleanly based on the information provided. These tasks can include confirmation e-mails, data auditing, and similar duties.

The MERGE statement provides you WITH the ability to perform an INSERT, UPDATE, or DELETE operation on a target table based on a set of rules that are determined by a row comparison between the target table and a source table.

資料新增、修改、刪除

使用 JOIN 查詢

SQL 中的 JOIN 運算,大至包含以下幾種分類

  1. INNER JOIN
  2. OUTER JOIN
  3. CROSS JOIN
  4. Self-Joins

INNER 與 OUTER 關鍵字皆可以省略。

查詢基本語法

Select

判斷 Null 值

Like

Between

2013年4月16日 星期二

2013年4月10日 星期三

LINQ 表示式(5) - Concat、Union、Intersect、Except

關鍵字: Concat、Union、Intersect、Except

LINQ 表示式(4) - Exist、In、Any、All、Contains

關鍵字: Any、All、StartsWith、IndexOf、Contains

LINQ 表示式(3) - Join

關鍵字: Join

LINQ 表示式(2) - OrderBy 、 GroupBy 、 Into 、 Max 、 Min 、 Average 、 Sum 、 Count 、 Aggregate

關鍵字: OrderBy 、 GroupBy 、 Into 、 Count 、 Max 、 Min 、 Average 、 Sum 、 Aggregate

LINQ 資料格式轉換

LINQ 不僅僅可以用來查詢資料, LINQ 也允許我們將來源資料轉換成其他格式的資料。例如轉成 XML 或 JSON 格式,亦或是自訂型別都可以。

LINQ 表示式(1) - Select、Where、Distince

關鍵字: Select 、 Where 、 Distinct

2013年4月9日 星期二

LINQ to Entity

LINQ to Entities works in a manner that is similar to that of LINQ to SQL . You define a model to represent your application domain. You then create a map between this model and your actual data source. You can then load data into the model and query against it by using LINQ. However, LINQ to Entities uses the ADO.NET Entity Framework as a basis for the models. These models can be created for any data source (not just for SQL Server).

LINQ to XML

要查詢 XML 文件,除了使用 XQuery ,另一種方法就是使用 LINQ to XML 類別(們)。 這些類別都包含在 System.Xml.Linq 命名空間中, 除了提供簡單快速的方法可以用來查詢 XML 文件,且都使用與先前相同的查詢模組。

LINQ to SQL

由上節說明(Link to DataSet)可以知道中,透過 LINQ 可以很快速地查詢 DataSet 中的靜態資料。 但是這樣子並沒有顯現出 LINQ 最大的功能,那就是:設計階段強型別檢查 (strong type-checking at design time)。

要使用 LINQ to SQL 時,必須先建立連結到資料庫元素的 O/R map 。 這個 map 一旦建立,存取資料庫的語法就好像在寫物件式的程式碼,就變的既簡單又快速。

LINQ to DataSet

2013年4月8日 星期一

資料來源控制項(3)

ObjectDataSource

Many Web applications work with a middle tier, or business layer, for retrieving and working with application data. This middle tier encapsulates database code inside of classes. Web developers can then call methods on these classes to select, insert, modify, and delete data.

資料來源控制項(2)

XmlDataSource

The XmlDataSource control provides a means to create a binding connection between controls on your page and an XML file. The XML data source control is best used when you wish to bind to XML data that is represented as hierarchical (such as using in the TreeView control).

2013年3月26日 星期二

Caching in MVC

在 MVC 中同樣可以使用 ASP.NET 的網頁輸出快取(Output Caching)來提升網頁的效能。Output Caching 可以控制 controller 中的 action 不必每次被 invoke 時都得執行一次。例如,我們常在controller 的 index 方法中列出資料庫中資料的清單,使用 Output caching 就可以避免重複讀取資料庫中相同的資料。

2013年3月20日 星期三

jQuery plugin: Validation

jQuery Validation 是 jQuery 的一個既強又有彈性的 plugin 套件,主要功能就是用來進行表單驗證。

2013年3月19日 星期二

MVC Validation

一般網頁驗證可分成 Client 與 Server 端上進行,在以往若要同時撰寫二端的驗證程式都必須花費不少功夫, 現在 MVC 3.0 整合了多項技術,利用 Model Metadata 的設定,讓程式可以自動產生驗證功能的程式碼。

MVC Authentication

2013年3月18日 星期一

Controller

Controller 的工作主要負責從 View 中接收指令,然後把指令發送到相應的 Model 處理,在 Model 處理完成後就再把處理結果回傳到 View 去。 Controller 的基底是 Controller 類別。 所有的 Controller 都存放在 Controllers 目錄。

每一個 Controller 都包含許多 action method ,用來對應到使用者的操作行為。 這關係通常是1對1的,例如,若要提供使用者執行 CRUD 四種操作,你就必須建立 create, run, update, delete 四個 action。

Views

View 是用來顯示使用者介面。 所有的 View 都存在 Views 目錄下的子目錄中。 每一個 Controller 名稱,在 Views 中都應該對應到一個相同名稱的子目錄, 然後再依據該控制器的 action method 名稱加入適當的 View 。

Asynchronous Controller

MVC Routing

Routing 是用來定義網址的格式,它是在 ASP.NET 3.5 被加入的新功能,在過去,要實現這個功能,可能要自已撰寫程式,或者使用第三方元件。 有了這個內建功能,要使用 Routing 的好處,就變的方便許多。

本篇內容僅針對 MVC 中所使用的 Routing 規則。

2013年3月12日 星期二

JSON

JSON (JavaScript Object Notation)是一種以純文字為基礎的資料格式。 因為它的結構簡單,很適合用來做為程式溝通或交換資料時使用。 也由它的輕量化和易於閱讀的特性,目前已廣泛應用於各種技術領域,例如:AJAX, WCF, jQuery。

線上電子書

Router、Switch、Hub

JavaScript 小技巧

單鍵發行網站

使用 Div 做訊息框

Visual Studio 快速鍵

這篇文章要介紹,在 Visual Studio 中的「hot-key」功能

Byte 與 MemoryStream 轉換

MemoryStream 是將資料存放在記憶體中的一種資料流,有時在執行資料處理時,必須將其轉換成陣列以方便處理。

如何利用使用 trigger 記錄 Log

如何做:存在更新、不存在新增

2013年3月10日 星期日

WCF 認證

WCF DataService

XML Web Service 認證

Web Service 是一個開放式的架構,任何系統都可以存取。那麼如果有些服務必須限定存取權限,又該如何處理?

其實 Web Service 就像一個 Web Page 一樣,也是由一個 URL 指向一個檔案,所以可以把它看成同 ASP.NET 資源一樣處理。

2013年2月27日 星期三

掛載 WCF 服務

要讓設計好的 WCF 服務發揮作用,必須先將服務裝載到適當的主機身上,這個行為就稱為 hosting 。 WCF 服務可以裝載於任何 Managed 應用程式上,這是最彈性的選項,因為它只需要最少的基礎結構就可部署。 例如:IIS, WAS, 或自行撰寫裝載的應用程式都可以用來裝載 WCF 服務。 且因為 WCF 服務使用統一的程式設計模型,這個程式設計模型與部署服務的執行階段環境是互相獨立的, 所以不管裝載選項為何,服務的程式碼看起來都差不多。

建立 WCF 服務類別庫

2013年2月5日 星期二

jQuery 效果

JavaScript 應用在客戶端網頁上最強悍的用途之一就是動態效果了,往往利用純 JavaScript 作一個效果你可能要寫好幾行的 Code,而 jQuery Effects 幫你把許多常會用到的特效包起來,現在你只需要寫個幾行 Code 來作事。(更多請看 jQuery UI)

jQuery Ajax

AJAX 代表 Asynchronous Javascript And Xml ,其中的 Asynchronous 意味著不採行傳統 Postback 整個網頁表單送回伺服器的做法,而是透過 XmlHttpRequest 物件與伺服器溝通,再以 Javascript 解析伺服器端所傳回的資料。這種做法,避免了傳統Postback期間,網頁會歷經消失、等待、重新建立的過程,給予使用者更流暢的操作感受。

jQuery 事件處理

jQuery 可以將寫好的 script 繫結到用戶端的事件,如:button click, mouse move, ... 這些 script 內容,可以寫在網頁裡,也可以獨立在 .js 檔中,再透過 .bind() 方法與事件綁在一塊。

jQuery 篩選元素

jQuery 的選取元素 (selectors) 是直接從根元素去尋找其下的後代子元素,而我們這裡要探討如何去進一步「篩選」。 jQuery 的 Traversing 能幫我們做這些過濾、查訪元素的動作。

jQuery DOM操作

jQuery Manipulation 主要是用來操作 DOM 元素的新增、刪除與修改等。

jQuery 屬性與樣式

我想一般對於 JavaScript 大部分的操作都用在變動 HTML DOM 元素的屬性跟樣式,如果你有這個經驗,就會知道在設定時會有許多複雜及麻煩的問題,比如說 IE 它 setAttribute 不吃 name 屬性;又像在指定 class 屬性時,名稱不能用 class 而要用 className 等問題。令人開心的,jQuery 已經幫你處理掉中間這些繁雜過程可能遇到的問題了!你只需記得原本的 HTML 和 CSS 是怎樣寫就行。

jQuery 選取元素

jQuery 最基本的中心思想就是以「選取 DOM 元素為開始」,接著就是對它們作一些事。

jQuery 在選取元素方面採用 CSS 選擇器的語法 (CSS1、CSS2、CSS3),此外透過 plugin 你也可以使用 XPath 語法,我們直接看幾道範例你就會明白怎麼在 jQuery 中用 CSS Selectors 選取元素:

jQuery 初探

jQuery 初探

jQuery 所有的屬性及函式都是定義在「jQuery」這個物件之下,這使你不會因為使用 jQuery Library 而與原本有的全域變數等其它命名空間產生衝突。 此外,要取得 jQuery 物件也可以透過它提供的另外一個縮寫符號 (別名)-錢字號「$」,這時大家可能會問那我有使用其它的 JavaScript Library 也是用「$」怎麼辦?有辦法,用下面這一行就解決了:

2013年2月1日 星期五

jQuery 關於

jQuery 關於

jQuery 是一套物件導向式簡潔輕量級的 JavaScript Library。透過 jQuery 你可以用最精簡少量的程式碼來輕鬆達到跨瀏覽器 DOM 操作、事件處理、設計頁面元素動態效果、AJAX 互動等。

2013年1月29日 星期二

HtmlHelper Class

若要在 MVC 應用程式中使用 HTML 控制項,除了直接建立 HTML 控制項之外, 也可以使用 System.Web.Mvc.Html 命名空間底下的擴充控制項,來協助建立 HTML 控制項。 該命名空間包括支援表單、輸入控制項、連結、部分檢視和驗證等的類別。

2013年1月25日 星期五

Json 序列化

JavaScriptSerializer 是 .Net3.5 才加進來的類別, 可以用來將指定的 JSON 字串轉換成物件圖形。

public string Serialize(object obj);           
public object Deserialize(string input, Type targetType);
public T Deserialize<T>(string input);
public object DeserializeObject(string input);
  • Serialize :將物件或連接之物件的圖形序列化至指定資料流。
  • Deserialize :將資料流還原序列化至物件圖形。
  • DeserializeObject :將指定的 JSON 字串轉換成物件圖形。

2013年1月22日 星期二

自訂組態設定

自訂非同步網頁

如果只要想使用非同步作業執行運算,可以使用和 WinForm 相同的 APM 技巧即可。 這裡特別指的是網頁的非同步作業,其考量點會和 WinForm 的非同步有所差異。 在 WinForm 中,非同步作業常用來執行耗時的工作,並且適時的回應使用者工作進度。 但是在 WebFrom 中,不管是否使用非同步作業,都比須等待整個網頁處理完畢後才會傳送回應到客戶端,所以網頁非同步不是用來回應使用者工作進度的。

在 WebForm 中使用非同步執行長時間工作的最主要目的是希望善用 ThreadPool 。 因為當 IIS 收到一個要求時,就會由 ThreadPool 中佔用一個 Thread 來處理要求,一直到執行完畢回應用戶端為止。 若 ThreadPool 中的 Thread 被佔用完了,IIS 就會先將用戶端來的要求加入要求佇列(Request Queue),但是如果佇列又1達到 IIS 的上限,IIS 就會暫時無法提供服務,並回應 HTTP 503 服務無法使用 的錯誤訊息。

使用網頁的非同步作業來執行工作,它會將工作交由 CLR 的 Thread 去執行,然後釋放原先 IIS 的 Thread 回 ThreadPool 。 等執行結束再跟 ASP.NET 的 ThreadPool 請求一個 Thread 來回應要求。這樣子 ASP.NET 的 ThreadPool 就有比較多空閒的 Thread 去服務更多的 request 。

自訂 HTTP Modules and HTTP Handlers

一般狀況下,當 IIS 收到Http Request,它會視這個Request的類型,交由不同的 handler 去處理。 例如,當 IIS 收到使用者提出一個網頁 aspx 需求,就會執行 asp.net page handler 以處理請求。 當 IIS 收到的是一個 asmx 需求, IIS 就會執行 asp.net sevice handler 以處理請求。 若你須要自行處理特定的需求,就必須針對這個需求設計特定的 HTTP Handler 或者 HTTP Module。

  • HTTP Module 類似 IIS 早期版本中的 ISAPI Filter ,是用來將任何需求加上某些處理,例如驗證需求或壓縮回應等功能。
  • HTTP Handler 類似 IIS 早期版本中的 ISAPI Extension ,用來定義 Http 的處理程序,以處理特定型態的 Http Web Request。

這二者有個主要的不同點就是,一般 Handler 所處理的需求,都會針對特定的檔案路徑,或者特定的副檔名。

所以,若要建立一個 IIS 的擴充功能,你可以先判斷這個功能是否是針對特定的 url/extension ,來決定是要建立一個 Module 或者 Handler 。

2013年1月2日 星期三

Models

建立一個 ASP.NET MVC 網站,通常會依下列步驟來做:

  1. 建立 Model
    • 建立資料庫的 Entity 模型
  2. 建立 Controller
    • 使用 VisualStudio 程式碼產生器產生程式骨架 (這個步驟也會順便建立 View)
  3. 調整 View
    • 移除不要的顯示欄位或表單欄位

ASP.NET MVC

The ASP.NET MVC Architecture

The ASP.NET MVC Architecture

An ASP.NET MVC application has a different architecture, page processing model, conventions, and project structure than an ASP.NET web form site. Requests to an ASP.NET MVC application are handled by the UrlRoutingModule HttpModule . This module parses the request and selects a route for that request based on a configuration that you define.

Ultimately, the request is routed to one of the many controller classes that you write to manage request processing. It is the selected controller's job to access your data and business logic (the model), connect it for display (the view), and send the response back to the user. The controller handles all requests-view and updates (posts).

Working with ASP.NET Dynamic Data

在軟體開發過程中,常會需要不斷地重複顯示與編輯資料。 ASP.NET Dynamic Data Website 是一種可以讓您只需要利用極少的程式碼或是根本不使用程式碼,建立資料導向的應用程式。 Scaffolding 是 Dynamic Data 中的一個重要機制,它指的就是由系統自動根據資料庫中的結構描述(Database Schema),產生網頁範本的機制。