<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Keeping IT Simple</title>
        <link>http://weblogs.sqlteam.com/jenm/Default.aspx</link>
        <description />
        <language>en-US</language>
        <copyright>Jen</copyright>
        <generator>Subtext Version 2.5.1.0</generator>
        <image>
            <title>Keeping IT Simple</title>
            <url>http://weblogs.sqlteam.com/images/RSS2Image.gif</url>
            <link>http://weblogs.sqlteam.com/jenm/Default.aspx</link>
            <width>77</width>
            <height>60</height>
        </image>
        <item>
            <title>Understanding SQL Server Security and What You Can Do</title>
            <link>http://weblogs.sqlteam.com/jenm/archive/2007/11/22/60411.aspx</link>
            <description>&lt;p&gt;Here are a couple of good reads. I will add to the list as I find something interesting. Don't hesitate to add your own via comments. The links are ordered according to my impression, first link being the best read.&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;1. I don't read blogs or articles that often, my skills are basically from experience and troubleshooting, so believe me when I say that this link is a must read. &lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;&lt;a href="http://www.windowsecurity.com/articles/Secure_SQL_Server.html"&gt;http://www.windowsecurity.com/articles/Secure_SQL_Server.html&lt;/a&gt; &lt;/font&gt;&lt;/p&gt;
&lt;p&gt;2. Ever wonder which ports you can and should not restrict? Wonder no more&lt;/p&gt;
&lt;p&gt; &lt;font face="Arial"&gt;&lt;a href="http://www.microsoft.com/smallbusiness/support/articles/ref_net_ports_ms_prod.mspx"&gt;http://www.microsoft.com/smallbusiness/support/articles/ref_net_ports_ms_prod.mspx&lt;/a&gt;  &lt;/font&gt;&lt;/p&gt;
&lt;p&gt;3. How about that new service in 2005? De-mystifying SQLBrowser&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms181087.aspx"&gt;http://msdn2.microsoft.com/en-us/library/ms181087.aspx&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;4. How to make unwanted access to SQL Server 2005 by an OS admin more difficult.&lt;/p&gt;
&lt;p&gt; &lt;font face="Arial"&gt;&lt;a href="http://support.microsoft.com/kb/932881"&gt;http://support.microsoft.com/kb/932881&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;&lt;img src="http://weblogs.sqlteam.com/jenm/aggbug/60411.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Jen</dc:creator>
            <guid>http://weblogs.sqlteam.com/jenm/archive/2007/11/22/60411.aspx</guid>
            <pubDate>Thu, 22 Nov 2007 17:04:50 GMT</pubDate>
            <comments>http://weblogs.sqlteam.com/jenm/archive/2007/11/22/60411.aspx#feedback</comments>
            <slash:comments>6</slash:comments>
            <wfw:commentRss>http://weblogs.sqlteam.com/jenm/comments/commentRss/60411.aspx</wfw:commentRss>
            <trackback:ping>http://weblogs.sqlteam.com/jenm/services/trackbacks/60411.aspx</trackback:ping>
        </item>
        <item>
            <title>Troubleshooting SQL Server Quirks</title>
            <link>http://weblogs.sqlteam.com/jenm/archive/2007/11/19/60409.aspx</link>
            <description>&lt;p&gt;Recently, a friend of mine was doing load test on their environment and encountered an odd scenario. For some inexplicable reason, the application was really slow, cpu and memory were extremely high and SQL Server barely responding. There were no waiting tasks and the scheduler is free. &lt;/p&gt;
