顯示具有 SQL-Tuning Performance 標籤的文章。 顯示所有文章
顯示具有 SQL-Tuning Performance 標籤的文章。 顯示所有文章

2014年3月28日 星期五

效能調校(3)-讓索引變的有用

一般資料庫系統都會針對查詢進行最佳化設計,負責這功能的引擎就稱為查詢最佳化器(Query Optimization) 而 Query Optimizer 就是 SQL Server 的查詢最佳化器, 它會根據查詢條件進行工作計劃(execution plans )評估,並找到最小成本的那個評估計劃來執行。 所以,我們必須調校我們的資料庫,以便讓 Query Optimizer 可以正確使用我們所建立的索引,以取得最佳的執行計畫。

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年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,由用戶端送出,一直到伺服器端執行完畢,這中間可能包含了很多過程。 不過簡單來看大至包含以下三個步驟:

  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).

效能調校概說