一般資料庫系統都會針對查詢進行最佳化設計,負責這功能的引擎就稱為查詢最佳化器(Query Optimization) 而 Query Optimizer 就是 SQL Server 的查詢最佳化器, 它會根據查詢條件進行工作計劃(execution plans )評估,並找到最小成本的那個評估計劃來執行。 所以,我們必須調校我們的資料庫,以便讓 Query Optimizer 可以正確使用我們所建立的索引,以取得最佳的執行計畫。
2014年3月28日 星期五
2014年3月5日 星期三
建立索引(2)-資料存放區索引
資料行存放區索引(Columnstore indexs)
- supported from SQL2012
- just another nonclustered index on a table
- it can speed up data warehousing queries by a large factor, from 10 to even 100 times.
- A columnstore index is stored compressed.
- Columnstore indexes use their own compression algorithm; you cannot use Row or Page compression on a columnstore index.
2013年6月24日 星期一
效能調校(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月21日 星期五
校能調教工具
在進行效能調校時,可以使用以下工具對執行工作進行分析或追蹤,以瞭解效能不佳的問題癥結。
- 分析工具:例如 「工作執行計畫」或「Database Engine Tuning Advisor」。
- 追蹤工具:例如 「SQL Trace」和「效能監視器」。
- 記錄工具:例如 「Windows 事件記錄檔」或「SQL Server 錯誤記錄檔」。
2013年6月1日 星期六
2013年5月30日 星期四
效能調校(5)-使用資料表分割
分割資料表(Partition Table)就如同資料表,只是在分割資料表中的資料會被分割成數個分割區(Partition)。 你可以將分割資料表建立在特定的檔案群組上,則所有分割區都會使用同一個檔案群組。 當然你也可以將分割資料表建立在特定的分割配置(Partition Scheme)上,則每個分割區都會使用不同的檔案群組,藉此提升存取效能。
只有 SQL Server Enterprise、Developer 和 Evaluation 版本上才可使用資料分割資料表和索引。
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,由用戶端送出,一直到伺服器端執行完畢,這中間可能包含了很多過程。 不過簡單來看大至包含以下三個步驟:
- Parse:先檢查語法,再建立 processor tree(定義logical steps)。
- Optimize:使用「Query Optimizer」取得資料的統計資訊(如多少筆資料,有多少唯一的資料,需要多少resources, CPU & I/O等等)。 「Query Optimizer」會依這些資訊建立很多的 plan,然後選擇最好的plan。
- 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).