&lt;p&gt;PS informed them it's by design. And in this case, it makes sense. You'll understand why I said that after reading the article &lt;a title="http://support.microsoft.com/default.aspx/kb/927396" href="http://support.microsoft.com/default.aspx/kb/927396"&gt;http://support.microsoft.com/default.aspx/kb/927396&lt;/a&gt; . By the way, don't make the same mistake of applying the hotfix, it did nothing to fix the problem.&lt;/p&gt;
&lt;p&gt;I've started monitoring our own servers' threshold and set a starting level until the baseline is established. The last procedure is a simple query to retrieve the delta between last and current values. Be sure to schedule the spGetSystemCacheInfo procedure.&lt;/p&gt;
&lt;p&gt;Remember, this is just to give you a jump start.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;use database_name &lt;br /&gt;
go &lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;CREATE TABLE [dbo].[SystemCache](&lt;br /&gt;
 datestamp datetime default getdate(),&lt;br /&gt;
 [memory_clerk_address] [varbinary](8) NOT NULL,&lt;br /&gt;
 [type] [nvarchar](60) NOT NULL,&lt;br /&gt;
 [name] [nvarchar](256) NOT NULL,&lt;br /&gt;
 [memory_node_id] [smallint] NOT NULL,&lt;br /&gt;
 [single_pages_kb] [bigint] NOT NULL,&lt;br /&gt;
 [multi_pages_kb] [bigint] NOT NULL,&lt;br /&gt;
 [virtual_memory_reserved_kb] [bigint] NOT NULL,&lt;br /&gt;
 [virtual_memory_committed_kb] [bigint] NOT NULL,&lt;br /&gt;
 [awe_allocated_kb] [bigint] NOT NULL,&lt;br /&gt;
 [shared_memory_reserved_kb] [bigint] NOT NULL,&lt;br /&gt;
 [shared_memory_committed_kb] [bigint] NOT NULL,&lt;br /&gt;
 [page_size_bytes] [bigint] NOT NULL,&lt;br /&gt;
 [page_allocator_address] [varbinary](8) NOT NULL,&lt;br /&gt;
 [host_address] [varbinary](8) NOT NULL&lt;br /&gt;
)&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;GO&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;create procedure getSystemCacheInfo&lt;br /&gt;
as&lt;br /&gt;
insert into systemcache([memory_clerk_address] ,&lt;br /&gt;
 [type] ,&lt;br /&gt;
 [name] ,&lt;br /&gt;
 [memory_node_id] ,&lt;br /&gt;
 [single_pages_kb],&lt;br /&gt;
 [multi_pages_kb] ,&lt;br /&gt;
 [virtual_memory_reserved_kb],&lt;br /&gt;
 [virtual_memory_committed_kb] ,&lt;br /&gt;
 [awe_allocated_kb],&lt;br /&gt;
 [shared_memory_reserved_kb] ,&lt;br /&gt;
 [shared_memory_committed_kb],&lt;br /&gt;
 [page_size_bytes],&lt;br /&gt;
 [page_allocator_address],&lt;br /&gt;
 [host_address])&lt;br /&gt;
select  [memory_clerk_address] ,&lt;br /&gt;
 [type],&lt;br /&gt;
 [name],&lt;br /&gt;
 [memory_node_id] ,&lt;br /&gt;
 [single_pages_kb],&lt;br /&gt;
 [multi_pages_kb] ,&lt;br /&gt;
 [virtual_memory_reserved_kb],&lt;br /&gt;
 [virtual_memory_committed_kb] ,&lt;br /&gt;
 [awe_allocated_kb],&lt;br /&gt;
 [shared_memory_reserved_kb] ,&lt;br /&gt;
 [shared_memory_committed_kb],&lt;br /&gt;
 [page_size_bytes],&lt;br /&gt;
 [page_allocator_address],&lt;br /&gt;
 [host_address]&lt;br /&gt;
from  sys.dm_os_memory_clerks &lt;br /&gt;
   WHERE name = 'TokenAndPermUserStore'&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;go&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;create procedure spGetSystemCacheInfo&lt;br /&gt;
as&lt;br /&gt;
set nocount on&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;declare @current decimal(18,2)&lt;br /&gt;
 ,@previous decimal(18,2)&lt;br /&gt;
 ,@percentage decimal(18,2)&lt;br /&gt;
 ,@message nvarchar(2000)&lt;br /&gt;
 ,@status int&lt;br /&gt;
 ,@severity int&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;SELECT @current=SUM(single_pages_kb + multi_pages_kb)/1024 &lt;br /&gt;
   FROM sys.dm_os_memory_clerks &lt;br /&gt;
   WHERE name = 'TokenAndPermUserStore'&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;SELECT @previous=coalesce(SUM(single_pages_kb + multi_pages_kb)/1024,0)&lt;br /&gt;
