Question :
I would like to see the activity on of the SQL server. So I can run a query when the server load is low. I know there is an activity monitor in SQL server but my company doesn’t want me to give the rights to use this tool. Apparently you can kill other people queries and this is too dangerous.
Is there a way to check the status of the server with code?
(Or view the activity without needing those rights so I can manually run them?)
Answer :
IT depends on what you want to actually monitor. Also do you want to log the data you have collected for baselining or performance trend reporting as well ?
- Have a look at SQL Server 2008 Diagnostic Information Queries using DMVs from Glenn Berry.
- Long Running Queries – which queries are taking the longest to run
- CPU Intensive Queries – which queries are consuming the most CPU per execution
- Worst Case Total CPU – which queries are consuming the most CPU across all executions
- Most IO Intensive Queries – which queries consume the most read/write operations
- Wait Statistics – waits happening on SQL Server i.e. Where actually SQL Server is waiting on. Here is the white paper Performance Tuning Waits Queues.doc
- Disk I/O bottleneck
There are many more areas to concentrate like Index tuning, query plan analysis, etc. This is just a tip of ice-berg but will serve a good starting point.
The below query uses the sys.dm_os_performance_counters DMV to capture the performance counters of SQL Server. You can change the WAITFOR DELAY options and the Numeric suffix after the second GO command to modify the time interval and the number of times you want the code to be executed.
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
IF OBJECT_ID('Tempdb..#PerformanceMonitor') IS NOT NULL
DROP TABLE #PerformanceMonitor;
CREATE TABLE #PerformanceMonitor
(
[object_name] NVARCHAR(255) NOT NULL,
[counter_name] NVARCHAR(255) NOT NULL,
[instance_name] NVARCHAR(255) NULL,
[cntr_value] BIGINT NOT NULL,
[cntr_type] INT NOT NULL,
[LoadedOn] DATETIME NOT NULL DEFAULT GETDATE(),
)
GO
INSERT INTO #PerformanceMonitor
([object_name],[counter_name],[instance_name],[cntr_value],[cntr_type])
(SELECT object_name,counter_name,instance_name,cntr_value,cntr_type
FROM sys.dm_os_performance_counters)
WAITFOR DELAY '00:00:10' --Change the interval here
GO 10 --Change the number of times the data will be captured here
SELECT * FROM #PerformanceMonitor
Once you have enough data and you have narrowed down the counters which are relevant, you can decide upon the best time to run your queries. And also as mentioned in the answer by @Yaroslav ,it is very important to keep in mind what type of query you want to run and decide accordingly.
And the most important thing, be careful with production data!!!
There is too much to track, logins, heavy queries execution, reads, writes, waits and more. The query you will run is just a report for example (heavy reads) or a big bulk insert? Or just maybe a performance tunning query or backup?
Check these links, maybe one can fit your needs.
- Some monitoring Scripts with the DMVs
- Paul Randall blog section on performance tunning
- this list of performance monitoring tools maybe one can be useful.
And there is much more. Search for sql server monitoring scripts, or performance monitoring scripts. Based on the data you collect you can choose when to run your query.