sql server 2005 优化方法
sql server 2005 優(yōu)化方法<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
?
一分析實例級的等待
?
--可能存在的性能問題
()IO等待;
()存儲過程和代碼的重新編譯;
()tempdb數(shù)據(jù)庫頁可能是瓶頸;
?
?
--1 不用重新啟動數(shù)據(jù)庫實例,重置'sys.dm_os_wait_stats'
DBCC SQLPERF('sys.dm_os_wait_stats', CLEAR);
?
?
--2 查詢累計值達到系統(tǒng)等待時間%的重量級等待
WITH Waits AS
(
? SELECT
??? wait_type,
??? wait_time_ms / 1000. AS wait_time_s,
??? 100. * wait_time_ms / SUM(wait_time_ms) OVER() AS pct,
??? ROW_NUMBER() OVER(ORDER BY wait_time_ms DESC) AS rn
? FROM sys.dm_os_wait_stats
? WHERE wait_type NOT LIKE '%SLEEP%'
? -- filter out additional irrelevant waits
)
SELECT
? W1.wait_type,
? CAST(W1.wait_time_s AS DECIMAL(12, 2)) AS wait_time_s,
? CAST(W1.pct AS DECIMAL(12, 2)) AS pct,
? CAST(SUM(W2.pct) AS DECIMAL(12, 2)) AS running_pct
FROM Waits AS W1
? JOIN Waits AS W2
??? ON W2.rn <= W1.rn
GROUP BY W1.rn, W1.wait_type, W1.wait_time_s, W1.pct
HAVING SUM(W2.pct) - W1.pct < 90 -- percentage threshold
ORDER BY W1.rn;
?
--3 找出高峰期
-- Create the WaitStats table
USE Performance;
GO
IF OBJECT_ID('dbo.WaitStats') IS NOT NULL
? DROP TABLE dbo.WaitStats;
GO
?
SELECT GETDATE() AS dt,
? wait_type, waiting_tasks_count, wait_time_ms,
? max_wait_time_ms, signal_wait_time_ms
INTO dbo.WaitStats
FROM sys.dm_os_wait_stats
WHERE 1 = 2;
?
ALTER TABLE dbo.WaitStats
? ADD CONSTRAINT PK_WaitStats PRIMARY KEY(dt, wait_type);
CREATE INDEX idx_type_dt ON dbo.WaitStats(wait_type, dt);
GO
?
-- Load waitstats data on regular intervals
INSERT INTO Performance.dbo.WaitStats
? SELECT GETDATE(),
??? wait_type, waiting_tasks_count, wait_time_ms,
??? max_wait_time_ms, signal_wait_time_ms
FROM sys.dm_os_wait_stats;
GO
?
-- Creation script for fn_interval_waits function
IF OBJECT_ID('dbo.fn_interval_waits') IS NOT NULL
? DROP FUNCTION dbo.fn_interval_waits;
GO
?
CREATE FUNCTION dbo.fn_interval_waits
? (@fromdt AS DATETIME, @todt AS DATETIME)
RETURNS TABLE
AS
?
RETURN
? WITH Waits AS
? (
??? SELECT dt, wait_type, wait_time_ms,
????? ROW_NUMBER() OVER(PARTITION BY wait_type
??????????????????????? ORDER BY dt) AS rn
??? FROM dbo.WaitStats
??? WHERE dt >= @fromdt
????? AND dt < @todt + 1
? )
? SELECT Prv.wait_type, Prv.dt AS start_time,
??? CAST((Cur.wait_time_ms - Prv.wait_time_ms)
?????????? / 1000. AS DECIMAL(12, 2)) AS interval_wait_s
? FROM Waits AS Cur
??? JOIN Waits AS Prv
????? ON Cur.wait_type = Prv.wait_type
????? AND Cur.rn = Prv.rn + 1
????? AND Prv.dt <= @todt;
GO
?
-- Return interval waits
SELECT wait_type, start_time, interval_wait_s
FROM dbo.fn_interval_waits('20060212', '20060215') AS F
ORDER BY SUM(interval_wait_s) OVER(PARTITION BY wait_type) DESC,
? wait_type, start_time;
GO
?
-- Prepare view for pivot table
IF OBJECT_ID('dbo.VIntervalWaits') IS NOT NULL
? DROP VIEW dbo.VIntervalWaits;
GO
?
CREATE VIEW dbo.VIntervalWaits
AS
?
SELECT wait_type, start_time, interval_wait_s
FROM dbo.fn_interval_waits('20060212', '20060215') AS F;
GO
?
--利用excel創(chuàng)建透視圖分析
?
二聯(lián)系等待和隊列
?
--1 利用性能計數(shù)器監(jiān)控cpu利用率,I/O隊列,緩存命中率,內(nèi)存計數(shù)器等。
?
--2 為服務器維護的每個性能計數(shù)器返回一行
SELECT
? object_name,
? counter_name,
? instance_name,
? cntr_value,
? cntr_type
FROM sys.dm_os_performance_counters;
?
?
三確定方案
?
--根據(jù)以上分析掌握的信息,確定下一步方案
?
四細化到數(shù)據(jù)庫/文件級別
?
--分析IO信息
?WITH DBIO AS
(
? SELECT
??? DB_NAME(IVFS.database_id) AS db,
??? CASE WHEN MF.type = 1 THEN 'log' ELSE 'data' END AS file_type,
??? SUM(IVFS.num_of_bytes_read + IVFS.num_of_bytes_written) AS io,
??? SUM(IVFS.io_stall) AS io_stall
? FROM sys.dm_io_virtual_file_stats(NULL, NULL) AS IVFS
??? JOIN sys.master_files AS MF
????? ON IVFS.database_id = MF.database_id
????? AND IVFS.file_id = MF.file_id
? GROUP BY DB_NAME(IVFS.database_id), MF.type
)
SELECT db, file_type,
? CAST(1. * io / (1024 * 1024) AS DECIMAL(12, 2)) AS io_mb,
? CAST(io_stall / 1000. AS DECIMAL(12, 2)) AS io_stall_s,
? CAST(100. * io_stall / SUM(io_stall) OVER()
?????? AS DECIMAL(10, 2)) AS io_stall_pct,
? ROW_NUMBER() OVER(ORDER BY io_stall DESC) AS rn
FROM DBIO
ORDER BY io_stall DESC;
?
五細化到進程級別
?
--1 注意事項:不要用SQL Server Profiler圖形化跟蹤;不要把跟蹤數(shù)據(jù)寫到數(shù)據(jù)庫表;
不要把跟蹤文件寫到包含數(shù)據(jù)庫文件的磁盤上;選擇事件類和數(shù)據(jù)列,只跟蹤需要的信息,
移除所有默認項和非必選項;列用篩選條件,如數(shù)據(jù)庫ID;
?
?
--2 需要跟蹤的事件類和字段
SP:Completed?
SP:StmtCompleted
RPC:Completed
SQL:StmtCompleted
?
TextData? Duration host application login
?
--3 用于創(chuàng)建跟蹤的系統(tǒng)存儲過程
--創(chuàng)建跟蹤定義。新的跟蹤將處于停止狀態(tài)。
sp_trace_create
?
?
--創(chuàng)建用戶定義事件
sp_trace_generateevent
?
--在跟蹤中添加或刪除事件或事件列。
sp_trace_setevent
?
--將篩選應用于跟蹤。
sp_trace_setfilter
?
?
--修改指定跟蹤的當前狀態(tài)
--0 停止指定的跟蹤。
--1 啟動指定的跟蹤。
--2 關閉指定的跟蹤并從服務器中刪除其定義。
sp_trace_setstatus
?
?
--以表格格式返回一或多個跟蹤文件的內(nèi)容
SELECT * INTO temp_trc
FROM fn_trace_gettable('c:/temp/my_trace.trc', default);
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/dbasys/archive/2008/11/03/2127564.html
總結
以上是生活随笔為你收集整理的sql server 2005 优化方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP.NET缓存之 没有为 SQL 缓
- 下一篇: Ubuntu根目录文件作用分析