FROM SystemCache&lt;br /&gt;
where datestamp=(select max(datestamp) from systemcache)&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;if @previous&amp;gt;0&lt;br /&gt;
 set @percentage=((@current-@previous)/@current)* 100&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;if @current&amp;gt;80&lt;br /&gt;
 select @message='TokenAndPermUserStore has reached increased by ' + convert(varchar(3),@percentage )+ '%&lt;br /&gt;
 and Total is ' + convert(varchar(100),@current) + ' MB&lt;br /&gt;
 Run DBCC FREESYSTEMCACHE (''TokenAndPermUserStore'') to resolve the problem.',@severity=19,@status=1&lt;br /&gt;
if @percentage&amp;gt;30 and (@current&amp;gt;50 and @current&amp;lt;80)&lt;br /&gt;
 select @message='TokenAndPermUserStore has reached increased by ' + convert(varchar(3),@percentage )+ '%&lt;br /&gt;
 and Total is ' + convert(varchar(100),@current) + ' MB&lt;br /&gt;
 This is an informational message only. ',@severity=18,@status=0&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;exec GetSystemCacheInfo&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;if @message is not null&lt;br /&gt;
 RAISERROR (@message,@severity,@status) with log;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;set nocount on&lt;br /&gt;
go&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Arial"&gt;&lt;/font&gt; &lt;/p&gt;&lt;img src="http://weblogs.sqlteam.com/jenm/aggbug/60409.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Jen</dc:creator>
            <guid>http://weblogs.sqlteam.com/jenm/archive/2007/11/19/60409.aspx</guid>
            <pubDate>Mon, 19 Nov 2007 18:30:27 GMT</pubDate>
            <comments>http://weblogs.sqlteam.com/jenm/archive/2007/11/19/60409.aspx#feedback</comments>
            <slash:comments>10</slash:comments>
            <wfw:commentRss>http://weblogs.sqlteam.com/jenm/comments/commentRss/60409.aspx</wfw:commentRss>
            <trackback:ping>http://weblogs.sqlteam.com/jenm/services/trackbacks/60409.aspx</trackback:ping>
        </item>
        <item>
            <title>How Not To Outgrow Your DB Infra: A Simple Setup</title>
            <link>http://weblogs.sqlteam.com/jenm/archive/2007/11/14/60404.aspx</link>
            <description>&lt;p align="justify"&gt;&lt;font face="Verdana" size="1"&gt;Whether you're an experienced DBA or about to embark into the world of database administration, one of the focal points of your duties is to ensure that you will not outgrow your current DB system. We all know that but where to start?&lt;/font&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;font face="Verdana" size="1"&gt;It's quite simple, all there is to it is a bit of preparation, baseline and monitoring until you get some statistics to work on.&lt;/font&gt;&lt;/p&gt;
&lt;h4 align="justify"&gt;Part I: Disk Management&lt;/h4&gt;
&lt;p align="justify"&gt;&lt;font face="Verdana" size="1"&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;font face="Verdana" size="1"&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;strong&gt;&lt;font face="Verdana" size="1"&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;strong&gt;&lt;font face="Verdana" size="1"&gt;DDL&lt;/font&gt;&lt;/strong&gt; &lt;/p&gt;
&lt;p align="justify"&gt; &lt;/p&gt;
&lt;div align="justify"&gt;
&lt;pre&gt;&lt;font face="Verdana" size="1"&gt;USE [Database_Name] -- change to appropriate admin db
GO
&lt;/font&gt;&lt;font face="Verdana" size="1"&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div align="justify"&gt;
&lt;pre&gt;&lt;font face="Verdana" size="1"&gt;CREATE TABLE DBO.DBCapacity(
  DBName varchar(60)
 ,DateStamp datetime DEFAULT getdate()
 ,SizeInGB decimal(18,2)
 ,CONSTRAINT PK_DBCapacity PRIMARY KEY CLUSTERED(DBName ASC, DateStamp ASC)
 )
 GO
&lt;/font&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div align="justify"&gt;
&lt;pre&gt;&lt;font face="Verdana" size="1"&gt;&lt;strong&gt;DML&lt;/strong&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div align="justify"&gt;
&lt;pre&gt;&lt;font face="Verdana" size="1"&gt;-- procedure to retrieve db sizes
CREATE PROCEDURE getDBSizes
as&lt;/font&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div align="justify"&gt;
&lt;pre&gt;&lt;font face="Verdana" size="1"&gt;DECLARE @database varchar(50)
, @getdb CURSOR
, @sqlstmt nvarchar(4000)

CREATE TABLE #result (dbname varchar(100),dbsize decimal(18,2))

