Now that you know a little more about
your hardware and whether you are getting the full benefit of the money
you spent on it, it is time to collect some information about the SQL
Server Services that are installed on the instance. In SQL Server 2008
R2 Service Pack 1 and later, and in SQL Server 2012, you can learn
quite a bit about which SQL Server Services are installed and how they
are configured and running from the query shown in Listing 7.
LISTING 7: SQL Server Services information
-- SQL Server Services information from SQL Server 2012
SELECT servicename, startup_type_desc, status_desc,
last_startup_time, service_account, is_clustered, cluster_nodename
FROM sys.dm_server_services WITH (NOLOCK) OPTION (RECOMPILE);
-- Gives you information about your installed SQL Server Services,
-- whether they are clustered, and which node owns the cluster resources
The preceding query tells you exactly
which SQL Server Services are installed, their startup type, whether
they are running, which account credentials they are using, when they
last started, whether they are clustered, and what node they are
running on in the cluster. This is all good information to know, and it
is very easy to find out with this new DMV. Next, you can get some
information about the SQL Server Error Log with the query shown in Listing 8.
LISTING 8: SQL Server Error Log information
-- Shows you where the SQL Server error log is located and how it is configured
SELECT is_enabled, [path], max_size, max_files
FROM sys.dm_os_server_diagnostics_log_configurations WITH (NOLOCK)
OPTION (RECOMPILE);
-- Knowing this information is important for troubleshooting purposes
This query gives you the file path to
the SQL Server Error Log (which is simply a text file that you can open
in Notepad in an emergency). If your SQL Server Service ever fails to
start, the first place you should look is in the SQL Server Error Log.
Of course, if your SQL Server Service is not running, you won’t be able
to run this query, so you should run it ahead of time and store the
results in your server run book. Next, you will find out whether your
database server is using Windows Clustering, with the query shown in Listing 9.
LISTING 9: Operating system cluster information
-- Get information about your OS cluster
--(if your database server is in a cluster)
SELECT VerboseLogging, SqlDumperDumpFlags, SqlDumperDumpPath,
SqlDumperDumpTimeOut, FailureConditionLevel, HealthCheckTimeout
FROM sys.dm_os_cluster_properties WITH (NOLOCK) OPTION (RECOMPILE);
-- You will see no results if your instance is not clustered
This query returns some configuration information
about your Windows cluster. If it returns no information, then your
operating system on the database server is not clustered (you have a
standalone instance), in which case you can skip the query shown in Listing 10.
Otherwise, if you are using a cluster, you can use the query shown in Listing 10 to get some useful information about your cluster nodes.
LISTING 10: Cluster node information
-- Get information about your cluster nodes and their status
-- (if your database server is in a cluster)
SELECT NodeName, status_description, is_current_owner
FROM sys.dm_os_cluster_nodes WITH (NOLOCK) OPTION (RECOMPILE);
-- Knowing which node owns the cluster resources is critical
-- Especially when you are installing Windows or SQL Server updates
This query returns all your cluster nodes,
including their status and whether they own the cluster resources. For
example, if you have a three-node cluster, this query would return
three rows and indicate which node currently owned the SQL Server
instance. This is actually important information to know if you are
getting ready to do some maintenance on the cluster, such as installing
a SQL Server cumulative update, as you would want to first install it
on a node that does not own the cluster resources as part of a rolling
update.
Next, you want to start gathering some additional
information about how your SQL Server instance is configured, which you
can do with the query shown in Listing 11.
LISTING 11: Instance configuration values
-- Get configuration values for instance
SELECT name, value, value_in_use, [description]
FROM sys.configurations WITH (NOLOCK)
ORDER BY name OPTION (RECOMPILE);
-- Focus on
-- backup compression default
-- clr enabled (only enable if it is needed)
-- lightweight pooling (should be zero)
-- max degree of parallelism
-- max server memory (MB) (set to an appropriate value)
-- optimize for ad hoc workloads (should be 1)
-- priority boost (should be zero)
This query returns current configuration values
for a fairly large number of instance-level properties. Some of these
properties can be changed using the SSMS graphical user interface, but
they can all be changed using the sp_configure system stored procedure.
You should focus on a few key configuration
values, which include backup compression default, clr enabled,
lightweight pooling, max degree of parallelism, max server memory (MB),
optimize for ad hoc workloads, and priority boost. Of these, the first
two values that you typically want to change from their default values
are backup compression default and optimize for ad hoc workloads , both of which should be enabled by setting them to 1. Next,
I suggest setting max server memory (MB) to an appropriate, non-default
value, taking into account which SQL Server components are installed
and running on your SQL Server instance. The idea behind this is to
ensure that memory is reserved for the operating system and other SQL
SERVER components, like SQL Server Integration Services (SSIS), so
there is sufficient memory for them to operate properly.
In SQL Server 2008 R2 and earlier, the max server
memory (MB) setting controlled only the memory used by the SQL Server
buffer pool, but in SQL Server 2012 it controls overall memory usage by
most other Database Engine components, which means you can probably set
the max server memory (MB) setting a little bit higher on SQL Server
2012 than in previous versions .
If any databases running on your instance use CLR
assemblies, you will have to enable CLR integration by setting clr
enabled to 1. Otherwise, it should not be enabled, as it uses some
resources on your database server and will increase your attack
surface. Most other instance configuration options should usually be
left at their default values, unless you have a good reason to change
them and you know what you are doing.
NOTE Whenever
I see every instance-level property set at its default value, I know
that the DBA or other administrator who installed and/or manages this
instance is inexperienced or perhaps just an “accidental DBA” who does
not understand which instance settings should be changed. It is also
possible that this person was just too busy to change anything from the
default settings or does not pay sufficient attention to detail (a
critical trait for a great DBA).