SET @getdb = CURSOR FOR SELECT name FROM SYS.DATABASES
OPEN @getdb
FETCH NEXT FROM @getdb INTO @database

WHILE (@@FETCH_STATUS = 0)
BEGIN

SELECT @sqlstmt = 'INSERT INTO #result(dbname,dbsize)
SELECT ''' + @database + ''',CONVERT(decimal(18,2),(size*8)/1048576.0)
FROM ' + @database + '.SYS.SYSFILES WHERE groupid=1'
EXEC (@sqlstmt)

FETCH NEXT FROM @getdb INTO @database
END

CLOSE @getdb
DEALLOCATE @getdb

INSERT INTO dbCapacity(dbName,sizeInGB)
SELECT dbname,dbsize FROM #result

DROP TABLE #result
GO

--Alternative size source if you are taking regular backups and you really need to come up with the magic number

DECLARE @startdate datetime
,@period varchar(10)
&lt;/font&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div align="justify"&gt;
&lt;pre&gt;&lt;font face="Verdana" size="1"&gt;SET @startdate='2007-01-01' --set the start date
SET @period='week'

SELECT DATEADD(@period,DATEDIFF(@period,0,backup_start_date),0) as DateStamp
,CONVERT(decimal(18,2),SUM(CASE WHEN [type]='D' THEN backup_size ELSE 0 END)/1073741824.0) as DBSize_DataAndLog
FROM msdb.dbo.backupset
WHERE backup_start_date&amp;gt;=@startdate
GROUP BY DATEADD(@period,DATEDIFF(@period,0,backup_start_date),0)
ORDER BY DATEADD(@period,DATEDIFF(@period,0,backup_start_date),0) asc

--Retrieving the information
CREATE PROCEDURE spGetDBGrowth
@dbname varchar(100)=null
as

SET NOCOUNT ON

SELECT dbName
,sizeingb as CurrentSize
,(SELECT TOP 1 sizeingb FROM dbcapacity WHERE datestamp&amp;lt;d.datestamp AND dbName=d.dbName ORDER BY datestamp desc) as PreviousSize
,sizeingb -(SELECT TOP 1 sizeingb FROM dbcapacity WHERE datestamp&amp;lt;d.datestamp AND dbName=d.dbName ORDER BY datestamp desc) as GrowthIncrease
FROM dbcapacity d
WHERE datestamp=(SELECT max(datestamp) FROM dbcapacity WHERE dbName=d.dbName) AND dbName=COALESCE(@dbname,dbName)
ORDER BY sizeingb desc

SET NOCOUNT OFF

GO&lt;/font&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p align="justify"&gt; &lt;/p&gt;
&lt;p align="justify"&gt;Now all you need to do is to create a job, add a jobstep to execute getDBSizes and schedule. &lt;/p&gt;
&lt;p align="justify"&gt;I would recommend a cut-off time like off-peak hours over a period, depending where you get your size data. &lt;/p&gt;
&lt;p align="justify"&gt;If it's from the backupset, it doesn't really matter and you don't need to setup the job. &lt;/p&gt;
&lt;p align="justify"&gt;&lt;strong&gt;Computing for the growth&lt;/strong&gt;&lt;/p&gt;
&lt;p align="justify"&gt;I've included a simple procedure to compare the current growth based on the datestamp in the dbCapacity table plus an undocumented procedure to retrieve the current available disk space. So basically you now have the stats and all you need to do is analyze the data.&lt;/p&gt;
&lt;div align="justify"&gt;
&lt;pre&gt;&lt;font face="Verdana" size="1"&gt;EXEC spGetDBGrowth --to retrieve growth&lt;/font&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div align="justify"&gt;
&lt;pre&gt;&lt;font face="Verdana" size="1"&gt;EXEC xp_fixeddrives --undocumented procedure to retrieve the current available disk space&lt;/font&gt; &lt;/pre&gt;
&lt;pre&gt;&lt;font face="Arial" size="3"&gt;&lt;strong&gt;PART II: Server Capacity via Performance Monitoring&lt;/strong&gt;&lt;/font&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;p&gt;&lt;font face="Arial"&gt;Here's the second installment and still under construction. I'll be adding to this post so keep an eye on this one.&lt;/font&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Arial"&gt;The procedures at the end each setup are just examples on how you can retrieve the information for your own interpretation &lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Arial"&gt;(to help you out on this one, I found this excellent post &lt;font face="Arial"&gt;&lt;a href="http://www.sql-server-performance.com/tips/performance_main.aspx"&gt;http://www.sql-server-performance.com/tips/performance_main.aspx&lt;/a&gt;)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Arial"&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Arial"&gt;I am still trying to figure how to handle the different counters are there is little resource on them or maybe I'm looking in the wrong places &lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Arial"&gt;(to give you a jump start on the counters &lt;/font&gt;&lt;font face="Arial"&gt; &lt;font face="Arial"&gt;&lt;a href="http://technet2.microsoft.com/windowsserver/en/library/3fb01419-b1ab-4f52-a9f8-09d5ebeb9ef21033.mspx?mfr=true"&gt;http://technet2.microsoft.com/windowsserver/en/library/3fb01419-b1ab-4f52-a9f8-09d5ebeb9ef21033.mspx?mfr=true&lt;/a&gt;)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Arial"&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Arial"&gt;Also, you can add as many counters you want to monitor, these are just some of those that I want to monitor for the meantime&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Arial"&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Arial"&gt;As always, don't forget to create a scheduled job so you can retrieve data in different intervals. &lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Arial"&gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Arial"&gt;&lt;strong&gt;DDL&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Arial"&gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Arial"&gt;use database_name&lt;br /&gt;go&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Arial"&gt;create table PerformanceCounters&lt;br /&gt;( datestamp datetime default getdate()&lt;br /&gt; ,ObjectName varchar(30)&lt;br /&gt; ,CounterName varchar(50)&lt;br /&gt; ,InstanceName varchar(100)&lt;br /&gt; ,CntrValue bigint&lt;br /&gt; ,CntrType bigint&lt;br /&gt; ,constraint [PK_PerformanceCounters] &lt;br /&gt;  primary key clustered (datestamp desc ,objectname asc ,countername asc,instancename asc)&lt;br /&gt;)&lt;br /&gt;go&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Arial"&gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Arial"&gt;&lt;strong&gt;DML&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Arial"&gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Arial"&gt;create procedure GetPerformanceCounters&lt;br /&gt;as&lt;br /&gt;set nocount on&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Arial"&gt; declare @servicename varchar(200)&lt;br /&gt; select @servicename=case when @@servicename&amp;lt;&amp;gt;'mssqlserver' then 'MSSQL$' + @@servicename +':'&lt;br /&gt;  else 'sqlserver:' end &lt;br /&gt; &lt;br /&gt; insert into PerformanceCounters(objectname,countername,instancename,cntrvalue,cntrtype)&lt;br /&gt; select [object_name] &lt;br /&gt;  ,counter_name&lt;br /&gt;  ,coalesce(instance_name,' ')&lt;br /&gt;  ,cntr_value&lt;br /&gt;  ,cntr_type &lt;br /&gt; from sys.dm_os_performance_counters &lt;br /&gt; where ([object_name] =@servicename + 'Access Methods' and counter_name  in ('Page Splits/sec','Full Scans/sec'))&lt;br /&gt;  or ([object_name] =@servicename + 'Buffer Manager' and counter_name in ('Free Pages','Target Pages','Total pages','Buffer cache hit ratio','Buffer &lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Arial"&gt;cache hit ratio base','Page life expectancy','Lazy writes/sec','Checkpoint pages/sec'))&lt;br /&gt;  or ([object_name] =@servicename + 'Databases' and counter_name   in ('Log Flushes/sec','Log Flush Waits/sec','Log Flush Wait &lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Arial"&gt;Time','Transactions/sec','Backup/Restore Throughput/sec'))&lt;br /&gt;  or ([object_name] =@servicename + 'Locks' and counter_name  in ('Average Wait Time (ms)','Number of Deadlocks/sec'))&lt;br /&gt;  or ([object_name] =@servicename + 'SQL Statistics' and counter_name in ('SQL Compilations/sec','Batch Requests/sec'))&lt;br /&gt;  or ([object_name] =@servicename + 'General Statistics' and counter_name in ('Processes blocked','User Connections'))&lt;br /&gt;  or ([object_name] =@servicename + 'Memory Manager' and counter_name in ('Target Server Memory (KB)','Total Server Memory (KB)'))&lt;br /&gt;  or ([object_name] =@servicename + 'SQL Errors')&lt;br /&gt; order by counter_name asc&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Arial"&gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Arial"&gt; --summarize to retrieve meaningful data, this is ongoing, probably process some statistics data out so reading is easier&lt;br /&gt; &lt;br /&gt;set nocount off&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Arial"&gt;go&lt;/font&gt;&lt;/p&gt;&lt;font face="Arial"&gt;&lt;p&gt;&lt;br /&gt;create procedure spGetPerformanceOverview&lt;br /&gt; @startdate datetime=null&lt;br /&gt; ,@stopdate datetime=null&lt;br /&gt;as&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;set nocount on&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;-- IO Problems and transaction improvements&lt;br /&gt; &lt;br /&gt;select datestamp&lt;br /&gt; ,sum(case when countername='page splits/sec' then CntrValue else 0 end) as [Page Splits/sec]&lt;br /&gt; ,sum(case when countername='free pages' then CntrValue else 0 end) as [Free Pages]&lt;br /&gt; ,sum(case when countername='Target pages' then CntrValue else 0 end) as [Target Pages]&lt;br /&gt; ,sum(case when countername='Total pages' then CntrValue else 0 end) as [Total Pages]&lt;br /&gt; ,sum(case when countername='Log Flushes/Sec' and instancename='_Total' &lt;br /&gt;  then CntrValue else 0 end) as [Total Log Flushes/sec]&lt;br /&gt; ,sum(case when countername='Log Flush waits/Sec' and instancename='_Total' &lt;br /&gt;  then CntrValue else 0 end) as [Total Log Flush Waits/sec]&lt;br /&gt; ,sum(case when countername='Log Flush wait time' and instancename='_Total' &lt;br /&gt;  then CntrValue else 0 end) as [Total Log Flush Wait Time]&lt;br /&gt; ,sum(case when countername='Full Scans/sec' then CntrValue else 0 end) as [Full Scans/sec]&lt;br /&gt; ,sum(case when countername='average wait time (ms)' and Instancename='_Total' &lt;br /&gt;  then CntrValue else 0 end)/1000 as [Total Average Wait Time (sec)]&lt;br /&gt; ,sum(case when countername='average wait time (ms)' and Instancename='Application' &lt;br /&gt;  then CntrValue else 0 end)/1000 as [Application Average Wait Time (sec)]&lt;br /&gt; ,sum(case when countername='average wait time (ms)' and Instancename='Database' &lt;br /&gt;  then CntrValue else 0 end)/1000 as [Database Average Wait Time (sec)]&lt;br /&gt; ,sum(case when countername='number of deadlocks/sec' and Instancename='_Total' &lt;br /&gt;  then CntrValue else 0 end) as [Total Number Of Deadlocks/sec]&lt;br /&gt; ,sum(case when countername='number of deadlocks/sec' and Instancename='Database' &lt;br /&gt;  then CntrValue else 0 end) as [Database Number Of Deadlocks/sec]&lt;br /&gt; ,sum(case when countername='number of deadlocks/sec' and Instancename='Application' &lt;br /&gt;  then CntrValue else 0 end) as [Application Number Of Deadlocks/sec]&lt;br /&gt; ,sum(case when countername='SQL Compilations/sec'  &lt;br /&gt;  then CntrValue else 0 end) as [SQL Compilations/sec]&lt;br /&gt; ,sum(case when countername='Transactions/sec'  and instancename='_Total'&lt;br /&gt;  then CntrValue else 0 end) as [Total Transactions/sec]&lt;br /&gt; ,sum(case when countername='Processes Blocked'&lt;br /&gt;  then CntrValue else 0 end) as [Processes Blocked]&lt;br /&gt;from PerformanceCounters p&lt;br /&gt;where datestamp=(select max(datestamp) from performancecounters)  &lt;br /&gt;--and (instancename = coalesce(@database,instancename) or instancename is null or instancename='_Total')&lt;br /&gt;and countername in ('page splits/sec','free pages','Target pages','Total pages','Log Flushes/Sec'&lt;br /&gt;,'Log Flush waits/Sec','Log Flush wait time','Full Scans/sec','average wait time (ms)','number of deadlocks/sec' &lt;br /&gt;,'SQL Compilations/sec' ,'Transactions/sec','Processes Blocked'&lt;br /&gt;)&lt;br /&gt;group by datestamp&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;-- RAM&lt;br /&gt;select datestamp&lt;br /&gt; ,sum(case when countername='Target Server Memory (kb)' then CntrValue else 0 end) as [Target Server Memory (KB)]&lt;br /&gt; ,sum(case when countername='Total Server Memory (kb)' then CntrValue else 0 end) as [Total Server Memory (KB)]&lt;br /&gt; ,convert(decimal(18,2),convert(decimal(18,2),sum(case when countername='Buffer Cache Hit Ratio' then CntrValue else 0 end)) /&lt;br /&gt; sum(case when countername='Buffer Cache Hit Ratio Base' then CntrValue else 0 end))*100 as [Buffer Cache Hit Ratio]&lt;br /&gt; ,sum(case when countername='Page Life Expectancy' then CntrValue else 0 end) as [Page Life Expectancy]&lt;br /&gt; ,sum(case when countername='Lazy Writes/Sec' then CntrValue else 0 end) as [Lazy Writes/Sec]&lt;br /&gt; ,sum(case when countername='CheckPoint Pages/Sec' then CntrValue else 0 end)/1000 as [CheckPoint Pages/Sec]&lt;br /&gt;from PerformanceCounters p&lt;br /&gt;where datestamp=(select max(datestamp) from performancecounters)  &lt;br /&gt;--and (instancename = coalesce(@database,instancename) or instancename is null or instancename='_Total')&lt;br /&gt;and countername in ('Target Server Memory (kb)','Total Server Memory (kb)','Buffer Cache Hit Ratio','Buffer Cache Hit Ratio Base'&lt;br /&gt;,'Page Life Expectancy','Lazy Writes/Sec','CheckPoint Pages/Sec')&lt;br /&gt;group by datestamp&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;-- network&lt;/p&gt;&lt;p&gt;select datestamp&lt;br /&gt; ,sum(case when countername='Batch Requests/Sec' then CntrValue else 0 end) as [Batch Requests/Sec]&lt;br /&gt; ,sum(case when countername='User Connections' then CntrValue else 0 end) as [User Connections]&lt;br /&gt;from PerformanceCounters p&lt;br /&gt;where datestamp=(select max(datestamp) from performancecounters)  &lt;br /&gt;--and (instancename = coalesce(@database,instancename) or instancename is null or instancename='_Total')&lt;br /&gt;and countername in ('Batch Requests/Sec','User Connections')&lt;br /&gt;group by datestamp&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;-- backups/restores&lt;br /&gt;select datestamp&lt;br /&gt; ,instanceName&lt;br /&gt; ,sum(case when countername='Backup/Restore Throughput/sec' then CntrValue else 0 end) as [Backup/Restore Throughput/sec]&lt;br /&gt;from PerformanceCounters p&lt;br /&gt;where datestamp=(select max(datestamp) from performancecounters)  &lt;br /&gt;--and (instancename = coalesce(@database,instancename) or instancename is null or instancename='_Total')&lt;br /&gt;and countername in ('Backup/Restore Throughput/sec')&lt;br /&gt;group by datestamp,instancename&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;set nocount off&lt;/p&gt;&lt;p&gt;GO&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/font&gt; &lt;/pre&gt;
&lt;pre&gt; &lt;p&gt;&lt;font face="Arial"&gt;Don't forget the the server is as good as the queries you let it process. &lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="Arial"&gt;So it's always a matter of which-comes-first-egg-or-chicken case.&lt;/font&gt;&lt;/p&gt;&lt;/pre&gt;
&lt;pre&gt; &lt;/pre&gt;
&lt;pre&gt; &lt;/pre&gt;
&lt;/div&gt;&lt;img src="http://weblogs.sqlteam.com/jenm/aggbug/60404.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Jen</dc:creator>
            <guid>http://weblogs.sqlteam.com/jenm/archive/2007/11/14/60404.aspx</guid>
            <pubDate>Wed, 14 Nov 2007 21:16:34 GMT</pubDate>
            <comments>http://weblogs.sqlteam.com/jenm/archive/2007/11/14/60404.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://weblogs.sqlteam.com/jenm/comments/commentRss/60404.aspx</wfw:commentRss>
            <trackback:ping>http://weblogs.sqlteam.com/jenm/services/trackbacks/60404.aspx</trackback:ping>
        </item>
    </channel>
</rss>