{"id":2372,"date":"2012-12-27T10:08:29","date_gmt":"2012-12-27T10:08:29","guid":{"rendered":"http:\/\/enjoyasp.net\/?p=2372"},"modified":"2012-12-27T10:11:30","modified_gmt":"2012-12-27T10:11:30","slug":"%e6%a3%80%e6%9f%a5sqlserver%e9%85%8d%e7%bd%ae%e6%98%af%e5%90%a6%e6%ad%a3%e7%a1%aesp_blitz","status":"publish","type":"post","link":"https:\/\/enjoyasp.net\/index.php\/2012\/12\/27\/%e6%a3%80%e6%9f%a5sqlserver%e9%85%8d%e7%bd%ae%e6%98%af%e5%90%a6%e6%ad%a3%e7%a1%aesp_blitz\/","title":{"rendered":"\u68c0\u67e5sqlserver\u914d\u7f6e\u662f\u5426\u6b63\u786esp_Blitz"},"content":{"rendered":"<p>\u68c0\u67e5\u662f\u5426\u5907\u4efd\uff0c\u5b89\u5168\u4e0a\u67e5\u8be2\u7ba1\u7406\u5458\u89d2\u8272\u7684\u662f\u54ea\u4e9b\u8d26\u53f7\uff0c\u7ef4\u62a4\u4e0aDBCC checkdb\u65f6\u95f4\u7b49\u3002<\/p>\n<div>\n\t<a href=\"http:\/\/www.brentozar.com\/blitz\/\">sp_Blitz<\/a><\/p>\n<pre class=\"brush:sql;first-line:1;pad-line-numbers:true;highlight:null;collapse:false;\">\r\nUSE master;\r\nGO\r\n\r\nIF OBJECT_ID(&#39;master.dbo.sp_Blitz&#39;) IS NOT NULL \r\n    DROP PROC dbo.sp_Blitz;\r\nGO\r\n\r\nCREATE PROCEDURE [dbo].[sp_Blitz]\r\n    @CheckUserDatabaseObjects TINYINT = 1 ,\r\n    @CheckProcedureCache TINYINT = 0 ,\r\n    @OutputType VARCHAR(20) = &#39;TABLE&#39; ,\r\n    @OutputProcedureCache TINYINT = 0 ,\r\n    @CheckProcedureCacheFilter VARCHAR(10) = NULL ,\r\n    @CheckServerInfo TINYINT = 0 ,\r\n    @Version INT = NULL OUTPUT\r\nAS \r\n    SET NOCOUNT ON;\r\n\/*\r\n    sp_Blitz v16 - December 13, 2012\r\n    \r\n    (C) 2012, Brent Ozar Unlimited\r\n\r\nTo learn more, visit http:\/\/www.BrentOzar.com\/blitz where you can download\r\nnew versions for free, watch training videos on how it works, get more info on\r\nthe findings, and more.  To contribute code and see your name in the change\r\nlog, email your improvements &amp; checks to Help@BrentOzar.com.\r\n\r\nExplanation of priority levels:\r\n  1 - Critical risk of data loss.  Fix this ASAP.\r\n 10 - Security risk.\r\n 20 - Security risk due to unusual configuration, but requires more research.\r\n 50 - Reliability risk.\r\n 60 - Reliability risk due to unusual configuration, but requires more research.\r\n100 - Performance risk.\r\n110 - Performance risk due to unusual configuration, but requires more research.\r\n200 - Informational.\r\n250 - Server info. Not warnings, just explaining data about the server.\r\n\r\nKnown limitations of this version:\r\n - No support for SQL Server 2000 or compatibility mode 80.\r\n - If a database name has a question mark in it, some tests will fail.  Gotta\r\n   love that unsupported sp_MSforeachdb.\r\n\r\nUnknown limitations of this version:\r\n - None.  (If we knew them, they&#39;d be known.  Duh.)\r\n\r\nChanges in v16:\r\n - Chris Fradenburg @ChrisFradenburg http:\/\/www.fradensql.com:\r\n   - Check 81 for non-active sp_configure options not yet taking effect.\r\n   - Improved check 35 to not alert if Optimize for Ad Hoc is already enabled.\r\n - Rob Sullivan @DataChomp http:\/\/datachomp.com:\r\n   - Suggested to add output variable @Version to manage server installations.\r\n - Vadim Mordkovich:\r\n   - Added check 85 for database users with elevated database roles like\r\n     db_owner, db_securityadmin, etc.\r\n - Vladimir Vissoultchev rewrote the DBCC CHECKDB check to work around a bug in\r\n   SQL Server 2008 &amp; R2 that report dbi_dbccLastKnownGood twice. For more info\r\n   on the bug, check Connect ID 485869.\r\n - Added check 77 for database snapshots.\r\n - Added check 78 for stored procedures with WITH RECOMPILE in the source code.\r\n - Added check 79 for Agent jobs with SHRINKDATABASE or SHRINKFILE.\r\n - Added check 80 for databases with a max file size set.\r\n - Added @CheckServerInfo perameter default 0. Adds additional server inventory\r\n   data in checks 83-85 for things like CPU, memory, service logins.  None of\r\n   these are problems, but if you&#39;re using sp_Blitz to assess a server you&#39;ve\r\n   never seen, you may want to know more about what you&#39;re working with. I do.\r\n - Tweaked check 75 for large log files so that it only alerts on files &gt; 1GB.\r\n - Changed one of the two check 59&#39;s to be check 82. (Doh!)\r\n - Added WITH NO_INFOMSGS to the DBCC calls to ease life for automation folks.\r\n - Works with offline and restoring databases. (Just happened to test it in\r\n   this version and it already worked - must have fixed this earlier.)\r\n\r\nChanges in v15:\r\n - Mikael Wedham caught bugs in a few checks that reported the wrong database name.\r\n - Bob Klimes fixed bugs in several checks where v14 broke case sensitivity.\r\n - Seth Washeck fixed bugs in the VLF checks so they include the number of VLFs.\r\n\r\nChanges in v14:\r\n - Lori Edwards @LoriEdwards http:\/\/sqlservertimes2.com\r\n     - Did all the coding in this version! She did a killer job of integrating\r\n\t   improvements and suggestions from all kinds of people, including:\r\n - Chris Fradenburg @ChrisFradenburg http:\/\/www.fradensql.com \r\n     - Check 74 to identify globally enabled traceflags\r\n - Jeremy Lowell @DataRealized http:\/\/datarealized.com added:\r\n     - Check 72 for non-aligned indexes on partitioned tables\r\n - Paul Anderton @Panders69 added check 69 to check for high VLF count\r\n - Ron van Moorsel added several changes\r\n\t - Added a change to check 6 to use sys.server_principals instead of syslogins\r\n\t - Added a change to check 25 to check whether tempdb was set to autogrow.  \r\n\t - Added a change to check 49 to check for linked servers configured with the SA login\r\n - Shaun Stuart @shaunjstu http:\/\/shaunjstuart.com added several changes:\r\n\t - Added check 68 to check for the last successful DBCC CHECKDB\r\n\t - Updated check 1 to verify the backup came from the current \r\n\t - Added check 70 to verify that @@servername is not null\r\n - Typo in check 51 changing free to present thanks to Sabu Varghese\r\n - Check 73 to determine if a failsafe operator has been configured\r\n - Check 75 for transaction log files larger than data files suggested by Chris Adkin\r\n - Fixed a bunch of bugs for oddball database names (like apostrophes).\r\n\r\nChanges in v13:\r\n - Fixed typos in descriptions of checks 60 &amp; 61 thanks to Mark Hions.\r\n - Improved check 14 to work with collations thanks to Greg Ackerland.\r\n - Improved several of the backup checks to exclude database snapshots and\r\n   databases that are currently being restored thanks to Greg Ackerland.\r\n - Improved wording on check 51 thanks to Stephen Criddle.\r\n - Added top line introducing the reader to sp_Blitz and the version number.\r\n - Changed Brent Ozar PLF, LLC to Brent Ozar Unlimited. Great catch by\r\n   Hondo Henriques, @SQLHondo.\r\n - If you&#39;ve submitted code recently to sp_Blitz, hang in there! We&#39;re still\r\n   building a big new version with lots of new checks. Just fixing bugs in\r\n   this small release.\r\n\r\nChanges in v12:\r\n - Added plan cache (aka procedure cache) analysis. Examines top resource-using\r\n   queries for common problems like implicit conversions, missing indexes, etc.\r\n - Added @CheckProcedureCacheFilter to focus plan cache analysis on\r\n   CPU, Reads, Duration, or ExecCount. If null, we analyze all of them.\r\n - Added @OutputProcedureCache to include the queries we analyzed. Results are\r\n   sorted using the @CheckProcedureCacheFilter parameter, otherwise by CPU.\r\n - Fixed case sensitive calls of sp_MSforeachdb reported by several users.\r\n\r\nChanges in v11:\r\n - Added check for optimize for ad hoc workloads in sys.configurations.\r\n - Added @OutputType parameter. Choices:\r\n \t- &#39;TABLE&#39; - default of one result set table with all warnings.\r\n\t- &#39;COUNT&#39; - Sesame Street&#39;s favorite character will tell you how many\r\n\t\t\t\tproblems sp_Blitz found.  Useful if you want to use a\r\n\t\t\t\tmonitoring tool to alert you when something changed.\r\n\r\nChanges in v10:\r\n - Jeremiah Peschka added check 59 for file growths set to a percentage.\r\n - Ned Otter added check 62 for old compatibility levels.\r\n - Wayne Sheffield improved checks 38 &amp; 39 by excluding more system tables.\r\n - Christopher Fradenburg improved check 30 (missing alerts) by making sure\r\n   that alerts are set up for all of the severity levels involved, not just\r\n   some of them.\r\n - James Siebengartner and others improved check 14 (page verification) by\r\n   excluding TempDB, which can&#39;t be set to checksum in older versions.\r\n - Added check 60 for index fill factors &lt;&gt; 0, 100.\r\n - Added check 61 for unusual SQL Server editions (not Standard, Enterprise, or\r\n   Developer)\r\n - Added limitations note to point out that compatibility mode 80 won&#39;t work.\r\n - Fixed a bug where changes in sp_configure weren&#39;t always reported.\r\n\r\nChanges in v9:\r\n - Alex Pixley fixed a spelling typo.\r\n - Steinar Anderson http:\/\/www.sqlservice.se fixed a date bug in checkid 2.\r\n   That bug was reported by several users, but Steinar coded the fix.\r\n - Stephen Schissler added a filter for checkid 2 (missing log backups) to look\r\n   only for databases where source_database_id is null because these are\r\n   database snapshots, and you can&#39;t run transaction log backups on snapshots.\r\n - Mark Fleming @markflemingnl added checkid 62 looking for disabled alerts.\r\n - Checkid 17 typo changed from &quot;disabled&quot; to &quot;enabled&quot; - the check\r\n   functionality was right, but it was warning that auto update stats async\r\n   was &quot;disabled&quot;.  Disabled is actually the default, but the check was\r\n   firing because it had been enabled.  (This one was reported by many.)\r\n\r\nChanges in v8 May 10 2012:\r\n - Switched more-details URLs to be short.  This way they&#39;ll render better\r\n   when viewed in our SQL Server Management Studio reports.\r\n - Removed ?VersionNumber querystring parameter to shorten links in SSMS.\r\n - Eliminated duplicate check for startup stored procedures.\r\n\r\nChanges in v7 April 30 2012:\r\n - Thomas Rushton http:\/\/thelonedba.wordpress.com\/ @ThomasRushton added check\r\n   58 for database collations that don&#39;t match the server collation.\r\n - Rob Pellicaan caught a bug in check 13: it was only checking for plan guides\r\n   in the master database rather than all user databases.\r\n - Michal Tinthofer http:\/\/www.woodler.eu improved check 2 to work across\r\n   collations and fix a bug in the backup_finish_date check.  (Several people\r\n   reported this, but Michal contributed the most improvements to this check.)\r\n - Chris Fradenburg improved checks 38 and 39 by excluding heaps if they are\r\n   marked is_ms_shipped, thereby excluding more system stuff.\r\n - Jack Whittaker fixed a bug in checkid 1.  When checking for databases\r\n   without a full backup, we were ignoring the model database, but some shops\r\n   really do need to back up model because they put stuff in there to be\r\n   copied into each new database, so let&#39;s alert on that too.  Larry Silverman\r\n   also noticed this bug.\r\n - Michael Burgess caught a bug in the untrusted key\/constraint checks that\r\n   were not checking for is_disabled = 0.\r\n - Alex Friedman fixed a bug in check 44 which required a running trace.\r\n - New check for SQL Agent alerts configured without operator notifications.\r\n - Even if @CheckUserDatabaseObjects was set to 0, some user database object\r\n   checks were being done.\r\n - Check 48 for untrusted foreign keys now just returns one line per database\r\n   that has the issue rather than listing every foreign key individually. For\r\n   the full list of untrusted keys, run the query in the finding&#39;s URL.\r\n\r\nChanges in v6 Dec 26 2011:\r\n - Jonathan Allen @FatherJack suggested tweaking sp_BlitzUpdate&#39;s error message\r\n    about Ad Hoc Queries not being enabled so that it also includes\r\n    instructions on how to disable them again after temporarily enabling\r\n    it to update sp_Blitz. \r\n\r\nChanges in v5 Dec 18 2011:\r\n - John Miner suggested tweaking checkid 48 and 56, the untrusted constraints\r\n    and keys, to look for is_not_for_replication = 0 too.  This filters out\r\n    constraints\/keys that are only used for replication and don&#39;t need to\r\n    be trusted.\r\n - Ned Otter caught a bug in the URL for check 7, startup stored procs.\r\n - Scott (Anon) recommended using SUSER_SNAME(0x01) instead of &#39;sa&#39; when\r\n    checking for job ownership, database ownership, etc.\r\n - Martin Schmidt http:\/\/www.geniiius.com\/blog\/ caught a bug in checkid 1 and\r\n    contributed code to catch databases that had never been backed up.\r\n - Added parameter for @CheckProcedureCache.  When set to 0, we skip the checks\r\n    that are typically the slowest on servers with lots of memory.  I&#39;m\r\n    defaulting this to 0 so more users can get results back faster.\r\n\r\nChanges in v4 Nov 1 2011:\r\n - Andreas Schubert caught a typo in the explanations for checks 15-17.\r\n - K. Brian Kelley @kbriankelley added checkid 57 for SQL Agent jobs set to\r\n      start automatically on startup.\r\n - Added parameter for @CheckUserDatabaseObjects.  When set to 0, we skip the\r\n    checks that are typically the slowest on large servers, the user\r\n    database schema checks for things like triggers, hypothetical\r\n    indexes, untrusted constraints, etc.\r\n\r\nChanges in v3 Oct 16 2011:\r\n - David Tolbert caught a bug in checkid 2.  If some backups had failed or\r\n        been aborted, we raised a false alarm about no transaction log backups.\r\n - Fixed more bugs in checking for SQL Server 2005. (I need more 2005 VMs!)\r\n\r\nChanges in v2 Oct 14 2011:\r\n - Ali Razeghi http:\/\/www.alirazeghi.com added checkid 55 looking for\r\n   databases owned by &lt;&gt; SA.\r\n - Fixed bugs in checking for SQL Server 2005 (leading % signs)\r\n\r\n*\/\r\n\r\n    IF OBJECT_ID(&#39;tempdb..#BlitzResults&#39;) IS NOT NULL \r\n        DROP TABLE #BlitzResults;\r\n    CREATE TABLE #BlitzResults\r\n        (\r\n          ID INT IDENTITY(1, 1) ,\r\n          CheckID INT ,\r\n          Priority TINYINT ,\r\n          FindingsGroup VARCHAR(50) ,\r\n          Finding VARCHAR(200) ,\r\n          URL VARCHAR(200) ,\r\n          Details NVARCHAR(4000) ,\r\n          QueryPlan [XML] NULL ,\r\n          QueryPlanFiltered [NVARCHAR](MAX) NULL\r\n        );\r\n\r\n    IF OBJECT_ID(&#39;tempdb..#ConfigurationDefaults&#39;) IS NOT NULL \r\n        DROP TABLE #ConfigurationDefaults;\r\n    CREATE TABLE #ConfigurationDefaults\r\n        (\r\n          name NVARCHAR(128) ,\r\n          DefaultValue BIGINT\r\n        );\r\n\r\n    IF @CheckProcedureCache = 1 \r\n        BEGIN\r\n            IF OBJECT_ID(&#39;tempdb..#dm_exec_query_stats&#39;) IS NOT NULL \r\n                DROP TABLE #dm_exec_query_stats;\r\n            CREATE TABLE #dm_exec_query_stats\r\n                (\r\n                  [id] [int] NOT NULL\r\n                             IDENTITY(1, 1) ,\r\n                  [sql_handle] [varbinary](64) NOT NULL ,\r\n                  [statement_start_offset] [int] NOT NULL ,\r\n                  [statement_end_offset] [int] NOT NULL ,\r\n                  [plan_generation_num] [bigint] NOT NULL ,\r\n                  [plan_handle] [varbinary](64) NOT NULL ,\r\n                  [creation_time] [datetime] NOT NULL ,\r\n                  [last_execution_time] [datetime] NOT NULL ,\r\n                  [execution_count] [bigint] NOT NULL ,\r\n                  [total_worker_time] [bigint] NOT NULL ,\r\n                  [last_worker_time] [bigint] NOT NULL ,\r\n                  [min_worker_time] [bigint] NOT NULL ,\r\n                  [max_worker_time] [bigint] NOT NULL ,\r\n                  [total_physical_reads] [bigint] NOT NULL ,\r\n                  [last_physical_reads] [bigint] NOT NULL ,\r\n                  [min_physical_reads] [bigint] NOT NULL ,\r\n                  [max_physical_reads] [bigint] NOT NULL ,\r\n                  [total_logical_writes] [bigint] NOT NULL ,\r\n                  [last_logical_writes] [bigint] NOT NULL ,\r\n                  [min_logical_writes] [bigint] NOT NULL ,\r\n                  [max_logical_writes] [bigint] NOT NULL ,\r\n                  [total_logical_reads] [bigint] NOT NULL ,\r\n                  [last_logical_reads] [bigint] NOT NULL ,\r\n                  [min_logical_reads] [bigint] NOT NULL ,\r\n                  [max_logical_reads] [bigint] NOT NULL ,\r\n                  [total_clr_time] [bigint] NOT NULL ,\r\n                  [last_clr_time] [bigint] NOT NULL ,\r\n                  [min_clr_time] [bigint] NOT NULL ,\r\n                  [max_clr_time] [bigint] NOT NULL ,\r\n                  [total_elapsed_time] [bigint] NOT NULL ,\r\n                  [last_elapsed_time] [bigint] NOT NULL ,\r\n                  [min_elapsed_time] [bigint] NOT NULL ,\r\n                  [max_elapsed_time] [bigint] NOT NULL ,\r\n                  [query_hash] [binary](8) NULL ,\r\n                  [query_plan_hash] [binary](8) NULL ,\r\n                  [query_plan] [xml] NULL ,\r\n                  [query_plan_filtered] [nvarchar](MAX) NULL ,\r\n                  [text] [nvarchar](MAX) COLLATE SQL_Latin1_General_CP1_CI_AS\r\n                                         NULL ,\r\n                  [text_filtered] [nvarchar](MAX)\r\n                    COLLATE SQL_Latin1_General_CP1_CI_AS\r\n                    NULL\r\n                )\r\n\t\r\n        END\r\n\r\n    DECLARE @StringToExecute NVARCHAR(4000);\r\n\r\n    INSERT  INTO #BlitzResults\r\n            ( CheckID ,\r\n              Priority ,\r\n              FindingsGroup ,\r\n              Finding ,\r\n              URL ,\r\n              Details\r\n            )\r\n            SELECT  1 AS CheckID ,\r\n                    1 AS Priority ,\r\n                    &#39;Backup&#39; AS FindingsGroup ,\r\n                    &#39;Backups Not Performed Recently&#39; AS Finding ,\r\n                    &#39;http:\/\/BrentOzar.com\/go\/nobak&#39; AS URL ,\r\n                    &#39;Database &#39; + d.Name + &#39; last backed up: &#39;\r\n                    + CAST(COALESCE(MAX(b.backup_finish_date), &#39; never &#39;) AS VARCHAR(200)) AS Details\r\n            FROM    master.sys.databases d\r\n                    LEFT OUTER JOIN msdb.dbo.backupset b ON d.name = b.database_name\r\n                                                            AND b.type = &#39;D&#39;\r\n                                                            AND b.server_name = @@SERVERNAME \/*Backupset ran on current server *\/\r\n            WHERE   d.database_id &lt;&gt; 2  \/* Bonus points if you know what that means *\/\r\n                    AND d.state &lt;&gt; 1 \/* Not currently restoring, like log shipping databases *\/\r\n                    AND d.is_in_standby = 0 \/* Not a log shipping target database *\/\r\n                    AND d.source_database_id IS NULL \/* Excludes database snapshots *\/\r\n            GROUP BY d.name\r\n            HAVING  MAX(b.backup_finish_date) &lt;= DATEADD(dd, -7, GETDATE());\r\n\r\n\r\n    INSERT  INTO #BlitzResults\r\n            ( CheckID ,\r\n              Priority ,\r\n              FindingsGroup ,\r\n              Finding ,\r\n              URL ,\r\n              Details\r\n              \r\n            )\r\n            SELECT  1 AS CheckID ,\r\n                    1 AS Priority ,\r\n                    &#39;Backup&#39; AS FindingsGroup ,\r\n                    &#39;Backups Not Performed Recently&#39; AS Finding ,\r\n                    &#39;http:\/\/BrentOzar.com\/go\/nobak&#39; AS URL ,\r\n                    ( &#39;Database &#39; + d.Name + &#39; never backed up.&#39; ) AS Details\r\n            FROM    master.sys.databases d\r\n            WHERE   d.database_id &lt;&gt; 2 \/* Bonus points if you know what that means *\/\r\n                    AND d.state &lt;&gt; 1 \/* Not currently restoring, like log shipping databases *\/\r\n                    AND d.is_in_standby = 0 \/* Not a log shipping target database *\/\r\n                    AND d.source_database_id IS NULL \/* Excludes database snapshots *\/\r\n                    AND NOT EXISTS ( SELECT *\r\n                                     FROM   msdb.dbo.backupset b\r\n                                     WHERE  d.name = b.database_name\r\n                                            AND b.type = &#39;D&#39;\r\n                                            AND b.server_name = @@SERVERNAME \/*Backupset ran on current server *\/)\r\n\r\n    INSERT  INTO #BlitzResults\r\n            ( CheckID ,\r\n              Priority ,\r\n              FindingsGroup ,\r\n              Finding ,\r\n              URL ,\r\n              Details\r\n            )\r\n            SELECT DISTINCT\r\n                    2 AS CheckID ,\r\n                    1 AS Priority ,\r\n                    &#39;Backup&#39; AS FindingsGroup ,\r\n                    &#39;Full Recovery Mode w\/o Log Backups&#39; AS Finding ,\r\n                    &#39;http:\/\/BrentOzar.com\/go\/biglogs&#39; AS URL ,\r\n                    ( &#39;Database &#39; + ( d.Name COLLATE database_default )\r\n                      + &#39; is in &#39; + d.recovery_model_desc\r\n                      + &#39; recovery mode but has not had a log backup in the last week.&#39; ) AS Details\r\n            FROM    master.sys.databases d\r\n            WHERE   d.recovery_model IN ( 1, 2 )\r\n                    AND d.database_id NOT IN ( 2, 3 )\r\n                    AND d.source_database_id IS NULL\r\n                    AND d.state &lt;&gt; 1 \/* Not currently restoring, like log shipping databases *\/\r\n                    AND d.is_in_standby = 0 \/* Not a log shipping target database *\/\r\n                    AND d.source_database_id IS NULL \/* Excludes database snapshots *\/\r\n                    AND NOT EXISTS ( SELECT *\r\n                                     FROM   msdb.dbo.backupset b\r\n                                     WHERE  d.name = b.database_name\r\n                                            AND b.type = &#39;L&#39;\r\n                                            AND b.backup_finish_date &gt;= DATEADD(dd,\r\n                                                              -7, GETDATE()) );\r\n\r\n\r\n\r\n\r\n    INSERT  INTO #BlitzResults\r\n            ( CheckID ,\r\n              Priority ,\r\n              FindingsGroup ,\r\n              Finding ,\r\n              URL ,\r\n              Details\r\n            )\r\n            SELECT TOP 1\r\n                    3 AS CheckID ,\r\n                    200 AS Priority ,\r\n                    &#39;Backup&#39; AS FindingsGroup ,\r\n                    &#39;MSDB Backup History Not Purged&#39; AS Finding ,\r\n                    &#39;http:\/\/BrentOzar.com\/go\/history&#39; AS URL ,\r\n                    ( &#39;Database backup history retained back to &#39;\r\n                      + CAST(bs.backup_start_date AS VARCHAR(20)) ) AS Details\r\n            FROM    msdb.dbo.backupset bs\r\n            WHERE   bs.backup_start_date &lt;= DATEADD(dd, -60, GETDATE())\r\n            ORDER BY backup_set_id ASC;\r\n\r\n\r\n    INSERT  INTO #BlitzResults\r\n            ( CheckID ,\r\n              Priority ,\r\n              FindingsGroup ,\r\n              Finding ,\r\n              URL ,\r\n              Details\r\n            )\r\n            SELECT  4 AS CheckID ,\r\n                    10 AS Priority ,\r\n                    &#39;Security&#39; AS FindingsGroup ,\r\n                    &#39;Sysadmins&#39; AS Finding ,\r\n                    &#39;http:\/\/BrentOzar.com\/go\/sa&#39; AS URL ,\r\n                    ( &#39;Login [&#39; + l.name\r\n                      + &#39;] is a sysadmin - meaning they can do absolutely anything in SQL Server, including dropping databases or hiding their tracks.&#39; ) AS Details\r\n            FROM    master.sys.syslogins l\r\n            WHERE   l.sysadmin = 1\r\n                    AND l.name &lt;&gt; SUSER_SNAME(0x01)\r\n                    AND l.denylogin = 0;\r\n\r\n    INSERT  INTO #BlitzResults\r\n            ( CheckID ,\r\n              Priority ,\r\n              FindingsGroup ,\r\n              Finding ,\r\n              URL ,\r\n              Details\r\n            )\r\n            SELECT  5 AS CheckID ,\r\n                    10 AS Priority ,\r\n                    &#39;Security&#39; AS FindingsGroup ,\r\n                    &#39;Security Admins&#39; AS Finding ,\r\n                    &#39;http:\/\/BrentOzar.com\/go\/sa&#39; AS URL ,\r\n                    ( &#39;Login [&#39; + l.name\r\n                      + &#39;] is a security admin - meaning they can give themselves permission to do absolutely anything in SQL Server, including dropping databases or hiding their tracks.&#39; ) AS Details\r\n            FROM    master.sys.syslogins l\r\n            WHERE   l.securityadmin = 1\r\n                    AND l.name &lt;&gt; SUSER_SNAME(0x01)\r\n                    AND l.denylogin = 0;\r\n\r\n    INSERT  INTO #BlitzResults\r\n            ( CheckID ,\r\n              Priority ,\r\n              FindingsGroup ,\r\n              Finding ,\r\n              URL ,\r\n              Details\r\n            )\r\n            SELECT  6 AS CheckID ,\r\n                    200 AS Priority ,\r\n                    &#39;Security&#39; AS FindingsGroup ,\r\n                    &#39;Jobs Owned By Users&#39; AS Finding ,\r\n                    &#39;http:\/\/BrentOzar.com\/go\/owners&#39; AS URL ,\r\n                    ( &#39;Job [&#39; + j.name + &#39;] is owned by [&#39; + sl.name\r\n                      + &#39;] - meaning if their login is disabled or not available due to Active Directory problems, the job will stop working.&#39; ) AS Details\r\n            FROM    msdb.dbo.sysjobs j\r\n                    LEFT OUTER JOIN sys.server_principals sl ON j.owner_sid = sl.sid\r\n            WHERE   j.enabled = 1\r\n                    AND sl.name &lt;&gt; SUSER_SNAME(0x01);\r\n\r\n    INSERT  INTO #BlitzResults\r\n            ( CheckID ,\r\n              Priority ,\r\n              FindingsGroup ,\r\n              Finding ,\r\n              URL ,\r\n              Details\r\n            )\r\n            SELECT  7 AS CheckID ,\r\n                    10 AS Priority ,\r\n                    &#39;Security&#39; AS FindingsGroup ,\r\n                    &#39;Stored Procedure Runs at Startup&#39; AS Finding ,\r\n                    &#39;http:\/\/BrentOzar.com\/go\/startup&#39; AS URL ,\r\n                    ( &#39;Stored procedure [master].[&#39; + r.SPECIFIC_SCHEMA\r\n                      + &#39;].[&#39; + r.SPECIFIC_NAME\r\n                      + &#39;] runs automatically when SQL Server starts up.  Make sure you know exactly what this stored procedure is doing, because it could pose a security risk.&#39; ) AS Details\r\n            FROM    master.INFORMATION_SCHEMA.ROUTINES r\r\n            WHERE   OBJECTPROPERTY(OBJECT_ID(ROUTINE_NAME), &#39;ExecIsStartup&#39;) = 1;\r\n\r\n    IF @@VERSION NOT LIKE &#39;%Microsoft SQL Server 2000%&#39;\r\n        AND @@VERSION NOT LIKE &#39;%Microsoft SQL Server 2005%&#39; \r\n        BEGIN\r\n            SET @StringToExecute = &#39;INSERT INTO #BlitzResults (CheckID, Priority, FindingsGroup, Finding, URL, Details)\r\nSELECT 8 AS CheckID, 150 AS Priority, &#39;&#39;Security&#39;&#39; AS FindingsGroup, &#39;&#39;Server Audits Running&#39;&#39; AS Finding, \r\n    &#39;&#39;http:\/\/BrentOzar.com\/go\/audits&#39;&#39; AS URL,\r\n    (&#39;&#39;SQL Server built-in audit functionality is being used by server audit: &#39;&#39; + [name]) AS Details FROM sys.dm_server_audit_status&#39;\r\n            EXECUTE(@StringToExecute)\r\n        END;\r\n\r\n    IF @@VERSION NOT LIKE &#39;%Microsoft SQL Server 2000%&#39; \r\n        BEGIN\r\n            SET @StringToExecute = &#39;INSERT INTO #BlitzResults (CheckID, Priority, FindingsGroup, Finding, URL, Details)\r\nSELECT 9 AS CheckID, 200 AS Priority, &#39;&#39;Surface Area&#39;&#39; AS FindingsGroup, &#39;&#39;Endpoints Configured&#39;&#39; AS Finding, \r\n    &#39;&#39;http:\/\/BrentOzar.com\/go\/endpoints\/&#39;&#39; AS URL,\r\n    (&#39;&#39;SQL Server endpoints are configured.  These can be used for database mirroring or Service Broker, but if you do not need them, avoid leaving them enabled.  Endpoint name: &#39;&#39; + [name]) AS Details FROM sys.endpoints WHERE type &lt;&gt; 2&#39;\r\n            EXECUTE(@StringToExecute)\r\n        END;\r\n\r\n    IF @@VERSION NOT LIKE &#39;%Microsoft SQL Server 2000%&#39;\r\n        AND @@VERSION NOT LIKE &#39;%Microsoft SQL Server 2005%&#39; \r\n        BEGIN\r\n            SET @StringToExecute = &#39;INSERT INTO #BlitzResults (CheckID, Priority, FindingsGroup, Finding, URL, Details)\r\nSELECT 10 AS CheckID, 100 AS Priority, &#39;&#39;Performance&#39;&#39; AS FindingsGroup, &#39;&#39;Resource Governor Enabled&#39;&#39; AS Finding, \r\n    &#39;&#39;http:\/\/BrentOzar.com\/go\/rg&#39;&#39; AS URL,\r\n    (&#39;&#39;Resource Governor is enabled.  Queries may be throttled.  Make sure you understand how the Classifier Function is configured.&#39;&#39;) AS Details FROM sys.resource_governor_configuration WHERE is_enabled = 1&#39;\r\n            EXECUTE(@StringToExecute)\r\n        END;\r\n\r\n\r\n    IF @@VERSION NOT LIKE &#39;%Microsoft SQL Server 2000%&#39; \r\n        BEGIN\r\n            SET @StringToExecute = &#39;INSERT INTO #BlitzResults (CheckID, Priority, FindingsGroup, Finding, URL, Details)\r\nSELECT 11 AS CheckID, 100 AS Priority, &#39;&#39;Performance&#39;&#39; AS FindingsGroup, &#39;&#39;Server Triggers Enabled&#39;&#39; AS Finding, \r\n    &#39;&#39;http:\/\/BrentOzar.com\/go\/logontriggers\/&#39;&#39; AS URL,\r\n    (&#39;&#39;Server Trigger [&#39;&#39; + [name] ++ &#39;&#39;] is enabled, so it runs every time someone logs in.  Make sure you understand what that trigger is doing - the less work it does, the better.&#39;&#39;) AS Details FROM sys.server_triggers WHERE is_disabled = 0 AND is_ms_shipped = 0&#39;\r\n            EXECUTE(@StringToExecute)\r\n        END;\r\n\r\n\r\n    INSERT  INTO #BlitzResults\r\n            ( CheckID ,\r\n              Priority ,\r\n              FindingsGroup ,\r\n              Finding ,\r\n              URL ,\r\n              Details\r\n            )\r\n            SELECT  12 AS CheckID ,\r\n                    10 AS Priority ,\r\n                    &#39;Performance&#39; AS FindingsGroup ,\r\n                    &#39;Auto-Close Enabled&#39; AS Finding ,\r\n                    &#39;http:\/\/BrentOzar.com\/go\/autoclose&#39; AS URL ,\r\n                    ( &#39;Database [&#39; + [name]\r\n                      + &#39;] has auto-close enabled.  This setting can dramatically decrease performance.&#39; ) AS Details\r\n            FROM    sys.databases\r\n            WHERE   is_auto_close_on = 1;\r\n\r\n    INSERT  INTO #BlitzResults\r\n            ( CheckID ,\r\n              Priority ,\r\n              FindingsGroup ,\r\n              Finding ,\r\n              URL ,\r\n              Details\r\n            )\r\n            SELECT  12 AS CheckID ,\r\n                    10 AS Priority ,\r\n                    &#39;Performance&#39; AS FindingsGroup ,\r\n                    &#39;Auto-Shrink Enabled&#39; AS Finding ,\r\n                    &#39;http:\/\/BrentOzar.com\/go\/autoshrink&#39; AS URL ,\r\n                    ( &#39;Database [&#39; + [name]\r\n                      + &#39;] has auto-shrink enabled.  This setting can dramatically decrease performance.&#39; ) AS Details\r\n            FROM    sys.databases\r\n            WHERE   is_auto_shrink_on = 1;\r\n\r\n\r\n    IF @@VERSION LIKE &#39;%Microsoft SQL Server 2000%&#39; \r\n        BEGIN\r\n            SET @StringToExecute = &#39;INSERT INTO #BlitzResults (CheckID, Priority, FindingsGroup, Finding, URL, Details)\r\nSELECT 14 AS CheckID, 50 AS Priority, &#39;&#39;Reliability&#39;&#39; AS FindingsGroup, &#39;&#39;Page Verification Not Optimal&#39;&#39; AS Finding, \r\n    &#39;&#39;http:\/\/BrentOzar.com\/go\/torn&#39;&#39; AS URL,\r\n    (&#39;&#39;Database [&#39;&#39; + [name] + &#39;&#39;] has &#39;&#39; + [page_verify_option_desc] + &#39;&#39; for page verification.  SQL Server may have a harder time recognizing and recovering from storage corruption.  Consider using CHECKSUM instead.&#39;&#39;) COLLATE database_default AS Details FROM sys.databases WHERE page_verify_option &lt; 1 AND name &lt;&gt; &#39;&#39;tempdb&#39;&#39;&#39;\r\n            EXECUTE(@StringToExecute)\r\n        END;\r\n\r\n    IF @@VERSION NOT LIKE &#39;%Microsoft SQL Server 2000%&#39; \r\n        BEGIN\r\n            SET @StringToExecute = &#39;INSERT INTO #BlitzResults (CheckID, Priority, FindingsGroup, Finding, URL, Details)\r\nSELECT 14 AS CheckID, 50 AS Priority, &#39;&#39;Reliability&#39;&#39; AS FindingsGroup, &#39;&#39;Page Verification Not Optimal&#39;&#39; AS Finding, \r\n    &#39;&#39;http:\/\/BrentOzar.com\/go\/torn&#39;&#39; AS URL,\r\n    (&#39;&#39;Database [&#39;&#39; + [name] + &#39;&#39;] has &#39;&#39; + [page_verify_option_desc] + &#39;&#39; for page verification.  SQL Server may have a harder time recognizing and recovering from storage corruption.  Consider using CHECKSUM instead.&#39;&#39;) AS Details FROM sys.databases WHERE page_verify_option &lt; 2 AND name &lt;&gt; &#39;&#39;tempdb&#39;&#39;&#39;\r\n            EXECUTE(@StringToExecute)\r\n        END;\r\n\r\n    INSERT  INTO #BlitzResults\r\n            ( CheckID ,\r\n              Priority ,\r\n              FindingsGroup ,\r\n              Finding ,\r\n              URL ,\r\n              Details\r\n            )\r\n            SELECT  15 AS CheckID ,\r\n                    110 AS Priority ,\r\n                    &#39;Performance&#39; AS FindingsGroup ,\r\n                    &#39;Auto-Create Stats Disabled&#39; AS Finding ,\r\n                    &#39;http:\/\/BrentOzar.com\/go\/acs&#39; AS URL ,\r\n                    ( &#39;Database [&#39; + [name]\r\n                      + &#39;] has auto-create-stats disabled.  SQL Server uses statistics to build better execution plans, and without the ability to automatically create more, performance may suffer.&#39; ) AS Details\r\n            FROM    sys.databases\r\n            WHERE   is_auto_create_stats_on = 0;\r\n\r\n    INSERT  INTO #BlitzResults\r\n            ( CheckID ,\r\n              Priority ,\r\n              FindingsGroup ,\r\n              Finding ,\r\n              URL ,\r\n              Details\r\n            )\r\n            SELECT  16 AS CheckID ,\r\n                    110 AS Priority ,\r\n                    &#39;Performance&#39; AS FindingsGroup ,\r\n                    &#39;Auto-Update Stats Disabled&#39; AS Finding ,\r\n                    &#39;http:\/\/BrentOzar.com\/go\/aus&#39; AS URL ,\r\n                    ( &#39;Database [&#39; + [name]\r\n                      + &#39;] has auto-update-stats disabled.  SQL Server uses statistics to build better execution plans, and without the ability to automatically update them, performance may suffer.&#39; ) AS Details\r\n            FROM    sys.databases\r\n            WHERE   is_auto_update_stats_on = 0;\r\n\r\n    INSERT  INTO #BlitzResults\r\n            ( CheckID ,\r\n              Priority ,\r\n              FindingsGroup ,\r\n              Finding ,\r\n              URL ,\r\n              Details\r\n            )\r\n            SELECT  17 AS CheckID ,\r\n                    110 AS Priority ,\r\n                    &#39;Performance&#39; AS FindingsGroup ,\r\n                    &#39;Stats Updated Asynchronously&#39; AS Finding ,\r\n                    &#39;http:\/\/BrentOzar.com\/go\/asyncstats&#39; AS URL ,\r\n                    ( &#39;Database [&#39; + [name]\r\n                      + &#39;] has auto-update-stats-async enabled.  When SQL Server gets a query for a table with out-of-date statistics, it will run the query with the stats it has - while updating stats to make later queries better. The initial run of the query may suffer, though.&#39; ) AS Details\r\n            FROM    sys.databases\r\n            WHERE   is_auto_update_stats_async_on = 1;\r\n\r\n\r\n    INSERT  INTO #BlitzResults\r\n            ( CheckID ,\r\n              Priority ,\r\n              FindingsGroup ,\r\n              Finding ,\r\n              URL ,\r\n              Details\r\n            )\r\n            SELECT  18 AS CheckID ,\r\n                    110 AS Priority ,\r\n                    &#39;Performance&#39; AS FindingsGroup ,\r\n                    &#39;Forced Parameterization On&#39; AS Finding ,\r\n                    &#39;http:\/\/BrentOzar.com\/go\/forced&#39; AS URL ,\r\n                    ( &#39;Database [&#39; + [name]\r\n                      + &#39;] has forced parameterization enabled.  SQL Server will aggressively reuse query execution plans even if the applications do not parameterize their queries.  This can be a performance booster with some programming languages, or it may use universally bad execution plans when better alternatives are available for certain parameters.&#39; ) AS Details\r\n            FROM    sys.databases\r\n            WHERE   is_parameterization_forced = 1;\r\n\r\n\r\n    INSERT  INTO #BlitzResults\r\n            ( CheckID ,\r\n              Priority ,\r\n              FindingsGroup ,\r\n              Finding ,\r\n              URL ,\r\n              Details\r\n            )\r\n            SELECT  19 AS CheckID ,\r\n                    200 AS Priority ,\r\n                    &#39;Informational&#39; AS FindingsGroup ,\r\n                    &#39;Replication In Use&#39; AS Finding ,\r\n                    &#39;http:\/\/BrentOzar.com\/go\/repl&#39; AS URL ,\r\n                    ( &#39;Database [&#39; + [name]\r\n                      + &#39;] is a replication publisher, subscriber, or distributor.&#39; ) AS Details\r\n            FROM    sys.databases\r\n            WHERE   is_published = 1\r\n                    OR is_subscribed = 1\r\n                    OR is_merge_published = 1\r\n                    OR is_distributor = 1;\r\n\r\n    INSERT  INTO #BlitzResults\r\n            ( CheckID ,\r\n              Priority ,\r\n              FindingsGroup ,\r\n              Finding ,\r\n              URL ,\r\n              Details\r\n            )\r\n            SELECT  20 AS CheckID ,\r\n                    110 AS Priority ,\r\n                    &#39;Informational&#39; AS FindingsGroup ,\r\n                    &#39;Date Correlation On&#39; AS Finding ,\r\n                    &#39;http:\/\/BrentOzar.com\/go\/corr&#39; AS URL ,\r\n                    ( &#39;Database [&#39; + [name]\r\n                      + &#39;] has date correlation enabled.  This is not a default setting, and it has some performance overhead.  It tells SQL Server that date fields in two tables are related, and SQL Server maintains statistics showing that relation.&#39; ) AS Details\r\n            FROM    sys.databases\r\n            WHERE   is_date_correlation_on = 1;\r\n\r\n    IF @@VERSION NOT LIKE &#39;%Microsoft SQL Server 2000%&#39;\r\n        AND @@VERSION NOT LIKE &#39;%Microsoft SQL Server 2005%&#39; \r\n        BEGIN\r\n            SET @StringToExecute = &#39;INSERT INTO #BlitzResults (CheckID, Priority, FindingsGroup, Finding, URL, Details)\r\nSELECT 21 AS CheckID, 20 AS Priority, &#39;&#39;Encryption&#39;&#39; AS FindingsGroup, &#39;&#39;Database Encrypted&#39;&#39; AS Finding, \r\n    &#39;&#39;http:\/\/BrentOzar.com\/go\/tde&#39;&#39; AS URL,\r\n    (&#39;&#39;Database [&#39;&#39; + [name] + &#39;&#39;] has Transparent Data Encryption enabled.  Make absolutely sure you have backed up the certificate and private key, or else you will not be able to restore this database.&#39;&#39;) AS Details FROM sys.databases WHERE is_encrypted = 1&#39;\r\n            EXECUTE(@StringToExecute)\r\n        END;\r\n\r\n\/* Compare sp_configure defaults *\/\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;Ad Hoc Distributed Queries&#39;, 0 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;affinity I\/O mask&#39;, 0 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;affinity mask&#39;, 0 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;Agent XPs&#39;, 0 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;allow updates&#39;, 0 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;awe enabled&#39;, 0 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;blocked process threshold&#39;, 0 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;c2 audit mode&#39;, 0 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;clr enabled&#39;, 0 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;cost threshold for parallelism&#39;, 5 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;cross db ownership chaining&#39;, 0 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;cursor threshold&#39;, -1 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;Database Mail XPs&#39;, 0 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;default full-text language&#39;, 1033 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;default language&#39;, 0 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;default trace enabled&#39;, 1 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;disallow results from triggers&#39;, 0 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;fill factor (%)&#39;, 0 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;ft crawl bandwidth (max)&#39;, 100 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;ft crawl bandwidth (min)&#39;, 0 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;ft notify bandwidth (max)&#39;, 100 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;ft notify bandwidth (min)&#39;, 0 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;index create memory (KB)&#39;, 0 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;in-doubt xact resolution&#39;, 0 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;lightweight pooling&#39;, 0 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;locks&#39;, 0 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;max degree of parallelism&#39;, 0 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;max full-text crawl range&#39;, 4 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;max server memory (MB)&#39;, 2147483647 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;max text repl size (B)&#39;, 65536 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;max worker threads&#39;, 0 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;media retention&#39;, 0 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;min memory per query (KB)&#39;, 1024 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;min server memory (MB)&#39;, 0 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;nested triggers&#39;, 1 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;network packet size (B)&#39;, 4096 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;Ole Automation Procedures&#39;, 0 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;open objects&#39;, 0 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;optimize for ad hoc workloads&#39;, 0 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;PH timeout (s)&#39;, 60 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;precompute rank&#39;, 0 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;priority boost&#39;, 0 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;query governor cost limit&#39;, 0 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;query wait (s)&#39;, -1 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;recovery interval (min)&#39;, 0 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;remote access&#39;, 1 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;remote admin connections&#39;, 0 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;remote login timeout (s)&#39;, 20 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;remote proc trans&#39;, 0 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;remote query timeout (s)&#39;, 600 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;Replication XPs&#39;, 0 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;RPC parameter data validation&#39;, 0 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;scan for startup procs&#39;, 0 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;server trigger recursion&#39;, 1 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;set working set size&#39;, 0 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;show advanced options&#39;, 0 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;SMO and DMO XPs&#39;, 1 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;SQL Mail XPs&#39;, 0 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;transform noise words&#39;, 0 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;two digit year cutoff&#39;, 2049 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;user connections&#39;, 0 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;user options&#39;, 0 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;Web Assistant Procedures&#39;, 0 );\r\n    INSERT  INTO #ConfigurationDefaults\r\n    VALUES  ( &#39;xp_cmdshell&#39;, 0 );\r\n\r\n    INSERT  INTO #BlitzResults\r\n            ( CheckID ,\r\n              Priority ,\r\n              FindingsGroup ,\r\n              Finding ,\r\n              URL ,\r\n              Details\r\n            )\r\n            SELECT  22 AS CheckID ,\r\n                    200 AS Priority ,\r\n                    &#39;Non-Default Server Config&#39; AS FindingsGroup ,\r\n                    cd.name AS Finding ,\r\n                    &#39;http:\/\/BrentOzar.com\/go\/conf&#39; AS URL ,\r\n                    ( &#39;This sp_configure option has been changed.  Its default value is &#39;\r\n                      + CAST(cd.[DefaultValue] AS VARCHAR(100))\r\n                      + &#39; and it has been set to &#39;\r\n                      + CAST(cr.value_in_use AS VARCHAR(100)) + &#39;.&#39; ) AS Details\r\n            FROM    #ConfigurationDefaults cd\r\n                    INNER JOIN sys.configurations cr ON cd.name = cr.name\r\n            WHERE   cd.DefaultValue &lt;&gt; cr.value_in_use;\r\n\r\n    INSERT  INTO #BlitzResults\r\n            ( CheckID ,\r\n              Priority ,\r\n              FindingsGroup ,\r\n              Finding ,\r\n              URL ,\r\n              Details\r\n            )\r\n            SELECT DISTINCT\r\n                    24 AS CheckID ,\r\n                    20 AS Priority ,\r\n                    &#39;Reliability&#39; AS FindingsGroup ,\r\n                    &#39;System Database on C Drive&#39; AS Finding ,\r\n                    &#39;http:\/\/BrentOzar.com\/go\/drivec&#39; AS URL ,\r\n                    ( &#39;The &#39; + DB_NAME(database_id)\r\n                      + &#39; database has a file on the C drive.  Putting system databases on the C drive runs the risk of crashing the server when it runs out of space.&#39; ) AS Details\r\n            FROM    sys.master_files\r\n            WHERE   UPPER(LEFT(physical_name, 1)) = &#39;C&#39;\r\n                    AND DB_NAME(database_id) IN ( &#39;master&#39;, &#39;model&#39;, &#39;msdb&#39; );\r\n\r\n    INSERT  INTO #BlitzResults\r\n            ( CheckID ,\r\n              Priority ,\r\n              FindingsGroup ,\r\n              Finding ,\r\n              URL ,\r\n              Details\r\n            )\r\n            SELECT TOP 1\r\n                    25 AS CheckID ,\r\n                    100 AS Priority ,\r\n                    &#39;Performance&#39; AS FindingsGroup ,\r\n                    &#39;TempDB on C Drive&#39; AS Finding ,\r\n                    &#39;http:\/\/BrentOzar.com\/go\/drivec&#39; AS URL ,\r\n                    CASE WHEN growth &gt; 0\r\n                         THEN ( &#39;The tempdb database has files on the C drive.  TempDB frequently grows unpredictably, putting your server at risk of running out of C drive space and crashing hard.  C is also often much slower than other drives, so performance may be suffering.&#39; )\r\n                         ELSE ( &#39;The tempdb database has files on the C drive.  TempDB is not set to Autogrow, hopefully it is big enough.  C is also often much slower than other drives, so performance may be suffering.&#39; )\r\n                    END AS Details\r\n            FROM    sys.master_files\r\n            WHERE   UPPER(LEFT(physical_name, 1)) = &#39;C&#39;\r\n                    AND DB_NAME(database_id) = &#39;tempdb&#39;;\r\n\r\n    INSERT  INTO #BlitzResults\r\n            ( CheckID ,\r\n              Priority ,\r\n              FindingsGroup ,\r\n              Finding ,\r\n              URL ,\r\n              Details\r\n            )\r\n            SELECT DISTINCT\r\n                    26 AS CheckID ,\r\n                    20 AS Priority ,\r\n                    &#39;Reliability&#39; AS FindingsGroup ,\r\n                    &#39;User Databases on C Drive&#39; AS Finding ,\r\n                    &#39;http:\/\/BrentOzar.com\/go\/cdrive&#39; AS URL ,\r\n                    ( &#39;The &#39; + DB_NAME(database_id)\r\n                      + &#39; database has a file on the C drive.  Putting databases on the C drive runs the risk of crashing the server when it runs out of space.&#39; ) AS Details\r\n            FROM    sys.master_files\r\n            WHERE   UPPER(LEFT(physical_name, 1)) = &#39;C&#39;\r\n                    AND DB_NAME(database_id) NOT IN ( &#39;master&#39;, &#39;model&#39;,\r\n                                                      &#39;msdb&#39;, &#39;tempdb&#39; );\r\n\r\n\r\n    INSERT  INTO #BlitzResults\r\n            ( CheckID ,\r\n              Priority ,\r\n              FindingsGroup ,\r\n              Finding ,\r\n              URL ,\r\n              Details\r\n            )\r\n            SELECT  27 AS CheckID ,\r\n                    200 AS Priority ,\r\n                    &#39;Informational&#39; AS FindingsGroup ,\r\n                    &#39;Tables in the Master Database&#39; AS Finding ,\r\n                    &#39;http:\/\/BrentOzar.com\/go\/mastuser&#39; AS URL ,\r\n                    ( &#39;The &#39; + name\r\n                      + &#39; table in the master database was created by end users on &#39;\r\n                      + CAST(create_date AS VARCHAR(20))\r\n                      + &#39;. Tables in the master database may not be restored in the event of a disaster.&#39; ) AS Details\r\n            FROM    master.sys.tables\r\n            WHERE   is_ms_shipped = 0;\r\n\r\n    INSERT  INTO #BlitzResults\r\n            ( CheckID ,\r\n              Priority ,\r\n              FindingsGroup ,\r\n              Finding ,\r\n              URL ,\r\n              Details\r\n            )\r\n            SELECT  28 AS CheckID ,\r\n                    200 AS Priority ,\r\n                    &#39;Informational&#39; AS FindingsGroup ,\r\n                    &#39;Tables in the MSDB Database&#39; AS Finding ,\r\n                    &#39;http:\/\/BrentOzar.com\/go\/msdbuser&#39; AS URL ,\r\n                    ( &#39;The &#39; + name\r\n                      + &#39; table in the msdb database was created by end users on &#39;\r\n                      + CAST(create_date AS VARCHAR(20))\r\n                      + &#39;. Tables in the msdb database may not be restored in the event of a disaster.&#39; ) AS Details\r\n            FROM    msdb.sys.tables\r\n            WHERE   is_ms_shipped = 0;\r\n\r\n    INSERT  INTO #BlitzResults\r\n            ( CheckID ,\r\n              Priority ,\r\n              FindingsGroup ,\r\n              Finding ,\r\n              URL ,\r\n              Details\r\n            )\r\n            SELECT  29 AS CheckID ,\r\n                    200 AS Priority ,\r\n                    &#39;Informational&#39; AS FindingsGroup ,\r\n                    &#39;Tables in the Model Database&#39; AS Finding ,\r\n                    &#39;http:\/\/BrentOzar.com\/go\/model&#39; AS URL ,\r\n                    ( &#39;The &#39; + name\r\n                      + &#39; table in the model database was created by end users on &#39;\r\n                      + CAST(create_date AS VARCHAR(20))\r\n                      + &#39;. Tables in the model database are automatically copied into all new databases.&#39; ) AS Details\r\n            FROM    model.sys.tables\r\n            WHERE   is_ms_shipped = 0;\r\n\r\n\r\n    IF ( SELECT COUNT(*)\r\n         FROM   msdb.dbo.sysalerts\r\n         WHERE  severity BETWEEN 19 AND 25\r\n       ) &lt; 7 \r\n        INSERT  INTO #BlitzResults\r\n                ( CheckID ,\r\n                  Priority ,\r\n                  FindingsGroup ,\r\n                  Finding ,\r\n                  URL ,\r\n                  Details\r\n                )\r\n                SELECT  30 AS CheckID ,\r\n                        50 AS Priority ,\r\n                        &#39;Reliability&#39; AS FindingsGroup ,\r\n                        &#39;Not All Alerts Configured&#39; AS Finding ,\r\n                        &#39;http:\/\/BrentOzar.com\/go\/alert&#39; AS URL ,\r\n                        ( &#39;Not all SQL Server Agent alerts have been configured.  This is a free, easy way to get notified of corruption, job failures, or major outages even before monitoring systems pick it up.&#39; ) AS Details;\r\n    \r\n    IF EXISTS ( SELECT  *\r\n                FROM    msdb.dbo.sysalerts\r\n                WHERE   enabled = 1\r\n                        AND COALESCE(has_notification, 0) = 0\r\n                        AND job_id IS NULL ) \r\n        INSERT  INTO #BlitzResults\r\n                ( CheckID ,\r\n                  Priority ,\r\n                  FindingsGroup ,\r\n                  Finding ,\r\n                  URL ,\r\n                  Details\r\n                )\r\n                SELECT  59 AS CheckID ,\r\n                        50 AS Priority ,\r\n                        &#39;Reliability&#39; AS FindingsGroup ,\r\n                        &#39;Alerts Configured without Follow Up&#39; AS Finding ,\r\n                        &#39;http:\/\/BrentOzar.com\/go\/alert&#39; AS URL ,\r\n                        ( &#39;SQL Server Agent alerts have been configured but they either do not notify anyone or else they do not take any action.  This is a free, easy way to get notified of corruption, job failures, or major outages even before monitoring systems pick it up.&#39; ) AS Details;\r\n\r\n    IF NOT EXISTS ( SELECT  *\r\n                    FROM    msdb.dbo.sysalerts\r\n                    WHERE   message_id IN ( 823, 824, 825 ) ) \r\n        INSERT  INTO #BlitzResults\r\n                ( CheckID ,\r\n                  Priority ,\r\n                  FindingsGroup ,\r\n                  Finding ,\r\n                  URL ,\r\n                  Details\r\n                )\r\n                SELECT  60 AS CheckID ,\r\n                        50 AS Priority ,\r\n                        &#39;Reliability&#39; AS FindingsGroup ,\r\n                        &#39;No Alerts for Corruption&#39; AS Finding ,\r\n                        &#39;http:\/\/BrentOzar.com\/go\/alert&#39; AS URL ,\r\n                        ( &#39;SQL Server Agent alerts do not exist for errors 823, 824, and 825.  These three errors can give you notification about early hardware failure. Enabling them can prevent you a lot of heartbreak.&#39; ) AS Details;\r\n\r\n    IF NOT EXISTS ( SELECT  *\r\n                    FROM    msdb.dbo.sysalerts\r\n                    WHERE   severity BETWEEN 19 AND 25 ) \r\n        INSERT  INTO #BlitzResults\r\n                ( CheckID ,\r\n                  Priority ,\r\n                  FindingsGroup ,\r\n                  Finding ,\r\n                  URL ,\r\n                  Details\r\n                )\r\n                SELECT  61 AS CheckID ,\r\n                        50 AS Priority ,\r\n                        &#39;Reliability&#39; AS FindingsGroup ,\r\n                        &#39;No Alerts for Sev 19-25&#39; AS Finding ,\r\n                        &#39;http:\/\/BrentOzar.com\/go\/alert&#39; AS URL ,\r\n                        ( &#39;SQL Server Agent alerts do not exist for severity levels 19 through 25.  These are some very severe SQL Server errors. Knowing that these are happening may let you recover from errors faster.&#39; ) AS Details;\r\n\r\n            --check for disabled alerts\r\n    IF EXISTS ( SELECT  name\r\n                FROM    msdb.dbo.sysalerts\r\n                WHERE   enabled = 0 ) \r\n        INSERT  INTO #BlitzResults\r\n                ( CheckID ,\r\n                  Priority ,\r\n                  FindingsGroup ,\r\n                  Finding ,\r\n                  URL ,\r\n                  Details\r\n            \r\n                )\r\n                SELECT  62 AS CheckID ,\r\n                        50 AS Priority ,\r\n                        &#39;Reliability&#39; AS FindingsGroup ,\r\n                        &#39;Alerts Disabled&#39; AS Finding ,\r\n                        &#39;http:\/\/www.BrentOzar.com\/go\/alerts\/&#39; AS URL ,\r\n                        ( &#39;The following Alert is disabled, please review and enable if desired: &#39;\r\n                          + name ) AS Details\r\n                FROM    msdb.dbo.sysalerts\r\n                WHERE   enabled = 0\r\n\r\n\r\n    IF NOT EXISTS ( SELECT  *\r\n                    FROM    msdb.dbo.sysoperators\r\n                    WHERE   enabled = 1 ) \r\n        INSERT  INTO #BlitzResults\r\n                ( CheckID ,\r\n                  Priority ,\r\n                  FindingsGroup ,\r\n                  Finding ,\r\n                  URL ,\r\n                  Details\r\n                )\r\n                SELECT  31 AS CheckID ,\r\n                        50 AS Priority ,\r\n                        &#39;Reliability&#39; AS FindingsGroup ,\r\n                        &#39;No Operators Configured\/Enabled&#39; AS Finding ,\r\n                        &#39;http:\/\/BrentOzar.com\/go\/op&#39; AS URL ,\r\n                        ( &#39;No SQL Server Agent operators (emails) have been configured.  This is a free, easy way to get notified of corruption, job failures, or major outages even before monitoring systems pick it up.&#39; ) AS Details;\r\n\r\n    IF @@VERSION NOT LIKE &#39;%Microsoft SQL Server 2000%&#39;\r\n        AND @@VERSION NOT LIKE &#39;%Microsoft SQL Server 2005%&#39; \r\n        BEGIN\r\n            EXEC dbo.sp_MSforeachdb &#39;USE [?]; INSERT INTO #BlitzResults (CheckID, Priority, FindingsGroup, Finding, URL, Details) SELECT DISTINCT 33, 200, &#39;&#39;Licensing&#39;&#39;, &#39;&#39;Enterprise Edition Features In Use&#39;&#39;, &#39;&#39;http:\/\/BrentOzar.com\/go\/ee&#39;&#39;, (&#39;&#39;The [&#39;&#39; + DB_NAME() + &#39;&#39;] database is using &#39;&#39; + feature_name + &#39;&#39;.  If this database is restored onto a Standard Edition server, the restore will fail.&#39;&#39;) FROM [?].sys.dm_db_persisted_sku_features&#39;;\r\n        END;\r\n\r\n    IF @@VERSION NOT LIKE &#39;%Microsoft SQL Server 2000%&#39;\r\n        AND @@VERSION NOT LIKE &#39;%Microsoft SQL Server 2005%&#39; \r\n        BEGIN\r\n            SET @StringToExecute = &#39;INSERT INTO #BlitzResults (CheckID, Priority, FindingsGroup, Finding, URL, Details)\r\n            SELECT TOP 1\r\n                    34 AS CheckID ,\r\n                    1 AS Priority ,\r\n                    &#39;&#39;Corruption&#39;&#39; AS FindingsGroup ,\r\n                    &#39;&#39;Database Corruption Detected&#39;&#39; AS Finding ,\r\n                    &#39;&#39;http:\/\/BrentOzar.com\/go\/repair&#39;&#39; AS URL ,\r\n                    ( &#39;&#39;Database mirroring has automatically repaired at least one corrupt page in the last 30 days. For more information, query the DMV sys.dm_db_mirroring_auto_page_repair.&#39;&#39; ) AS Details\r\n            FROM    sys.dm_db_mirroring_auto_page_repair\r\n            WHERE   modification_time &gt;= DATEADD(dd, -30, GETDATE()) ;&#39;\r\n            EXECUTE(@StringToExecute)\r\n        END;\r\n\r\n    INSERT  INTO #BlitzResults\r\n            ( CheckID ,\r\n              Priority ,\r\n              FindingsGroup ,\r\n              Finding ,\r\n              URL ,\r\n              Details\r\n            )\r\n            SELECT DISTINCT\r\n                    36 AS CheckID ,\r\n                    100 AS Priority ,\r\n                    &#39;Performance&#39; AS FindingsGroup ,\r\n                    &#39;Slow Storage Reads on Drive &#39;\r\n                    + UPPER(LEFT(mf.physical_name, 1)) AS Finding ,\r\n                    &#39;http:\/\/BrentOzar.com\/go\/slow&#39; AS URL ,\r\n                    &#39;Reads are averaging longer than 100ms for at least one database on this drive.  For specific database file speeds, run the query from the information link.&#39; AS Details\r\n            FROM    sys.dm_io_virtual_file_stats(NULL, NULL) AS fs\r\n                    INNER JOIN sys.master_files AS mf ON fs.database_id = mf.database_id\r\n                                                         AND fs.[file_id] = mf.[file_id]\r\n            WHERE   ( io_stall_read_ms \/ ( 1.0 + num_of_reads ) ) &gt; 100;\r\n\r\n    INSERT  INTO #BlitzResults\r\n            ( CheckID ,\r\n              Priority ,\r\n              FindingsGroup ,\r\n              Finding ,\r\n              URL ,\r\n              Details\r\n            )\r\n            SELECT DISTINCT\r\n                    37 AS CheckID ,\r\n                    100 AS Priority ,\r\n                    &#39;Performance&#39; AS FindingsGroup ,\r\n                    &#39;Slow Storage Writes on Drive &#39;\r\n                    + UPPER(LEFT(mf.physical_name, 1)) AS Finding ,\r\n                    &#39;http:\/\/BrentOzar.com\/go\/slow&#39; AS URL ,\r\n                    &#39;Writes are averaging longer than 20ms for at least one database on this drive.  For specific database file speeds, run the query from the information link.&#39; AS Details\r\n            FROM    sys.dm_io_virtual_file_stats(NULL, NULL) AS fs\r\n                    INNER JOIN sys.master_files AS mf ON fs.database_id = mf.database_id\r\n                                                         AND fs.[file_id] = mf.[file_id]\r\n            WHERE   ( io_stall_write_ms \/ ( 1.0 + num_of_writes ) ) &gt; 20;\r\n\r\n\r\n    IF ( SELECT COUNT(*)\r\n         FROM   tempdb.sys.database_files\r\n         WHERE  type_desc = &#39;ROWS&#39;\r\n       ) = 1 \r\n        BEGIN\r\n            INSERT  INTO #BlitzResults\r\n                    ( CheckID ,\r\n                      Priority ,\r\n                      FindingsGroup ,\r\n                      Finding ,\r\n                      URL ,\r\n                      Details\r\n                    )\r\n            VALUES  ( 40 ,\r\n                      100 ,\r\n                      &#39;Performance&#39; ,\r\n                      &#39;TempDB Only Has 1 Data File&#39; ,\r\n                      &#39;http:\/\/BrentOzar.com\/go\/tempdb&#39; ,\r\n                      &#39;TempDB is only configured with one data file.  More data files are usually required to alleviate SGAM contention.&#39;\r\n                    );\r\n        END;\r\n\r\n    EXEC dbo.sp_MSforeachdb &#39;use [?]; INSERT INTO #BlitzResults (CheckID, Priority, FindingsGroup, Finding, URL, Details) SELECT 41, 100, &#39;&#39;Performance&#39;&#39;, &#39;&#39;Multiple Log Files on One Drive&#39;&#39;, &#39;&#39;http:\/\/BrentOzar.com\/go\/manylogs&#39;&#39;, (&#39;&#39;The [&#39;&#39; + DB_NAME() + &#39;&#39;] database has multiple log files on the &#39;&#39; + LEFT(physical_name, 1) + &#39;&#39; drive. This is not a performance booster because log file access is sequential, not parallel.&#39;&#39;) FROM [?].sys.database_files WHERE type_desc = &#39;&#39;LOG&#39;&#39; AND &#39;&#39;?&#39;&#39; &lt;&gt; &#39;&#39;[tempdb]&#39;&#39; GROUP BY LEFT(physical_name, 1) HAVING COUNT(*) &gt; 1&#39;;\r\n\r\n    EXEC dbo.sp_MSforeachdb &#39;use [?]; INSERT INTO #BlitzResults (CheckID, Priority, FindingsGroup, Finding, URL, Details) SELECT DISTINCT 42, 100, &#39;&#39;Performance&#39;&#39;, &#39;&#39;Uneven File Growth Settings in One Filegroup&#39;&#39;, &#39;&#39;http:\/\/BrentOzar.com\/go\/grow&#39;&#39;, (&#39;&#39;The [&#39;&#39; + DB_NAME() + &#39;&#39;] database has multiple data files in one filegroup, but they are not all set up to grow in identical amounts.  This can lead to uneven file activity inside the filegroup.&#39;&#39;) FROM [?].sys.database_files WHERE type_desc = &#39;&#39;ROWS&#39;&#39; GROUP BY data_space_id HAVING COUNT(DISTINCT growth) &gt; 1 OR COUNT(DISTINCT is_percent_growth) &gt; 1&#39;;\r\n\r\n    INSERT  INTO #BlitzResults\r\n            ( CheckID ,\r\n              Priority ,\r\n              FindingsGroup ,\r\n              Finding ,\r\n              URL ,\r\n              Details\r\n                    \r\n            )\r\n            SELECT  44 AS CheckID ,\r\n                    110 AS Priority ,\r\n                    &#39;Performance&#39; AS FindingsGroup ,\r\n                    &#39;Queries Forcing Order Hints&#39; AS Finding ,\r\n                    &#39;http:\/\/BrentOzar.com\/go\/hints&#39; AS URL ,\r\n                    CAST(occurrence AS VARCHAR(10))\r\n                    + &#39; instances of order hinting have been recorded since restart.  This means queries are bossing the SQL Server optimizer around, and if they don&#39;&#39;t know what they&#39;&#39;re doing, this can cause more harm than good.  This can also explain why DBA tuning efforts aren&#39;&#39;t working.&#39; AS Details\r\n            FROM    sys.dm_exec_query_optimizer_info\r\n            WHERE   counter = &#39;order hint&#39;\r\n                    AND occurrence &gt; 1\r\n\r\n    INSERT  INTO #BlitzResults\r\n            ( CheckID ,\r\n              Priority ,\r\n              FindingsGroup ,\r\n              Finding ,\r\n              URL ,\r\n              Details\r\n            )\r\n            SELECT  45 AS CheckID ,\r\n                    110 AS Priority ,\r\n                    &#39;Performance&#39; AS FindingsGroup ,\r\n                    &#39;Queries Forcing Join Hints&#39; AS Finding ,\r\n                    &#39;http:\/\/BrentOzar.com\/go\/hints&#39; AS URL ,\r\n                    CAST(occurrence AS VARCHAR(10))\r\n                    + &#39; instances of join hinting have been recorded since restart.  This means queries are bossing the SQL Server optimizer around, and if they don&#39;&#39;t know what they&#39;&#39;re doing, this can cause more harm than good.  This can also explain why DBA tuning efforts aren&#39;&#39;t working.&#39; AS Details\r\n            FROM    sys.dm_exec_query_optimizer_info\r\n            WHERE   counter = &#39;join hint&#39;\r\n                    AND occurrence &gt; 1\r\n\r\n\r\n\r\n    INSERT  INTO #BlitzResults\r\n            ( CheckID ,\r\n              Priority ,\r\n              FindingsGroup ,\r\n              Finding ,\r\n              URL ,\r\n              Details\r\n            )\r\n            SELECT DISTINCT\r\n                    49 AS CheckID ,\r\n                    200 AS Priority ,\r\n                    &#39;Informational&#39; AS FindingsGroup ,\r\n                    &#39;Linked Server Configured&#39; AS Finding ,\r\n                    &#39;http:\/\/BrentOzar.com\/go\/link&#39; AS URL ,\r\n                    +CASE WHEN l.remote_name = &#39;sa&#39;\r\n                          THEN s.data_source\r\n                               + &#39; is configured as a linked server. Check its security configuration as it is connecting with sa, because any user who queries it will get admin-level permissions.&#39;\r\n                          ELSE s.data_source\r\n                               + &#39; is configured as a linked server. Check its security configuration to make sure it isn&#39;&#39;t connecting with SA or some other bone-headed administrative login, because any user who queries it might get admin-level permissions.&#39;\r\n                     END AS Details\r\n            FROM    sys.servers s\r\n                    INNER JOIN sys.linked_logins l ON s.server_id = l.server_id\r\n            WHERE   s.is_linked = 1\r\n\r\n\r\n\r\n    IF @@VERSION NOT LIKE &#39;%Microsoft SQL Server 2000%&#39;\r\n        AND @@VERSION NOT LIKE &#39;%Microsoft SQL Server 2005%&#39; \r\n        BEGIN\r\n            SET @StringToExecute = &#39;INSERT INTO #BlitzResults (CheckID, Priority, FindingsGroup, Finding, URL, Details)\r\n            SELECT  50 AS CheckID ,\r\n                    100 AS Priority ,\r\n                    &#39;&#39;Performance&#39;&#39; AS FindingsGroup ,\r\n                    &#39;&#39;Max Memory Set Too High&#39;&#39; AS Finding ,\r\n                    &#39;&#39;http:\/\/BrentOzar.com\/go\/max&#39;&#39; AS URL ,\r\n                    &#39;&#39;SQL Server max memory is set to &#39;&#39;\r\n                    + CAST(c.value_in_use AS VARCHAR(20))\r\n                    + &#39;&#39; megabytes, but the server only has &#39;&#39;\r\n                    + CAST(( CAST(m.total_physical_memory_kb AS BIGINT) \/ 1024 ) AS VARCHAR(20))\r\n                    + &#39;&#39; megabytes.  SQL Server may drain the system dry of memory, and under certain conditions, this can cause Windows to swap to disk.&#39;&#39; AS Details\r\n            FROM    sys.dm_os_sys_memory m\r\n                    INNER JOIN sys.configurations c ON c.name = &#39;&#39;max server memory (MB)&#39;&#39;\r\n            WHERE   CAST(m.total_physical_memory_kb AS BIGINT) &lt; ( CAST(c.value_in_use AS BIGINT) * 1024 )&#39;\r\n            EXECUTE(@StringToExecute)\r\n        END;\r\n\r\n\r\n    IF @@VERSION NOT LIKE &#39;%Microsoft SQL Server 2000%&#39;\r\n        AND @@VERSION NOT LIKE &#39;%Microsoft SQL Server 2005%&#39; \r\n        BEGIN\r\n            SET @StringToExecute = &#39;INSERT INTO #BlitzResults (CheckID, Priority, FindingsGroup, Finding, URL, Details)\r\n            SELECT  51 AS CheckID ,\r\n                    1 AS Priority ,\r\n                    &#39;&#39;Performance&#39;&#39; AS FindingsGroup ,\r\n                    &#39;&#39;Memory Dangerously Low&#39;&#39; AS Finding ,\r\n                    &#39;&#39;http:\/\/BrentOzar.com\/go\/max&#39;&#39; AS URL ,\r\n                    &#39;&#39;Although available memory is &#39;&#39;\r\n                    + CAST(( CAST(m.available_physical_memory_kb AS BIGINT)\r\n                             \/ 1024 ) AS VARCHAR(20))\r\n                    + &#39;&#39; megabytes, only &#39;&#39;\r\n                    + CAST(( CAST(m.total_physical_memory_kb AS BIGINT) \/ 1024 ) AS VARCHAR(20))\r\n                    + &#39;&#39;megabytes of memory are present.  As the server runs out of memory, there is danger of swapping to disk, which will kill performance.&#39;&#39; AS Details\r\n            FROM    sys.dm_os_sys_memory m\r\n            WHERE   CAST(m.available_physical_memory_kb AS BIGINT) &lt; 262144&#39;\r\n            EXECUTE(@StringToExecute)\r\n        END;\r\n\r\n\r\n    INSERT  INTO #BlitzResults\r\n            ( CheckID ,\r\n              Priority ,\r\n              FindingsGroup ,\r\n              Finding ,\r\n              URL ,\r\n              Details\r\n            )\r\n            SELECT TOP 1\r\n                    53 AS CheckID ,\r\n                    200 AS Priority ,\r\n                    &#39;High Availability&#39; AS FindingsGroup ,\r\n                    &#39;Cluster Node&#39; AS Finding ,\r\n                    &#39;http:\/\/BrentOzar.com\/go\/node&#39; AS URL ,\r\n                    &#39;This is a node in a cluster.&#39; AS Details\r\n            FROM    sys.dm_os_cluster_nodes\r\n\r\n    INSERT  INTO #BlitzResults\r\n            ( CheckID ,\r\n              Priority ,\r\n              FindingsGroup ,\r\n              Finding ,\r\n              URL ,\r\n              Details\r\n            )\r\n            SELECT  55 AS CheckID ,\r\n                    200 AS Priority ,\r\n                    &#39;Security&#39; AS FindingsGroup ,\r\n                    &#39;Database Owner &lt;&gt; SA&#39; AS Finding ,\r\n                    &#39;http:\/\/BrentOzar.com\/go\/owndb&#39; AS URL ,\r\n                    ( &#39;Database name: &#39; + name + &#39;   &#39; + &#39;Owner name: &#39;\r\n                      + SUSER_SNAME(owner_sid) ) AS Details\r\n            FROM    sys.databases\r\n            WHERE   SUSER_SNAME(owner_sid) &lt;&gt; SUSER_SNAME(0x01);\r\n\r\n    INSERT  INTO #BlitzResults\r\n            ( CheckID ,\r\n              Priority ,\r\n              FindingsGroup ,\r\n              Finding ,\r\n              URL ,\r\n              Details\r\n            )\r\n            SELECT  57 AS CheckID ,\r\n                    10 AS Priority ,\r\n                    &#39;Security&#39; AS FindingsGroup ,\r\n                    &#39;SQL Agent Job Runs at Startup&#39; AS Finding ,\r\n                    &#39;http:\/\/BrentOzar.com\/go\/startup&#39; AS URL ,\r\n                    ( &#39;Job &#39; + j.name\r\n                      + &#39;] runs automatically when SQL Server Agent starts up.  Make sure you know exactly what this job is doing, because it could pose a security risk.&#39; ) AS Details\r\n            FROM    msdb.dbo.sysschedules sched\r\n                    JOIN msdb.dbo.sysjobschedules jsched ON sched.schedule_id = jsched.schedule_id\r\n                    JOIN msdb.dbo.sysjobs j ON jsched.job_id = j.job_id\r\n            WHERE   sched.freq_type = 64;\r\n\r\n\r\n    INSERT  INTO #BlitzResults\r\n            ( CheckID ,\r\n              Priority ,\r\n              FindingsGroup ,\r\n              Finding ,\r\n              URL ,\r\n              Details\r\n            )\r\n            SELECT  58 AS CheckID ,\r\n                    200 AS Priority ,\r\n                    &#39;Reliability&#39; AS FindingsGroup ,\r\n                    &#39;Database Collation Mismatch&#39; AS Finding ,\r\n                    &#39;http:\/\/BrentOzar.com\/go\/collate&#39; AS URL ,\r\n                    ( &#39;Database &#39; + d.NAME + &#39; has collation &#39;\r\n                      + d.collation_name + &#39;; Server collation is &#39;\r\n                      + CONVERT(VARCHAR(100), SERVERPROPERTY(&#39;collation&#39;)) ) AS Details\r\n            FROM    master.sys.databases d\r\n            WHERE   d.collation_name &lt;&gt; SERVERPROPERTY(&#39;collation&#39;)\r\n\r\n    EXEC sp_MSforeachdb &#39;use [?]; INSERT INTO #BlitzResults (CheckID, Priority, FindingsGroup, Finding, URL, Details)\r\nSELECT  DISTINCT 82 AS CheckID, \r\n        100 AS Priority, \r\n        &#39;&#39;Performance&#39;&#39; AS FindingsGroup, \r\n        &#39;&#39;File growth set to percent&#39;&#39;, \r\n        &#39;&#39;http:\/\/brentozar.com\/go\/percentgrowth&#39;&#39; AS URL,\r\n        &#39;&#39;The [&#39;&#39; + DB_NAME() + &#39;&#39;] database is using percent filegrowth settings. This can lead to out of control filegrowth.&#39;&#39;\r\nFROM    [?].sys.database_files \r\nWHERE   is_percent_growth = 1 &#39;;\r\n\r\n\r\n    INSERT  INTO #BlitzResults\r\n            ( CheckID ,\r\n              Priority ,\r\n              FindingsGroup ,\r\n              Finding ,\r\n              URL ,\r\n              Details\r\n            )\r\n            SELECT  61 AS CheckID ,\r\n                    100 AS Priority ,\r\n                    &#39;Performance&#39; AS FindingsGroup ,\r\n                    &#39;Unusual SQL Server Edition&#39; AS Finding ,\r\n                    &#39;http:\/\/BrentOzar.com\/go\/workgroup&#39; AS URL ,\r\n                    ( &#39;This server is using &#39;\r\n                      + CAST(SERVERPROPERTY(&#39;edition&#39;) AS VARCHAR(100))\r\n                      + &#39;, which is capped at low amounts of CPU and memory.&#39; ) AS Details\r\n            WHERE   CAST(SERVERPROPERTY(&#39;edition&#39;) AS VARCHAR(100)) NOT LIKE &#39;%Standard%&#39;\r\n                    AND CAST(SERVERPROPERTY(&#39;edition&#39;) AS VARCHAR(100)) NOT LIKE &#39;%Enterprise%&#39;\r\n                    AND CAST(SERVERPROPERTY(&#39;edition&#39;) AS VARCHAR(100)) NOT LIKE &#39;%Developer%&#39;\r\n\r\n    INSERT  INTO #BlitzResults\r\n            ( CheckID ,\r\n              Priority ,\r\n              FindingsGroup ,\r\n              Finding ,\r\n              URL ,\r\n              Details\r\n\t          \r\n            )\r\n            SELECT  62 AS CheckID ,\r\n                    200 AS Priority ,\r\n                    &#39;Performance&#39; AS FindingsGroup ,\r\n                    &#39;Old Compatibility Level&#39; AS Finding ,\r\n                    &#39;http:\/\/BrentOzar.com\/go\/compatlevel&#39; AS URL ,\r\n                    ( &#39;Database &#39; + name + &#39; is compatibility level &#39;\r\n                      + CAST(compatibility_level AS VARCHAR(20))\r\n                      + &#39;, which may cause unwanted results when trying to run queries that have newer T-SQL features.&#39; ) AS Details\r\n            FROM    sys.databases\r\n            WHERE   compatibility_level &lt;&gt; ( SELECT compatibility_level\r\n                                             FROM   sys.databases\r\n                                             WHERE  name = &#39;model&#39;\r\n                                           )\r\n\t  \r\n\t  \r\n\t  \r\n\r\n    IF @CheckUserDatabaseObjects = 1 \r\n        BEGIN\r\n\r\n            EXEC dbo.sp_MSforeachdb &#39;USE [?]; INSERT INTO #BlitzResults (CheckID, Priority, FindingsGroup, Finding, URL, Details) SELECT DISTINCT 32, 110, &#39;&#39;Performance&#39;&#39;, &#39;&#39;Triggers on Tables&#39;&#39;, &#39;&#39;http:\/\/BrentOzar.com\/go\/trig&#39;&#39;, (&#39;&#39;The [&#39;&#39; + DB_NAME() + &#39;&#39;] database has triggers on the &#39;&#39; + s.name + &#39;&#39;.&#39;&#39; + o.name + &#39;&#39; table.&#39;&#39;) FROM [?].sys.triggers t INNER JOIN [?].sys.objects o ON t.parent_id = o.object_id INNER JOIN [?].sys.schemas s ON o.schema_id = s.schema_id WHERE t.is_ms_shipped = 0&#39;;\r\n\r\n            EXEC dbo.sp_MSforeachdb &#39;USE [?]; INSERT INTO #BlitzResults (CheckID, Priority, FindingsGroup, Finding, URL, Details) SELECT DISTINCT 38, 110, &#39;&#39;Performance&#39;&#39;, &#39;&#39;Active Tables Without Clustered Indexes&#39;&#39;, &#39;&#39;http:\/\/BrentOzar.com\/go\/heaps&#39;&#39;, (&#39;&#39;The [&#39;&#39; + DB_NAME() + &#39;&#39;] database has heaps - tables without a clustered index - that are being actively queried.&#39;&#39;) FROM [?].sys.indexes i INNER JOIN [?].sys.objects o ON i.object_id = o.object_id INNER JOIN [?].sys.partitions p ON i.object_id = p.object_id AND i.index_id = p.index_id INNER JOIN sys.databases sd ON sd.name = &#39;&#39;?&#39;&#39; LEFT OUTER JOIN [?].sys.dm_db_index_usage_stats ius ON i.object_id = ius.object_id AND i.index_id = ius.index_id AND ius.database_id = sd.database_id WHERE i.type_desc = &#39;&#39;HEAP&#39;&#39; AND COALESCE(ius.user_seeks, ius.user_scans, ius.user_lookups, ius.user_updates) IS NOT NULL AND sd.name &lt;&gt; &#39;&#39;tempdb&#39;&#39; AND o.is_ms_shipped = 0 AND o.type &lt;&gt; &#39;&#39;S&#39;&#39;&#39;;\r\n\r\n            EXEC dbo.sp_MSforeachdb &#39;USE [?]; INSERT INTO #BlitzResults (CheckID, Priority, FindingsGroup, Finding, URL, Details) SELECT DISTINCT 39, 110, &#39;&#39;Performance&#39;&#39;, &#39;&#39;Inactive Tables Without Clustered Indexes&#39;&#39;, &#39;&#39;http:\/\/BrentOzar.com\/go\/heaps&#39;&#39;, (&#39;&#39;The [&#39;&#39; + DB_NAME() + &#39;&#39;] database has heaps - tables without a clustered index - that have not been queried since the last restart.  These may be backup tables carelessly left behind.&#39;&#39;) FROM [?].sys.indexes i INNER JOIN [?].sys.objects o ON i.object_id = o.object_id INNER JOIN [?].sys.partitions p ON i.object_id = p.object_id AND i.index_id = p.index_id INNER JOIN sys.databases sd ON sd.name = &#39;&#39;?&#39;&#39; LEFT OUTER JOIN [?].sys.dm_db_index_usage_stats ius ON i.object_id = ius.object_id AND i.index_id = ius.index_id AND ius.database_id = sd.database_id WHERE i.type_desc = &#39;&#39;HEAP&#39;&#39; AND COALESCE(ius.user_seeks, ius.user_scans, ius.user_lookups, ius.user_updates) IS NULL AND sd.name &lt;&gt; &#39;&#39;tempdb&#39;&#39; AND o.is_ms_shipped = 0 AND o.type &lt;&gt; &#39;&#39;S&#39;&#39;&#39;;\r\n\r\n            EXEC dbo.sp_MSforeachdb &#39;USE [?]; INSERT INTO #BlitzResults (CheckID, Priority, FindingsGroup, Finding, URL, Details) SELECT 46, 100, &#39;&#39;Performance&#39;&#39;, &#39;&#39;Leftover Fake Indexes From Wizards&#39;&#39;, &#39;&#39;http:\/\/BrentOzar.com\/go\/hypo&#39;&#39;, (&#39;&#39;The index [&#39;&#39; + DB_NAME() + &#39;&#39;].[&#39;&#39; + s.name + &#39;&#39;].[&#39;&#39; + o.name + &#39;&#39;].[&#39;&#39; + i.name + &#39;&#39;] is a leftover hypothetical index from the Index Tuning Wizard or Database Tuning Advisor.  This index is not actually helping performance and should be removed.&#39;&#39;) from [?].sys.indexes i INNER JOIN [?].sys.objects o ON i.object_id = o.object_id INNER JOIN [?].sys.schemas s ON o.schema_id = s.schema_id WHERE i.is_hypothetical = 1&#39;;\r\n\r\n            EXEC dbo.sp_MSforeachdb &#39;USE [?]; INSERT INTO #BlitzResults (CheckID, Priority, FindingsGroup, Finding, URL, Details) SELECT 47, 100, &#39;&#39;Performance&#39;&#39;, &#39;&#39;Indexes Disabled&#39;&#39;, &#39;&#39;http:\/\/BrentOzar.com\/go\/ixoff&#39;&#39;, (&#39;&#39;The index [&#39;&#39; + DB_NAME() + &#39;&#39;].[&#39;&#39; + s.name + &#39;&#39;].[&#39;&#39; + o.name + &#39;&#39;].[&#39;&#39; + i.name + &#39;&#39;] is disabled.  This index is not actually helping performance and should either be enabled or removed.&#39;&#39;) from [?].sys.indexes i INNER JOIN [?].sys.objects o ON i.object_id = o.object_id INNER JOIN [?].sys.schemas s ON o.schema_id = s.schema_id WHERE i.is_disabled = 1&#39;;\r\n\r\n            EXEC dbo.sp_MSforeachdb &#39;USE [?]; INSERT INTO #BlitzResults (CheckID, Priority, FindingsGroup, Finding, URL, Details) SELECT DISTINCT 48, 100, &#39;&#39;Performance&#39;&#39;, &#39;&#39;Foreign Keys Not Trusted&#39;&#39;, &#39;&#39;http:\/\/BrentOzar.com\/go\/trust&#39;&#39;, (&#39;&#39;The [&#39;&#39; + DB_NAME() + &#39;&#39;] database has foreign keys that were probably disabled, data was changed, and then the key was enabled again.  Simply enabling the key is not enough for the optimizer to use this key - we have to alter the table using the WITH CHECK CHECK CONSTRAINT parameter.&#39;&#39;) from [?].sys.foreign_keys i INNER JOIN [?].sys.objects o ON i.parent_object_id = o.object_id INNER JOIN [?].sys.schemas s ON o.schema_id = s.schema_id WHERE i.is_not_trusted = 1 AND i.is_not_for_replication = 0 AND i.is_disabled = 0&#39;;\r\n\r\n            EXEC dbo.sp_MSforeachdb &#39;USE [?]; INSERT INTO #BlitzResults (CheckID, Priority, FindingsGroup, Finding, URL, Details) SELECT 56, 100, &#39;&#39;Performance&#39;&#39;, &#39;&#39;Check Constraint Not Trusted&#39;&#39;, &#39;&#39;http:\/\/BrentOzar.com\/go\/trust&#39;&#39;, (&#39;&#39;The check constraint [&#39;&#39; + DB_NAME() + &#39;&#39;].[&#39;&#39; + s.name + &#39;&#39;].[&#39;&#39; + o.name + &#39;&#39;].[&#39;&#39; + i.name + &#39;&#39;] is not trusted - meaning, it was disabled, data was changed, and then the constraint was enabled again.  Simply enabling the constraint is not enough for the optimizer to use this constraint - we have to alter the table using the WITH CHECK CHECK CONSTRAINT parameter.&#39;&#39;) from [?].sys.check_constraints i INNER JOIN [?].sys.objects o ON i.parent_object_id = o.object_id INNER JOIN [?].sys.schemas s ON o.schema_id = s.schema_id WHERE i.is_not_trusted = 1 AND i.is_not_for_replication = 0 AND i.is_disabled = 0&#39;;\r\n\r\n            IF @@VERSION NOT LIKE &#39;%Microsoft SQL Server 2000%&#39;\r\n                AND @@VERSION NOT LIKE &#39;%Microsoft SQL Server 2005%&#39; \r\n                BEGIN\r\n                    EXEC dbo.sp_MSforeachdb &#39;USE [?]; INSERT INTO #BlitzResults (CheckID, Priority, FindingsGroup, Finding, URL, Details) SELECT TOP 1 13 AS CheckID, 110 AS Priority, &#39;&#39;Performance&#39;&#39; AS FindingsGroup, &#39;&#39;Plan Guides Enabled&#39;&#39; AS Finding, &#39;&#39;http:\/\/BrentOzar.com\/go\/guides&#39;&#39; AS URL, (&#39;&#39;Database [&#39;&#39; + DB_NAME() + &#39;&#39;] has query plan guides so a query will always get a specific execution plan. If you are having trouble getting query performance to improve, it might be due to a frozen plan. Review the DMV sys.plan_guides to learn more about the plan guides in place on this server.&#39;&#39;) AS Details FROM [?].sys.plan_guides WHERE is_disabled = 0&#39;\r\n                END;\r\n\r\n            EXEC sp_MSforeachdb &#39;USE [?]; INSERT INTO #BlitzResults (CheckID, Priority, FindingsGroup, Finding, URL, Details)\r\n\t\tSELECT  DISTINCT 60 AS CheckID, \r\n\t\t        100 AS Priority, \r\n\t\t        &#39;&#39;Performance&#39;&#39; AS FindingsGroup, \r\n\t\t        &#39;&#39;Fill Factor Changed&#39;&#39;, \r\n\t\t        &#39;&#39;http:\/\/brentozar.com\/go\/fillfactor&#39;&#39; AS URL,\r\n\t\t        &#39;&#39;The [&#39;&#39; + DB_NAME() + &#39;&#39;] database has objects with fill factor &lt;&gt; 0. This can cause memory and storage performance problems, but may also prevent page splits.&#39;&#39;\r\n\t\tFROM    [?].sys.indexes \r\n\t\tWHERE   fill_factor &lt;&gt; 0 AND fill_factor &lt;&gt; 100 AND is_disabled = 0 AND is_hypothetical = 0&#39;;\r\n\r\n            EXEC dbo.sp_MSforeachdb &#39;USE [?]; INSERT INTO #BlitzResults (CheckID, Priority, FindingsGroup, Finding, URL, Details) SELECT 78, 100, &#39;&#39;Performance&#39;&#39;, &#39;&#39;Stored Procedure WITH RECOMPILE&#39;&#39;, &#39;&#39;http:\/\/BrentOzar.com\/go\/recompile&#39;&#39;, (&#39;&#39;[&#39;&#39; + DB_NAME() + &#39;&#39;].[&#39;&#39; + SPECIFIC_SCHEMA + &#39;&#39;].[&#39;&#39; + SPECIFIC_NAME + &#39;&#39;] has WITH RECOMPILE in the stored procedure code, which may cause increased CPU usage due to constant recompiles of the code.&#39;&#39;) from [?].INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_DEFINITION LIKE N&#39;&#39;%WITH RECOMPILE%&#39;&#39;&#39;;\r\n\r\n            EXEC dbo.sp_MSforeachdb &#39;USE [?]; INSERT INTO #BlitzResults (CheckID, Priority, FindingsGroup, Finding, URL, Details) SELECT DISTINCT 86, 20, &#39;&#39;Security&#39;&#39;, &#39;&#39;Elevated Permissions on a Database&#39;&#39;, &#39;&#39;http:\/\/BrentOzar.com\/go\/elevated&#39;&#39;, (&#39;&#39;In [&#39;&#39; + DB_NAME() + &#39;&#39;], user [&#39;&#39; + u.name + &#39;&#39;]  has the role [&#39;&#39; + g.name + &#39;&#39;].  This user can perform tasks beyond just reading and writing data.&#39;&#39;) FROM [?].dbo.sysmembers m inner join [?].dbo.sysusers u on m.memberuid = u.uid inner join sysusers g on m.groupuid = g.uid where u.name &lt;&gt; &#39;&#39;dbo&#39;&#39; and g.name in (&#39;&#39;db_owner&#39;&#39; , &#39;&#39;db_accessAdmin&#39;&#39; , &#39;&#39;db_securityadmin&#39;&#39; , &#39;&#39;db_ddladmin&#39;&#39;)&#39;;\r\n\r\n\r\n\r\n        END \/* IF @CheckUserDatabaseObjects = 1 *\/\r\n\r\n\r\n    IF @CheckProcedureCache = 1 \r\n        BEGIN\r\n\t\t\t\r\n            INSERT  INTO #BlitzResults\r\n                    ( CheckID ,\r\n                      Priority ,\r\n                      FindingsGroup ,\r\n                      Finding ,\r\n                      URL ,\r\n                      Details\r\n\t                    \r\n                    )\r\n                    SELECT  35 AS CheckID ,\r\n                            100 AS Priority ,\r\n                            &#39;Performance&#39; AS FindingsGroup ,\r\n                            &#39;Single-Use Plans in Procedure Cache&#39; AS Finding ,\r\n                            &#39;http:\/\/BrentOzar.com\/go\/single&#39; AS URL ,\r\n                            ( CAST(COUNT(*) AS VARCHAR(10))\r\n                              + &#39; query plans are taking up memory in the procedure cache. This may be wasted memory if we cache plans for queries that never get called again. This may be a good use case for SQL Server 2008&#39;&#39;s Optimize for Ad Hoc or for Forced Parameterization.&#39; ) AS Details\r\n                    FROM    sys.dm_exec_cached_plans AS cp\r\n                    WHERE   cp.usecounts = 1\r\n                            AND cp.objtype = &#39;Adhoc&#39;\r\n                            AND EXISTS ( SELECT 1\r\n                                         FROM   sys.configurations\r\n                                         WHERE  name = &#39;optimize for ad hoc workloads&#39;\r\n                                                AND value_in_use = 0 )\r\n                    HAVING  COUNT(*) &gt; 1;\r\n\r\n\r\n\t\t\t\t\/* Set up the cache tables. Different on 2005 since it doesn&#39;t support query_hash, query_plan_hash. *\/\r\n            IF @@VERSION LIKE &#39;%Microsoft SQL Server 2005%&#39; \r\n                BEGIN\r\n                    IF @CheckProcedureCacheFilter = &#39;CPU&#39;\r\n                        OR @CheckProcedureCacheFilter IS NULL \r\n                        BEGIN\r\n                            SET @StringToExecute = &#39;WITH queries ([sql_handle],[statement_start_offset],[statement_end_offset],[plan_generation_num],[plan_handle],[creation_time],[last_execution_time],[execution_count],[total_worker_time],[last_worker_time],[min_worker_time],[max_worker_time],[total_physical_reads],[last_physical_reads],[min_physical_reads],[max_physical_reads],[total_logical_writes],[last_logical_writes],[min_logical_writes],[max_logical_writes],[total_logical_reads],[last_logical_reads],[min_logical_reads],[max_logical_reads],[total_clr_time],[last_clr_time],[min_clr_time],[max_clr_time],[total_elapsed_time],[last_elapsed_time],[min_elapsed_time],[max_elapsed_time])\r\n\t\t\t            AS (SELECT TOP 20 qs.[sql_handle],qs.[statement_start_offset],qs.[statement_end_offset],qs.[plan_generation_num],qs.[plan_handle],qs.[creation_time],qs.[last_execution_time],qs.[execution_count],qs.[total_worker_time],qs.[last_worker_time],qs.[min_worker_time],qs.[max_worker_time],qs.[total_physical_reads],qs.[last_physical_reads],qs.[min_physical_reads],qs.[max_physical_reads],qs.[total_logical_writes],qs.[last_logical_writes],qs.[min_logical_writes],qs.[max_logical_writes],qs.[total_logical_reads],qs.[last_logical_reads],qs.[min_logical_reads],qs.[max_logical_reads],qs.[total_clr_time],qs.[last_clr_time],qs.[min_clr_time],qs.[max_clr_time],qs.[total_elapsed_time],qs.[last_elapsed_time],qs.[min_elapsed_time],qs.[max_elapsed_time]\r\n\t\t\t\t\t\tFROM sys.dm_exec_query_stats qs\r\n\t\t\t\t\t\tORDER BY qs.total_worker_time DESC)\r\n\t\t\t\t\t\tINSERT INTO #dm_exec_query_stats ([sql_handle],[statement_start_offset],[statement_end_offset],[plan_generation_num],[plan_handle],[creation_time],[last_execution_time],[execution_count],[total_worker_time],[last_worker_time],[min_worker_time],[max_worker_time],[total_physical_reads],[last_physical_reads],[min_physical_reads],[max_physical_reads],[total_logical_writes],[last_logical_writes],[min_logical_writes],[max_logical_writes],[total_logical_reads],[last_logical_reads],[min_logical_reads],[max_logical_reads],[total_clr_time],[last_clr_time],[min_clr_time],[max_clr_time],[total_elapsed_time],[last_elapsed_time],[min_elapsed_time],[max_elapsed_time])\r\n\t\t\t\t\t\tSELECT qs.[sql_handle],qs.[statement_start_offset],qs.[statement_end_offset],qs.[plan_generation_num],qs.[plan_handle],qs.[creation_time],qs.[last_execution_time],qs.[execution_count],qs.[total_worker_time],qs.[last_worker_time],qs.[min_worker_time],qs.[max_worker_time],qs.[total_physical_reads],qs.[last_physical_reads],qs.[min_physical_reads],qs.[max_physical_reads],qs.[total_logical_writes],qs.[last_logical_writes],qs.[min_logical_writes],qs.[max_logical_writes],qs.[total_logical_reads],qs.[last_logical_reads],qs.[min_logical_reads],qs.[max_logical_reads],qs.[total_clr_time],qs.[last_clr_time],qs.[min_clr_time],qs.[max_clr_time],qs.[total_elapsed_time],qs.[last_elapsed_time],qs.[min_elapsed_time],qs.[max_elapsed_time]\r\n\t\t\t\t\t\tFROM queries qs\r\n\t\t\t\t\t\tLEFT OUTER JOIN #dm_exec_query_stats qsCaught ON qs.sql_handle = qsCaught.sql_handle AND qs.plan_handle = qsCaught.plan_handle AND qs.statement_start_offset = qsCaught.statement_start_offset\r\n\t\t\t\t\t\tWHERE qsCaught.sql_handle IS NULL;&#39;\r\n                            EXECUTE(@StringToExecute)\r\n                        END\r\n\r\n                    IF @CheckProcedureCacheFilter = &#39;Reads&#39;\r\n                        OR @CheckProcedureCacheFilter IS NULL \r\n                        BEGIN\r\n                            SET @StringToExecute = &#39;WITH queries ([sql_handle],[statement_start_offset],[statement_end_offset],[plan_generation_num],[plan_handle],[creation_time],[last_execution_time],[execution_count],[total_worker_time],[last_worker_time],[min_worker_time],[max_worker_time],[total_physical_reads],[last_physical_reads],[min_physical_reads],[max_physical_reads],[total_logical_writes],[last_logical_writes],[min_logical_writes],[max_logical_writes],[total_logical_reads],[last_logical_reads],[min_logical_reads],[max_logical_reads],[total_clr_time],[last_clr_time],[min_clr_time],[max_clr_time],[total_elapsed_time],[last_elapsed_time],[min_elapsed_time],[max_elapsed_time])\r\n\t\t\t            AS (SELECT TOP 20 qs.[sql_handle],qs.[statement_start_offset],qs.[statement_end_offset],qs.[plan_generation_num],qs.[plan_handle],qs.[creation_time],qs.[last_execution_time],qs.[execution_count],qs.[total_worker_time],qs.[last_worker_time],qs.[min_worker_time],qs.[max_worker_time],qs.[total_physical_reads],qs.[last_physical_reads],qs.[min_physical_reads],qs.[max_physical_reads],qs.[total_logical_writes],qs.[last_logical_writes],qs.[min_logical_writes],qs.[max_logical_writes],qs.[total_logical_reads],qs.[last_logical_reads],qs.[min_logical_reads],qs.[max_logical_reads],qs.[total_clr_time],qs.[last_clr_time],qs.[min_clr_time],qs.[max_clr_time],qs.[total_elapsed_time],qs.[last_elapsed_time],qs.[min_elapsed_time],qs.[max_elapsed_time]\r\n\t\t\t\t\t\tFROM sys.dm_exec_query_stats qs\r\n\t\t\t\t\t\tORDER BY qs.total_logical_reads DESC)\r\n\t\t\t\t\t\tINSERT INTO #dm_exec_query_stats ([sql_handle],[statement_start_offset],[statement_end_offset],[plan_generation_num],[plan_handle],[creation_time],[last_execution_time],[execution_count],[total_worker_time],[last_worker_time],[min_worker_time],[max_worker_time],[total_physical_reads],[last_physical_reads],[min_physical_reads],[max_physical_reads],[total_logical_writes],[last_logical_writes],[min_logical_writes],[max_logical_writes],[total_logical_reads],[last_logical_reads],[min_logical_reads],[max_logical_reads],[total_clr_time],[last_clr_time],[min_clr_time],[max_clr_time],[total_elapsed_time],[last_elapsed_time],[min_elapsed_time],[max_elapsed_time])\r\n\t\t\t\t\t\tSELECT qs.[sql_handle],qs.[statement_start_offset],qs.[statement_end_offset],qs.[plan_generation_num],qs.[plan_handle],qs.[creation_time],qs.[last_execution_time],qs.[execution_count],qs.[total_worker_time],qs.[last_worker_time],qs.[min_worker_time],qs.[max_worker_time],qs.[total_physical_reads],qs.[last_physical_reads],qs.[min_physical_reads],qs.[max_physical_reads],qs.[total_logical_writes],qs.[last_logical_writes],qs.[min_logical_writes],qs.[max_logical_writes],qs.[total_logical_reads],qs.[last_logical_reads],qs.[min_logical_reads],qs.[max_logical_reads],qs.[total_clr_time],qs.[last_clr_time],qs.[min_clr_time],qs.[max_clr_time],qs.[total_elapsed_time],qs.[last_elapsed_time],qs.[min_elapsed_time],qs.[max_elapsed_time]\r\n\t\t\t\t\t\tFROM queries qs\r\n\t\t\t\t\t\tLEFT OUTER JOIN #dm_exec_query_stats qsCaught ON qs.sql_handle = qsCaught.sql_handle AND qs.plan_handle = qsCaught.plan_handle AND qs.statement_start_offset = qsCaught.statement_start_offset\r\n\t\t\t\t\t\tWHERE qsCaught.sql_handle IS NULL;&#39;\r\n                        END\r\n\r\n                    IF @CheckProcedureCacheFilter = &#39;ExecCount&#39;\r\n                        OR @CheckProcedureCacheFilter IS NULL \r\n                        BEGIN\r\n                            SET @StringToExecute = &#39;WITH queries ([sql_handle],[statement_start_offset],[statement_end_offset],[plan_generation_num],[plan_handle],[creation_time],[last_execution_time],[execution_count],[total_worker_time],[last_worker_time],[min_worker_time],[max_worker_time],[total_physical_reads],[last_physical_reads],[min_physical_reads],[max_physical_reads],[total_logical_writes],[last_logical_writes],[min_logical_writes],[max_logical_writes],[total_logical_reads],[last_logical_reads],[min_logical_reads],[max_logical_reads],[total_clr_time],[last_clr_time],[min_clr_time],[max_clr_time],[total_elapsed_time],[last_elapsed_time],[min_elapsed_time],[max_elapsed_time])\r\n\t\t\t            AS (SELECT TOP 20 qs.[sql_handle],qs.[statement_start_offset],qs.[statement_end_offset],qs.[plan_generation_num],qs.[plan_handle],qs.[creation_time],qs.[last_execution_time],qs.[execution_count],qs.[total_worker_time],qs.[last_worker_time],qs.[min_worker_time],qs.[max_worker_time],qs.[total_physical_reads],qs.[last_physical_reads],qs.[min_physical_reads],qs.[max_physical_reads],qs.[total_logical_writes],qs.[last_logical_writes],qs.[min_logical_writes],qs.[max_logical_writes],qs.[total_logical_reads],qs.[last_logical_reads],qs.[min_logical_reads],qs.[max_logical_reads],qs.[total_clr_time],qs.[last_clr_time],qs.[min_clr_time],qs.[max_clr_time],qs.[total_elapsed_time],qs.[last_elapsed_time],qs.[min_elapsed_time],qs.[max_elapsed_time]\r\n\t\t\t\t\t\tFROM sys.dm_exec_query_stats qs\r\n\t\t\t\t\t\tORDER BY qs.execution_count DESC)\r\n\t\t\t\t\t\tINSERT INTO #dm_exec_query_stats ([sql_handle],[statement_start_offset],[statement_end_offset],[plan_generation_num],[plan_handle],[creation_time],[last_execution_time],[execution_count],[total_worker_time],[last_worker_time],[min_worker_time],[max_worker_time],[total_physical_reads],[last_physical_reads],[min_physical_reads],[max_physical_reads],[total_logical_writes],[last_logical_writes],[min_logical_writes],[max_logical_writes],[total_logical_reads],[last_logical_reads],[min_logical_reads],[max_logical_reads],[total_clr_time],[last_clr_time],[min_clr_time],[max_clr_time],[total_elapsed_time],[last_elapsed_time],[min_elapsed_time],[max_elapsed_time])\r\n\t\t\t\t\t\tSELECT qs.[sql_handle],qs.[statement_start_offset],qs.[statement_end_offset],qs.[plan_generation_num],qs.[plan_handle],qs.[creation_time],qs.[last_execution_time],qs.[execution_count],qs.[total_worker_time],qs.[last_worker_time],qs.[min_worker_time],qs.[max_worker_time],qs.[total_physical_reads],qs.[last_physical_reads],qs.[min_physical_reads],qs.[max_physical_reads],qs.[total_logical_writes],qs.[last_logical_writes],qs.[min_logical_writes],qs.[max_logical_writes],qs.[total_logical_reads],qs.[last_logical_reads],qs.[min_logical_reads],qs.[max_logical_reads],qs.[total_clr_time],qs.[last_clr_time],qs.[min_clr_time],qs.[max_clr_time],qs.[total_elapsed_time],qs.[last_elapsed_time],qs.[min_elapsed_time],qs.[max_elapsed_time]\r\n\t\t\t\t\t\tFROM queries qs\r\n\t\t\t\t\t\tLEFT OUTER JOIN #dm_exec_query_stats qsCaught ON qs.sql_handle = qsCaught.sql_handle AND qs.plan_handle = qsCaught.plan_handle AND qs.statement_start_offset = qsCaught.statement_start_offset\r\n\t\t\t\t\t\tWHERE qsCaught.sql_handle IS NULL;&#39;\r\n                            EXECUTE(@StringToExecute)\r\n                        END\r\n\r\n                    IF @CheckProcedureCacheFilter = &#39;Duration&#39;\r\n                        OR @CheckProcedureCacheFilter IS NULL \r\n                        BEGIN\r\n                            SET @StringToExecute = &#39;WITH queries ([sql_handle],[statement_start_offset],[statement_end_offset],[plan_generation_num],[plan_handle],[creation_time],[last_execution_time],[execution_count],[total_worker_time],[last_worker_time],[min_worker_time],[max_worker_time],[total_physical_reads],[last_physical_reads],[min_physical_reads],[max_physical_reads],[total_logical_writes],[last_logical_writes],[min_logical_writes],[max_logical_writes],[total_logical_reads],[last_logical_reads],[min_logical_reads],[max_logical_reads],[total_clr_time],[last_clr_time],[min_clr_time],[max_clr_time],[total_elapsed_time],[last_elapsed_time],[min_elapsed_time],[max_elapsed_time])\r\n\t\t\t            AS (SELECT TOP 20 qs.[sql_handle],qs.[statement_start_offset],qs.[statement_end_offset],qs.[plan_generation_num],qs.[plan_handle],qs.[creation_time],qs.[last_execution_time],qs.[execution_count],qs.[total_worker_time],qs.[last_worker_time],qs.[min_worker_time],qs.[max_worker_time],qs.[total_physical_reads],qs.[last_physical_reads],qs.[min_physical_reads],qs.[max_physical_reads],qs.[total_logical_writes],qs.[last_logical_writes],qs.[min_logical_writes],qs.[max_logical_writes],qs.[total_logical_reads],qs.[last_logical_reads],qs.[min_logical_reads],qs.[max_logical_reads],qs.[total_clr_time],qs.[last_clr_time],qs.[min_clr_time],qs.[max_clr_time],qs.[total_elapsed_time],qs.[last_elapsed_time],qs.[min_elapsed_time],qs.[max_elapsed_time]\r\n\t\t\t\t\t\tFROM sys.dm_exec_query_stats qs\r\n\t\t\t\t\t\tORDER BY qs.total_elapsed_time DESC)\r\n\t\t\t\t\t\tINSERT INTO #dm_exec_query_stats ([sql_handle],[statement_start_offset],[statement_end_offset],[plan_generation_num],[plan_handle],[creation_time],[last_execution_time],[execution_count],[total_worker_time],[last_worker_time],[min_worker_time],[max_worker_time],[total_physical_reads],[last_physical_reads],[min_physical_reads],[max_physical_reads],[total_logical_writes],[last_logical_writes],[min_logical_writes],[max_logical_writes],[total_logical_reads],[last_logical_reads],[min_logical_reads],[max_logical_reads],[total_clr_time],[last_clr_time],[min_clr_time],[max_clr_time],[total_elapsed_time],[last_elapsed_time],[min_elapsed_time],[max_elapsed_time])\r\n\t\t\t\t\t\tSELECT qs.[sql_handle],qs.[statement_start_offset],qs.[statement_end_offset],qs.[plan_generation_num],qs.[plan_handle],qs.[creation_time],qs.[last_execution_time],qs.[execution_count],qs.[total_worker_time],qs.[last_worker_time],qs.[min_worker_time],qs.[max_worker_time],qs.[total_physical_reads],qs.[last_physical_reads],qs.[min_physical_reads],qs.[max_physical_reads],qs.[total_logical_writes],qs.[last_logical_writes],qs.[min_logical_writes],qs.[max_logical_writes],qs.[total_logical_reads],qs.[last_logical_reads],qs.[min_logical_reads],qs.[max_logical_reads],qs.[total_clr_time],qs.[last_clr_time],qs.[min_clr_time],qs.[max_clr_time],qs.[total_elapsed_time],qs.[last_elapsed_time],qs.[min_elapsed_time],qs.[max_elapsed_time]\r\n\t\t\t\t\t\tFROM queries qs\r\n\t\t\t\t\t\tLEFT OUTER JOIN #dm_exec_query_stats qsCaught ON qs.sql_handle = qsCaught.sql_handle AND qs.plan_handle = qsCaught.plan_handle AND qs.statement_start_offset = qsCaught.statement_start_offset\r\n\t\t\t\t\t\tWHERE qsCaught.sql_handle IS NULL;&#39;\r\n                            EXECUTE(@StringToExecute)\r\n                        END\r\n\r\n                END;\r\n            IF @@VERSION LIKE &#39;%Microsoft SQL Server 2008%&#39;\r\n                OR @@VERSION LIKE &#39;%Microsoft SQL Server 2012%&#39; \r\n                BEGIN\r\n                    IF @CheckProcedureCacheFilter = &#39;CPU&#39;\r\n                        OR @CheckProcedureCacheFilter IS NULL \r\n                        BEGIN\r\n                            SET @StringToExecute = &#39;WITH queries ([sql_handle],[statement_start_offset],[statement_end_offset],[plan_generation_num],[plan_handle],[creation_time],[last_execution_time],[execution_count],[total_worker_time],[last_worker_time],[min_worker_time],[max_worker_time],[total_physical_reads],[last_physical_reads],[min_physical_reads],[max_physical_reads],[total_logical_writes],[last_logical_writes],[min_logical_writes],[max_logical_writes],[total_logical_reads],[last_logical_reads],[min_logical_reads],[max_logical_reads],[total_clr_time],[last_clr_time],[min_clr_time],[max_clr_time],[total_elapsed_time],[last_elapsed_time],[min_elapsed_time],[max_elapsed_time],[query_hash],[query_plan_hash])\r\n\t\t\t            AS (SELECT TOP 20 qs.[sql_handle],qs.[statement_start_offset],qs.[statement_end_offset],qs.[plan_generation_num],qs.[plan_handle],qs.[creation_time],qs.[last_execution_time],qs.[execution_count],qs.[total_worker_time],qs.[last_worker_time],qs.[min_worker_time],qs.[max_worker_time],qs.[total_physical_reads],qs.[last_physical_reads],qs.[min_physical_reads],qs.[max_physical_reads],qs.[total_logical_writes],qs.[last_logical_writes],qs.[min_logical_writes],qs.[max_logical_writes],qs.[total_logical_reads],qs.[last_logical_reads],qs.[min_logical_reads],qs.[max_logical_reads],qs.[total_clr_time],qs.[last_clr_time],qs.[min_clr_time],qs.[max_clr_time],qs.[total_elapsed_time],qs.[last_elapsed_time],qs.[min_elapsed_time],qs.[max_elapsed_time],qs.[query_hash],qs.[query_plan_hash]\r\n\t\t\t\t\t\tFROM sys.dm_exec_query_stats qs\r\n\t\t\t\t\t\tORDER BY qs.total_worker_time DESC)\r\n\t\t\t\t\t\tINSERT INTO #dm_exec_query_stats ([sql_handle],[statement_start_offset],[statement_end_offset],[plan_generation_num],[plan_handle],[creation_time],[last_execution_time],[execution_count],[total_worker_time],[last_worker_time],[min_worker_time],[max_worker_time],[total_physical_reads],[last_physical_reads],[min_physical_reads],[max_physical_reads],[total_logical_writes],[last_logical_writes],[min_logical_writes],[max_logical_writes],[total_logical_reads],[last_logical_reads],[min_logical_reads],[max_logical_reads],[total_clr_time],[last_clr_time],[min_clr_time],[max_clr_time],[total_elapsed_time],[last_elapsed_time],[min_elapsed_time],[max_elapsed_time],[query_hash],[query_plan_hash])\r\n\t\t\t\t\t\tSELECT qs.[sql_handle],qs.[statement_start_offset],qs.[statement_end_offset],qs.[plan_generation_num],qs.[plan_handle],qs.[creation_time],qs.[last_execution_time],qs.[execution_count],qs.[total_worker_time],qs.[last_worker_time],qs.[min_worker_time],qs.[max_worker_time],qs.[total_physical_reads],qs.[last_physical_reads],qs.[min_physical_reads],qs.[max_physical_reads],qs.[total_logical_writes],qs.[last_logical_writes],qs.[min_logical_writes],qs.[max_logical_writes],qs.[total_logical_reads],qs.[last_logical_reads],qs.[min_logical_reads],qs.[max_logical_reads],qs.[total_clr_time],qs.[last_clr_time],qs.[min_clr_time],qs.[max_clr_time],qs.[total_elapsed_time],qs.[last_elapsed_time],qs.[min_elapsed_time],qs.[max_elapsed_time],qs.[query_hash],qs.[query_plan_hash]\r\n\t\t\t\t\t\tFROM queries qs\r\n\t\t\t\t\t\tLEFT OUTER JOIN #dm_exec_query_stats qsCaught ON qs.sql_handle = qsCaught.sql_handle AND qs.plan_handle = qsCaught.plan_handle AND qs.statement_start_offset = qsCaught.statement_start_offset\r\n\t\t\t\t\t\tWHERE qsCaught.sql_handle IS NULL;&#39;\r\n                            EXECUTE(@StringToExecute)\r\n                        END\r\n\r\n                    IF @CheckProcedureCacheFilter = &#39;Reads&#39;\r\n                        OR @CheckProcedureCacheFilter IS NULL \r\n                        BEGIN\r\n                            SET @StringToExecute = &#39;WITH queries ([sql_handle],[statement_start_offset],[statement_end_offset],[plan_generation_num],[plan_handle],[creation_time],[last_execution_time],[execution_count],[total_worker_time],[last_worker_time],[min_worker_time],[max_worker_time],[total_physical_reads],[last_physical_reads],[min_physical_reads],[max_physical_reads],[total_logical_writes],[last_logical_writes],[min_logical_writes],[max_logical_writes],[total_logical_reads],[last_logical_reads],[min_logical_reads],[max_logical_reads],[total_clr_time],[last_clr_time],[min_clr_time],[max_clr_time],[total_elapsed_time],[last_elapsed_time],[min_elapsed_time],[max_elapsed_time],[query_hash],[query_plan_hash])\r\n\t\t\t            AS (SELECT TOP 20 qs.[sql_handle],qs.[statement_start_offset],qs.[statement_end_offset],qs.[plan_generation_num],qs.[plan_handle],qs.[creation_time],qs.[last_execution_time],qs.[execution_count],qs.[total_worker_time],qs.[last_worker_time],qs.[min_worker_time],qs.[max_worker_time],qs.[total_physical_reads],qs.[last_physical_reads],qs.[min_physical_reads],qs.[max_physical_reads],qs.[total_logical_writes],qs.[last_logical_writes],qs.[min_logical_writes],qs.[max_logical_writes],qs.[total_logical_reads],qs.[last_logical_reads],qs.[min_logical_reads],qs.[max_logical_reads],qs.[total_clr_time],qs.[last_clr_time],qs.[min_clr_time],qs.[max_clr_time],qs.[total_elapsed_time],qs.[last_elapsed_time],qs.[min_elapsed_time],qs.[max_elapsed_time],qs.[query_hash],qs.[query_plan_hash]\r\n\t\t\t\t\t\tFROM sys.dm_exec_query_stats qs\r\n\t\t\t\t\t\tORDER BY qs.total_logical_reads DESC)\r\n\t\t\t\t\t\tINSERT INTO #dm_exec_query_stats ([sql_handle],[statement_start_offset],[statement_end_offset],[plan_generation_num],[plan_handle],[creation_time],[last_execution_time],[execution_count],[total_worker_time],[last_worker_time],[min_worker_time],[max_worker_time],[total_physical_reads],[last_physical_reads],[min_physical_reads],[max_physical_reads],[total_logical_writes],[last_logical_writes],[min_logical_writes],[max_logical_writes],[total_logical_reads],[last_logical_reads],[min_logical_reads],[max_logical_reads],[total_clr_time],[last_clr_time],[min_clr_time],[max_clr_time],[total_elapsed_time],[last_elapsed_time],[min_elapsed_time],[max_elapsed_time],[query_hash],[query_plan_hash])\r\n\t\t\t\t\t\tSELECT qs.[sql_handle],qs.[statement_start_offset],qs.[statement_end_offset],qs.[plan_generation_num],qs.[plan_handle],qs.[creation_time],qs.[last_execution_time],qs.[execution_count],qs.[total_worker_time],qs.[last_worker_time],qs.[min_worker_time],qs.[max_worker_time],qs.[total_physical_reads],qs.[last_physical_reads],qs.[min_physical_reads],qs.[max_physical_reads],qs.[total_logical_writes],qs.[last_logical_writes],qs.[min_logical_writes],qs.[max_logical_writes],qs.[total_logical_reads],qs.[last_logical_reads],qs.[min_logical_reads],qs.[max_logical_reads],qs.[total_clr_time],qs.[last_clr_time],qs.[min_clr_time],qs.[max_clr_time],qs.[total_elapsed_time],qs.[last_elapsed_time],qs.[min_elapsed_time],qs.[max_elapsed_time],qs.[query_hash],qs.[query_plan_hash]\r\n\t\t\t\t\t\tFROM queries qs\r\n\t\t\t\t\t\tLEFT OUTER JOIN #dm_exec_query_stats qsCaught ON qs.sql_handle = qsCaught.sql_handle AND qs.plan_handle = qsCaught.plan_handle AND qs.statement_start_offset = qsCaught.statement_start_offset\r\n\t\t\t\t\t\tWHERE qsCaught.sql_handle IS NULL;&#39;\r\n                            EXECUTE(@StringToExecute)\r\n                        END\r\n\t\r\n                    IF @CheckProcedureCacheFilter = &#39;ExecCount&#39;\r\n                        OR @CheckProcedureCacheFilter IS NULL \r\n                        BEGIN\r\n                            SET @StringToExecute = &#39;WITH queries ([sql_handle],[statement_start_offset],[statement_end_offset],[plan_generation_num],[plan_handle],[creation_time],[last_execution_time],[execution_count],[total_worker_time],[last_worker_time],[min_worker_time],[max_worker_time],[total_physical_reads],[last_physical_reads],[min_physical_reads],[max_physical_reads],[total_logical_writes],[last_logical_writes],[min_logical_writes],[max_logical_writes],[total_logical_reads],[last_logical_reads],[min_logical_reads],[max_logical_reads],[total_clr_time],[last_clr_time],[min_clr_time],[max_clr_time],[total_elapsed_time],[last_elapsed_time],[min_elapsed_time],[max_elapsed_time],[query_hash],[query_plan_hash])\r\n\t\t\t            AS (SELECT TOP 20 qs.[sql_handle],qs.[statement_start_offset],qs.[statement_end_offset],qs.[plan_generation_num],qs.[plan_handle],qs.[creation_time],qs.[last_execution_time],qs.[execution_count],qs.[total_worker_time],qs.[last_worker_time],qs.[min_worker_time],qs.[max_worker_time],qs.[total_physical_reads],qs.[last_physical_reads],qs.[min_physical_reads],qs.[max_physical_reads],qs.[total_logical_writes],qs.[last_logical_writes],qs.[min_logical_writes],qs.[max_logical_writes],qs.[total_logical_reads],qs.[last_logical_reads],qs.[min_logical_reads],qs.[max_logical_reads],qs.[total_clr_time],qs.[last_clr_time],qs.[min_clr_time],qs.[max_clr_time],qs.[total_elapsed_time],qs.[last_elapsed_time],qs.[min_elapsed_time],qs.[max_elapsed_time],qs.[query_hash],qs.[query_plan_hash]\r\n\t\t\t\t\t\tFROM sys.dm_exec_query_stats qs\r\n\t\t\t\t\t\tORDER BY qs.execution_count DESC)\r\n\t\t\t\t\t\tINSERT INTO #dm_exec_query_stats ([sql_handle],[statement_start_offset],[statement_end_offset],[plan_generation_num],[plan_handle],[creation_time],[last_execution_time],[execution_count],[total_worker_time],[last_worker_time],[min_worker_time],[max_worker_time],[total_physical_reads],[last_physical_reads],[min_physical_reads],[max_physical_reads],[total_logical_writes],[last_logical_writes],[min_logical_writes],[max_logical_writes],[total_logical_reads],[last_logical_reads],[min_logical_reads],[max_logical_reads],[total_clr_time],[last_clr_time],[min_clr_time],[max_clr_time],[total_elapsed_time],[last_elapsed_time],[min_elapsed_time],[max_elapsed_time],[query_hash],[query_plan_hash])\r\n\t\t\t\t\t\tSELECT qs.[sql_handle],qs.[statement_start_offset],qs.[statement_end_offset],qs.[plan_generation_num],qs.[plan_handle],qs.[creation_time],qs.[last_execution_time],qs.[execution_count],qs.[total_worker_time],qs.[last_worker_time],qs.[min_worker_time],qs.[max_worker_time],qs.[total_physical_reads],qs.[last_physical_reads],qs.[min_physical_reads],qs.[max_physical_reads],qs.[total_logical_writes],qs.[last_logical_writes],qs.[min_logical_writes],qs.[max_logical_writes],qs.[total_logical_reads],qs.[last_logical_reads],qs.[min_logical_reads],qs.[max_logical_reads],qs.[total_clr_time],qs.[last_clr_time],qs.[min_clr_time],qs.[max_clr_time],qs.[total_elapsed_time],qs.[last_elapsed_time],qs.[min_elapsed_time],qs.[max_elapsed_time],qs.[query_hash],qs.[query_plan_hash]\r\n\t\t\t\t\t\tFROM queries qs\r\n\t\t\t\t\t\tLEFT OUTER JOIN #dm_exec_query_stats qsCaught ON qs.sql_handle = qsCaught.sql_handle AND qs.plan_handle = qsCaught.plan_handle AND qs.statement_start_offset = qsCaught.statement_start_offset\r\n\t\t\t\t\t\tWHERE qsCaught.sql_handle IS NULL;&#39;\r\n                            EXECUTE(@StringToExecute)\r\n                        END\r\n\r\n                    IF @CheckProcedureCacheFilter = &#39;Duration&#39;\r\n                        OR @CheckProcedureCacheFilter IS NULL \r\n                        BEGIN\r\n                            SET @StringToExecute = &#39;WITH queries ([sql_handle],[statement_start_offset],[statement_end_offset],[plan_generation_num],[plan_handle],[creation_time],[last_execution_time],[execution_count],[total_worker_time],[last_worker_time],[min_worker_time],[max_worker_time],[total_physical_reads],[last_physical_reads],[min_physical_reads],[max_physical_reads],[total_logical_writes],[last_logical_writes],[min_logical_writes],[max_logical_writes],[total_logical_reads],[last_logical_reads],[min_logical_reads],[max_logical_reads],[total_clr_time],[last_clr_time],[min_clr_time],[max_clr_time],[total_elapsed_time],[last_elapsed_time],[min_elapsed_time],[max_elapsed_time],[query_hash],[query_plan_hash])\r\n\t\t\t            AS (SELECT TOP 20 qs.[sql_handle],qs.[statement_start_offset],qs.[statement_end_offset],qs.[plan_generation_num],qs.[plan_handle],qs.[creation_time],qs.[last_execution_time],qs.[execution_count],qs.[total_worker_time],qs.[last_worker_time],qs.[min_worker_time],qs.[max_worker_time],qs.[total_physical_reads],qs.[last_physical_reads],qs.[min_physical_reads],qs.[max_physical_reads],qs.[total_logical_writes],qs.[last_logical_writes],qs.[min_logical_writes],qs.[max_logical_writes],qs.[total_logical_reads],qs.[last_logical_reads],qs.[min_logical_reads],qs.[max_logical_reads],qs.[total_clr_time],qs.[last_clr_time],qs.[min_clr_time],qs.[max_clr_time],qs.[total_elapsed_time],qs.[last_elapsed_time],qs.[min_elapsed_time],qs.[max_elapsed_time],qs.[query_hash],qs.[query_plan_hash]\r\n\t\t\t\t\t\tFROM sys.dm_exec_query_stats qs\r\n\t\t\t\t\t\tORDER BY qs.total_elapsed_time DESC)\r\n\t\t\t\t\t\tINSERT INTO #dm_exec_query_stats ([sql_handle],[statement_start_offset],[statement_end_offset],[plan_generation_num],[plan_handle],[creation_time],[last_execution_time],[execution_count],[total_worker_time],[last_worker_time],[min_worker_time],[max_worker_time],[total_physical_reads],[last_physical_reads],[min_physical_reads],[max_physical_reads],[total_logical_writes],[last_logical_writes],[min_logical_writes],[max_logical_writes],[total_logical_reads],[last_logical_reads],[min_logical_reads],[max_logical_reads],[total_clr_time],[last_clr_time],[min_clr_time],[max_clr_time],[total_elapsed_time],[last_elapsed_time],[min_elapsed_time],[max_elapsed_time],[query_hash],[query_plan_hash])\r\n\t\t\t\t\t\tSELECT qs.[sql_handle],qs.[statement_start_offset],qs.[statement_end_offset],qs.[plan_generation_num],qs.[plan_handle],qs.[creation_time],qs.[last_execution_time],qs.[execution_count],qs.[total_worker_time],qs.[last_worker_time],qs.[min_worker_time],qs.[max_worker_time],qs.[total_physical_reads],qs.[last_physical_reads],qs.[min_physical_reads],qs.[max_physical_reads],qs.[total_logical_writes],qs.[last_logical_writes],qs.[min_logical_writes],qs.[max_logical_writes],qs.[total_logical_reads],qs.[last_logical_reads],qs.[min_logical_reads],qs.[max_logical_reads],qs.[total_clr_time],qs.[last_clr_time],qs.[min_clr_time],qs.[max_clr_time],qs.[total_elapsed_time],qs.[last_elapsed_time],qs.[min_elapsed_time],qs.[max_elapsed_time],qs.[query_hash],qs.[query_plan_hash]\r\n\t\t\t\t\t\tFROM queries qs\r\n\t\t\t\t\t\tLEFT OUTER JOIN #dm_exec_query_stats qsCaught ON qs.sql_handle = qsCaught.sql_handle AND qs.plan_handle = qsCaught.plan_handle AND qs.statement_start_offset = qsCaught.statement_start_offset\r\n\t\t\t\t\t\tWHERE qsCaught.sql_handle IS NULL;&#39;\r\n                            EXECUTE(@StringToExecute)\r\n                        END\r\n\r\n\t\t\t\t\t\/* Populate the query_plan_filtered field. Only works in 2005SP2+, but we&#39;re just doing it in 2008 to be safe. *\/\r\n                    UPDATE  #dm_exec_query_stats\r\n                    SET     query_plan_filtered = qp.query_plan\r\n                    FROM    #dm_exec_query_stats qs\r\n                            CROSS APPLY sys.dm_exec_text_query_plan(qs.plan_handle,\r\n                                                              qs.statement_start_offset,\r\n                                                              qs.statement_end_offset)\r\n                            AS qp \r\n\r\n                END;\r\n\r\n\t\t\t\t\/* Populate the additional query_plan, text, and text_filtered fields *\/\r\n            UPDATE  #dm_exec_query_stats\r\n            SET     query_plan = qp.query_plan ,\r\n                    [text] = st.[text] ,\r\n                    text_filtered = SUBSTRING(st.text,\r\n                                              ( qs.statement_start_offset \/ 2 )\r\n                                              + 1,\r\n                                              ( ( CASE qs.statement_end_offset\r\n                                                    WHEN -1\r\n                                                    THEN DATALENGTH(st.text)\r\n                                                    ELSE qs.statement_end_offset\r\n                                                  END\r\n                                                  - qs.statement_start_offset )\r\n                                                \/ 2 ) + 1)\r\n            FROM    #dm_exec_query_stats qs\r\n                    CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st\r\n                    CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS qp\r\n\r\n\t\t\t\t\/* Dump instances of our own script. We&#39;re not trying to tune ourselves. *\/\r\n            DELETE  #dm_exec_query_stats\r\n            WHERE   text LIKE &#39;%sp_Blitz%&#39;\r\n                    OR text LIKE &#39;%#BlitzResults%&#39;\r\n\r\n\t\t\t\t\/* Look for implicit conversions *\/\r\n            INSERT  INTO #BlitzResults\r\n                    ( CheckID ,\r\n                      Priority ,\r\n                      FindingsGroup ,\r\n                      Finding ,\r\n                      URL ,\r\n                      Details ,\r\n                      QueryPlan ,\r\n                      QueryPlanFiltered\r\n\t\t\t\t\t\t  \r\n                    )\r\n                    SELECT  63 AS CheckID ,\r\n                            120 AS Priority ,\r\n                            &#39;Query Plans&#39; AS FindingsGroup ,\r\n                            &#39;Implicit Conversion&#39; AS Finding ,\r\n                            &#39;http:\/\/BrentOzar.com\/go\/implicit&#39; AS URL ,\r\n                            ( &#39;One of the top resource-intensive queries is comparing two fields that are not the same datatype.&#39; ) AS Details ,\r\n                            qs.query_plan ,\r\n                            qs.query_plan_filtered\r\n                    FROM    #dm_exec_query_stats qs\r\n                    WHERE   COALESCE(qs.query_plan_filtered,\r\n                                     CAST(qs.query_plan AS NVARCHAR(MAX))) LIKE &#39;%CONVERT_IMPLICIT%&#39;\r\n                            AND COALESCE(qs.query_plan_filtered,\r\n                                         CAST(qs.query_plan AS NVARCHAR(MAX))) LIKE &#39;%PhysicalOp=&quot;Index Scan&quot;%&#39;\r\n\r\n            INSERT  INTO #BlitzResults\r\n                    ( CheckID ,\r\n                      Priority ,\r\n                      FindingsGroup ,\r\n                      Finding ,\r\n                      URL ,\r\n                      Details ,\r\n                      QueryPlan ,\r\n                      QueryPlanFiltered\r\n\t\t\t\t\t\t\t\t  \r\n                    )\r\n                    SELECT  63 AS CheckID ,\r\n                            120 AS Priority ,\r\n                            &#39;Query Plans&#39; AS FindingsGroup ,\r\n                            &#39;Implicit Conversion Affecting Cardinality&#39; AS Finding ,\r\n                            &#39;http:\/\/BrentOzar.com\/go\/implicit&#39; AS URL ,\r\n                            ( &#39;One of the top resource-intensive queries has an implicit conversion that is affecting cardinality estimation.&#39; ) AS Details ,\r\n                            qs.query_plan ,\r\n                            qs.query_plan_filtered\r\n                    FROM    #dm_exec_query_stats qs\r\n                    WHERE   COALESCE(qs.query_plan_filtered,\r\n                                     CAST(qs.query_plan AS NVARCHAR(MAX))) LIKE &#39;%&lt;PlanAffectingConvert ConvertIssue=&quot;Cardinality Estimate&quot; Expression=&quot;CONVERT_IMPLICIT%&#39;\r\n\r\n\r\n\t\t\t\t\/* Look for missing indexes *\/\r\n            INSERT  INTO #BlitzResults\r\n                    ( CheckID ,\r\n                      Priority ,\r\n                      FindingsGroup ,\r\n                      Finding ,\r\n                      URL ,\r\n                      Details ,\r\n                      QueryPlan ,\r\n                      QueryPlanFiltered\r\n\t\t\t\t\t\t  \r\n                    )\r\n                    SELECT  65 AS CheckID ,\r\n                            120 AS Priority ,\r\n                            &#39;Query Plans&#39; AS FindingsGroup ,\r\n                            &#39;Missing Index&#39; AS Finding ,\r\n                            &#39;http:\/\/BrentOzar.com\/go\/missingindex&#39; AS URL ,\r\n                            ( &#39;One of the top resource-intensive queries may be dramatically improved by adding an index.&#39; ) AS Details ,\r\n                            qs.query_plan ,\r\n                            qs.query_plan_filtered\r\n                    FROM    #dm_exec_query_stats qs\r\n                    WHERE   COALESCE(qs.query_plan_filtered,\r\n                                     CAST(qs.query_plan AS NVARCHAR(MAX))) LIKE &#39;%MissingIndexGroup%&#39;\r\n\t\t\t\t\r\n\t\t\t\t\/* Look for cursors *\/\r\n            INSERT  INTO #BlitzResults\r\n                    ( CheckID ,\r\n                      Priority ,\r\n                      FindingsGroup ,\r\n                      Finding ,\r\n                      URL ,\r\n                      Details ,\r\n                      QueryPlan ,\r\n                      QueryPlanFiltered\r\n\t\t\t\t\t\t  \r\n                    )\r\n                    SELECT  66 AS CheckID ,\r\n                            120 AS Priority ,\r\n                            &#39;Query Plans&#39; AS FindingsGroup ,\r\n                            &#39;Cursor&#39; AS Finding ,\r\n                            &#39;http:\/\/BrentOzar.com\/go\/cursor&#39; AS URL ,\r\n                            ( &#39;One of the top resource-intensive queries is using a cursor.&#39; ) AS Details ,\r\n                            qs.query_plan ,\r\n                            qs.query_plan_filtered\r\n                    FROM    #dm_exec_query_stats qs\r\n                    WHERE   COALESCE(qs.query_plan_filtered,\r\n                                     CAST(qs.query_plan AS NVARCHAR(MAX))) LIKE &#39;%&lt;StmtCursor%&#39;\r\n\r\n\r\n\t\t\t\t\/* Look for scalar user-defined functions *\/\r\n            INSERT  INTO #BlitzResults\r\n                    ( CheckID ,\r\n                      Priority ,\r\n                      FindingsGroup ,\r\n                      Finding ,\r\n                      URL ,\r\n                      Details ,\r\n                      QueryPlan ,\r\n                      QueryPlanFiltered\r\n\t\t\t\t\t\t  \r\n                    )\r\n                    SELECT  67 AS CheckID ,\r\n                            120 AS Priority ,\r\n                            &#39;Query Plans&#39; AS FindingsGroup ,\r\n                            &#39;Scalar UDFs&#39; AS Finding ,\r\n                            &#39;http:\/\/BrentOzar.com\/go\/functions&#39; AS URL ,\r\n                            ( &#39;One of the top resource-intensive queries is using a user-defined scalar function that may inhibit parallelism.&#39; ) AS Details ,\r\n                            qs.query_plan ,\r\n                            qs.query_plan_filtered\r\n                    FROM    #dm_exec_query_stats qs\r\n                    WHERE   COALESCE(qs.query_plan_filtered,\r\n                                     CAST(qs.query_plan AS NVARCHAR(MAX))) LIKE &#39;%&lt;UserDefinedFunction%&#39;\r\n\r\n        END \/* IF @CheckProcedureCache = 1 *\/\r\n\r\n\t\/*Check for the last good DBCC CHECKDB date *\/\r\n    CREATE TABLE #DBCCs\r\n        (\r\n          Id INT IDENTITY(1, 1)\r\n                 PRIMARY KEY ,\r\n          ParentObject VARCHAR(255) ,\r\n          Object VARCHAR(255) ,\r\n          Field VARCHAR(255) ,\r\n          Value VARCHAR(255) ,\r\n          DbName SYSNAME NULL\r\n        )\r\n    EXEC sp_MSforeachdb N&#39;USE [?];\r\n\t\t\t\t\t\t\tINSERT #DBCCs(ParentObject, Object, Field, Value)\r\n\t\t\t\t\t\t\tEXEC (&#39;&#39;DBCC DBInfo() With TableResults, NO_INFOMSGS&#39;&#39;);\r\n\t\t\t\t\t\t\tUPDATE #DBCCs SET DbName = N&#39;&#39;?&#39;&#39; WHERE DbName IS NULL;&#39;;\r\n\r\n\r\n    WITH    DB2\r\n              AS ( SELECT   DISTINCT\r\n                            Field ,\r\n                            Value ,\r\n                            DbName\r\n                   FROM     #DBCCs\r\n                   WHERE    Field = &#39;dbi_dbccLastKnownGood&#39;\r\n                 )\r\n        INSERT  INTO #BlitzResults\r\n                ( CheckID ,\r\n                  Priority ,\r\n                  FindingsGroup ,\r\n                  Finding ,\r\n                  URL ,\r\n                  Details\r\n\t\t                 \r\n                )\r\n                SELECT  68 AS CheckID ,\r\n                        50 AS PRIORITY ,\r\n                        &#39;Reliability&#39; AS FindingsGroup ,\r\n                        &#39;Last good DBCC CHECKDB over 2 weeks old&#39; AS Finding ,\r\n                        &#39;http:\/\/BrentOzar.com\/go\/checkdb&#39; AS URL ,\r\n                        &#39;Database [&#39; + DB2.DbName + &#39;]&#39;\r\n                        + CASE DB2.Value\r\n                            WHEN &#39;1900-01-01 00:00:00.000&#39;\r\n                            THEN &#39; never had a successful DBCC CHECKDB.&#39;\r\n                            ELSE &#39; last had a successful DBCC CHECKDB run on &#39;\r\n                                 + DB2.Value + &#39;.&#39;\r\n                          END\r\n                        + &#39; This check should be run regularly to catch any database corruption as soon as possible.&#39;\r\n                        + &#39; Note: you can restore a backup of a busy production database to a test server and run DBCC CHECKDB &#39;\r\n                        + &#39; against that to minimize impact. If you do that, you can ignore this warning.&#39; AS Details\r\n                FROM    DB2\r\n                WHERE   CAST(DB2.Value AS DATETIME) &lt; DATEADD(DD, -14,\r\n                                                              CURRENT_TIMESTAMP)\r\n\r\n\r\n\r\n\/*Check for high VLF count: this will omit any database snapshots*\/\r\n    IF @@VERSION LIKE &#39;Microsoft SQL Server 2012%&#39; \r\n        BEGIN\r\n            CREATE TABLE #LogInfo2012\r\n                (\r\n                  recoveryunitid INT ,\r\n                  FileID SMALLINT ,\r\n                  FileSize BIGINT ,\r\n                  StartOffset BIGINT ,\r\n                  FSeqNo BIGINT ,\r\n                  [Status] TINYINT ,\r\n                  Parity TINYINT ,\r\n                  CreateLSN NUMERIC(38)\r\n                );\r\n            EXEC sp_MSforeachdb N&#39;USE [?];    \r\n\tINSERT INTO #LogInfo2012 \r\n\tEXEC sp_executesql N&#39;&#39;DBCC LogInfo() WITH NO_INFOMSGS&#39;&#39;;      \r\n\tIF    @@ROWCOUNT &gt; 50            \r\n\t\tBEGIN\r\n\t\t\tINSERT  INTO #BlitzResults                        \r\n\t\t\t( CheckID                          \r\n\t\t\t,Priority                          \r\n\t\t\t,FindingsGroup                          \r\n\t\t\t,Finding                          \r\n\t\t\t,URL                          \r\n\t\t\t,Details)                  \r\n\t\t\tSELECT      69                              \r\n\t\t\t,100                              \r\n\t\t\t,&#39;&#39;Performance&#39;&#39;                              \r\n\t\t\t,&#39;&#39;High VLF Count&#39;&#39;                              \r\n\t\t\t,&#39;&#39;http:\/\/BrentOzar.com\/go\/vlf &#39;&#39;                              \r\n\t\t\t,&#39;&#39;The [&#39;&#39; + DB_NAME() + &#39;&#39;] database has &#39;&#39; +  CAST(COUNT(*) as VARCHAR(20)) + &#39;&#39; virtual log files (VLFs). This may be slowing down startup, restores, and even inserts\/updates\/deletes.&#39;&#39;  \r\n\t\t\tFROM #LogInfo2012\r\n\t\t\tWHERE EXISTS (SELECT name FROM master.sys.databases \r\n\t\t\t\t\t\t\tWHERE source_database_id is null) ;            \r\n\t\t\tEND                       \r\n\t\t\tTRUNCATE TABLE #LogInfo2012;&#39;\r\n            DROP TABLE #LogInfo2012;\r\n        END\r\n    IF @@VERSION NOT LIKE &#39;Microsoft SQL Server 2012%&#39; \r\n        BEGIN\r\n            CREATE TABLE #LogInfo\r\n                (\r\n                  FileID SMALLINT ,\r\n                  FileSize BIGINT ,\r\n                  StartOffset BIGINT ,\r\n                  FSeqNo BIGINT ,\r\n                  [Status] TINYINT ,\r\n                  Parity TINYINT ,\r\n                  CreateLSN NUMERIC(38)\r\n                );\r\n            EXEC sp_MSforeachdb N&#39;USE [?];    \r\n\tINSERT INTO #LogInfo \r\n\tEXEC sp_executesql N&#39;&#39;DBCC LogInfo() WITH NO_INFOMSGS&#39;&#39;;      \r\n\tIF    @@ROWCOUNT &gt; 50            \r\n\t\tBEGIN\r\n\t\t\tINSERT  INTO #BlitzResults                        \r\n\t\t\t( CheckID                          \r\n\t\t\t,Priority                          \r\n\t\t\t,FindingsGroup                          \r\n\t\t\t,Finding                          \r\n\t\t\t,URL                          \r\n\t\t\t,Details)                  \r\n\t\t\tSELECT      69                              \r\n\t\t\t,100                              \r\n\t\t\t,&#39;&#39;Performance&#39;&#39;                              \r\n\t\t\t,&#39;&#39;High VLF Count&#39;&#39;                              \r\n\t\t\t,&#39;&#39;http:\/\/BrentOzar.com\/go\/vlf&#39;&#39;                              \r\n\t\t\t,&#39;&#39;The [&#39;&#39; + DB_NAME() + &#39;&#39;] database has &#39;&#39; +  CAST(COUNT(*) as VARCHAR(20)) + &#39;&#39; virtual log files (VLFs). This may be slowing down startup, restores, and even inserts\/updates\/deletes.&#39;&#39;  \r\n\t\t\tFROM #LogInfo\r\n\t\t\tWHERE EXISTS (SELECT name FROM master.sys.databases \r\n\t\t\t\t\t\t\tWHERE source_database_id is null);            \r\n\t\t\tEND                       \r\n\t\t\tTRUNCATE TABLE #LogInfo;&#39;\r\n            DROP TABLE #LogInfo;\r\n        END\r\n\t\r\n\/*Verify that the servername is set *\/\r\n\t\r\n    IF @@SERVERNAME IS NULL \r\n        BEGIN\r\n            INSERT  INTO #BlitzResults\r\n                    ( CheckID ,\r\n                      Priority ,\r\n                      FindingsGroup ,\r\n                      Finding ,\r\n                      URL ,\r\n                      Details\r\n                    )\r\n                    SELECT  70 AS CheckID ,\r\n                            200 AS Priority ,\r\n                            &#39;Configuration&#39; AS FindingsGroup ,\r\n                            &#39;@@Servername not set&#39; AS Finding ,\r\n                            &#39;http:\/\/BrentOzar.com\/go\/servername&#39; AS URL ,\r\n                            &#39;@@Servername variable is null. Correct by executing &quot;sp_addserver &#39;&#39;&lt;LocalServerName&gt;&#39;&#39;, local&quot;&#39; AS Details\r\n        END;\r\n\r\n\r\n\/*Check for non-aligned indexes in partioned databases*\/\r\n    CREATE TABLE #partdb\r\n        (\r\n          dbname VARCHAR(100) ,\r\n          objectname VARCHAR(200) ,\r\n          type_desc VARCHAR(50)\r\n        )\r\n    EXEC dbo.sp_MSforeachdb &#39;USE [?]; insert into #partdb(dbname, objectname, type_desc)\r\nSELECT distinct db_name(database_id) as DBName,o.name Object_Name,\r\nds.type_desc\r\n FROM sys.objects AS o\r\n      JOIN sys.indexes AS i\r\n  ON o.object_id = i.object_id \r\nJOIN sys.data_spaces ds on ds.data_space_id = i.data_space_id\r\n  LEFT OUTER JOIN \r\n  sys.dm_db_index_usage_stats AS s    \r\n ON i.object_id = s.object_id   \r\n  AND i.index_id = s.index_id\r\n  WHERE  o.type = &#39;&#39;u&#39;&#39;\r\n -- Clustered and Non-Clustered indexes\r\n   AND i.type IN (1, 2) \r\nAND o.name in \r\n\t(\r\nSELECT a.name from \r\n    (SELECT ob.name, ds.type_desc from sys.objects ob JOIN sys.indexes ind on ind.object_id = ob.object_id join sys.data_spaces ds on ds.data_space_id = ind.data_space_id\r\n\t\tGROUP BY ob.name, ds.type_desc ) a group by a.name having COUNT (*) &gt; 1\r\n\t)&#39;\r\n\t\r\n    INSERT  INTO #BlitzResults\r\n            ( CheckID ,\r\n              Priority ,\r\n              FindingsGroup ,\r\n              Finding ,\r\n              URL ,\r\n              Details\r\n            )\r\n            SELECT DISTINCT\r\n                    72 AS CheckId ,\r\n                    100 AS Priority ,\r\n                    &#39;Performance&#39; AS FindingsGroup ,\r\n                    &#39;The partioned database &#39; + dbname\r\n                    + &#39; may have non-aligned indexes&#39; AS Finding ,\r\n                    &#39;http:\/\/BrentOzar.com\/go\/aligned&#39; AS URL ,\r\n                    &#39;Having non-aligned indexes on partitioned tables may cause inefficient query plans and CPU pressure&#39; AS Details\r\n            FROM    #partdb\r\n            WHERE   dbname IS NOT\tNULL\r\n    DROP TABLE #partdb\r\n\r\n\/*Check to see if a failsafe operator has been configured*\/\r\n\r\n    DECLARE @AlertInfo TABLE\r\n        (\r\n          FailSafeOperator NVARCHAR(255) ,\r\n          NotificationMethod INT ,\r\n          ForwardingServer NVARCHAR(255) ,\r\n          ForwardingSeverity INT ,\r\n          PagerToTemplate NVARCHAR(255) ,\r\n          PagerCCTemplate NVARCHAR(255) ,\r\n          PagerSubjectTemplate NVARCHAR(255) ,\r\n          PagerSendSubjectOnly NVARCHAR(255) ,\r\n          ForwardAlways INT\r\n        )\r\n\r\n    INSERT  INTO @AlertInfo\r\n            EXEC [master].[dbo].[sp_MSgetalertinfo] @includeaddresses = 0\r\n    INSERT  INTO #BlitzResults\r\n            ( CheckID ,\r\n              Priority ,\r\n              FindingsGroup ,\r\n              Finding ,\r\n              URL ,\r\n              Details\r\n                \r\n            )\r\n            SELECT  73 AS CheckID ,\r\n                    50 AS Priority ,\r\n                    &#39;Reliability&#39; AS FindingsGroup ,\r\n                    &#39;No failsafe operator configured&#39; AS Finding ,\r\n                    &#39;http:\/\/BrentOzar.com\/go\/failsafe&#39; AS URL ,\r\n                    ( &#39;No failsafe operator is configured on this server.  This is a good idea just in-case there are issues with the [msdb] database that prevents alerting.&#39; ) AS Details\r\n            FROM    @AlertInfo\r\n            WHERE   FailSafeOperator IS NULL;\r\n\r\n\/*Identify globally enabled trace flags*\/\r\n    IF OBJECT_ID(&#39;tempdb..#TraceStatus&#39;) IS NOT NULL \r\n        DROP TABLE #TraceStatus;\r\n    CREATE TABLE #TraceStatus\r\n        (\r\n          TraceFlag VARCHAR(10) ,\r\n          status BIT ,\r\n          Global BIT ,\r\n          Session BIT\r\n        );\r\n\r\n    INSERT  INTO #TraceStatus\r\n            EXEC ( &#39; DBCC TRACESTATUS(-1) WITH NO_INFOMSGS&#39;\r\n                )\r\n\r\n    INSERT  INTO #BlitzResults\r\n            ( CheckID ,\r\n              Priority ,\r\n              FindingsGroup ,\r\n              Finding ,\r\n              URL ,\r\n              Details\r\n            )\r\n            SELECT  74 AS CheckID ,\r\n                    200 AS Priority ,\r\n                    &#39;Global Trace Flag&#39; AS FindingsGroup ,\r\n                    &#39;TraceFlag On&#39; AS Finding ,\r\n                    &#39;http:\/\/www.BrentOzar.com\/go\/traceflags\/&#39; AS URL ,\r\n                    &#39;Trace flag &#39; + T.TraceFlag + &#39; is enabled globally.&#39; ASDetails\r\n            FROM    #TraceStatus T\r\n\r\n\/*Check for transaction log file larger than data file *\/\r\n\r\n    INSERT  INTO #BlitzResults\r\n            ( CheckID ,\r\n              Priority ,\r\n              FindingsGroup ,\r\n              Finding ,\r\n              URL ,\r\n              Details\r\n            )\r\n            SELECT  75 AS CheckId ,\r\n                    50 AS Priority ,\r\n                    &#39;Reliability&#39; AS FindingsGroup ,\r\n                    &#39;Transaction Log Larger than Data File&#39; AS Finding ,\r\n                    &#39;http:\/\/BrentOzar.com\/go\/biglog&#39; AS URL ,\r\n                    &#39;The database [&#39; + DB_NAME(a.database_id)\r\n                    + &#39;] has a transaction log file larger than a data file. This may indicate that transaction log backups are not being performed or not performed often enough.&#39; AS Details\r\n            FROM    sys.master_files a\r\n            WHERE   a.type = 1\r\n                    AND a.size &gt; 125000 \/* Size is measured in pages here, so this gets us log files over 1GB. *\/\r\n                    AND a.size &gt; ( SELECT   SUM(b.size)\r\n                                   FROM     sys.master_files b\r\n                                   WHERE    a.database_id = b.database_id\r\n                                            AND b.type = 0\r\n                                 )\r\n                    AND a.database_id IN ( SELECT   database_id\r\n                                           FROM     sys.databases\r\n                                           WHERE    source_database_id IS NULL )\r\n\r\n\/*Check for collation conflicts between user databases and tempdb *\/\r\n    INSERT  INTO #BlitzResults\r\n            ( CheckID ,\r\n              Priority ,\r\n              FindingsGroup ,\r\n              Finding ,\r\n              URL ,\r\n              Details\r\n            )\r\n            SELECT  76 AS CheckId ,\r\n                    50 AS Priority ,\r\n                    &#39;Reliability&#39; AS FindingsGroup ,\r\n                    &#39;Collation for &#39; + name\r\n                    + &#39; different than tempdb collation&#39; AS Finding ,\r\n                    &#39;http:\/\/BrentOzar.com\/go\/collate&#39; AS URL ,\r\n                    &#39;Collation differences between user databases and tempdb can cause conflicts especially when comparing string values&#39; AS Details\r\n            FROM    sys.databases\r\n            WHERE   name NOT IN ( &#39;master&#39;, &#39;model&#39;, &#39;msdb&#39; )\r\n                    AND collation_name &lt;&gt; ( SELECT  collation_name\r\n                                            FROM    sys.databases\r\n                                            WHERE   name = &#39;tempdb&#39;\r\n                                          )\r\n\r\n    INSERT  INTO #BlitzResults\r\n            ( CheckID ,\r\n              Priority ,\r\n              FindingsGroup ,\r\n              Finding ,\r\n              URL ,\r\n              Details\r\n            )\r\n            SELECT  77 AS CheckId ,\r\n                    50 AS Priority ,\r\n                    &#39;Reliability&#39; AS FindingsGroup ,\r\n                    &#39;Database Snapshot Online&#39; AS Finding ,\r\n                    &#39;http:\/\/BrentOzar.com\/go\/snapshot&#39; AS URL ,\r\n                    &#39;Database [&#39; + dSnap.[name] + &#39;] is a snapshot of [&#39;\r\n                    + dOriginal.[name]\r\n                    + &#39;]. Make sure you have enough drive space to maintain the snapshot as the original database grows.&#39; AS Details\r\n            FROM    sys.databases dSnap\r\n                    INNER JOIN sys.databases dOriginal ON dSnap.source_database_id = dOriginal.database_id\r\n\r\n    INSERT  INTO #BlitzResults\r\n            ( CheckID ,\r\n              Priority ,\r\n              FindingsGroup ,\r\n              Finding ,\r\n              URL ,\r\n              Details\r\n            )\r\n            SELECT  79 AS CheckId ,\r\n                    100 AS Priority ,\r\n                    &#39;Performance&#39; AS FindingsGroup ,\r\n                    &#39;Shrink Database Job&#39; AS Finding ,\r\n                    &#39;http:\/\/BrentOzar.com\/go\/autoshrink&#39; AS URL ,\r\n                    &#39;In the [&#39; + j.[name] + &#39;] job, step [&#39; + step.[step_name]\r\n                    + &#39;] has SHRINKDATABASE or SHRINKFILE, which may be causing database fragmentation.&#39; AS Details\r\n            FROM    msdb.dbo.sysjobs j\r\n                    INNER JOIN msdb.dbo.sysjobsteps step ON j.job_id = step.job_id\r\n            WHERE   step.command LIKE N&#39;%SHRINKDATABASE%&#39;\r\n                    OR step.command LIKE N&#39;%SHRINKFILE%&#39;\r\n\r\n    EXEC dbo.sp_MSforeachdb &#39;USE [?]; INSERT INTO #BlitzResults (CheckID, Priority, FindingsGroup, Finding, URL, Details) SELECT DISTINCT 80, 50, &#39;&#39;Reliability&#39;&#39;, &#39;&#39;Max File Size Set&#39;&#39;, &#39;&#39;http:\/\/BrentOzar.com\/go\/maxsize&#39;&#39;, (&#39;&#39;The [&#39;&#39; + DB_NAME() + &#39;&#39;] database file &#39;&#39; + name + &#39;&#39; has a max file size set to &#39;&#39; + CAST(CAST(max_size AS BIGINT) * 8 \/ 1024 AS VARCHAR(100)) + &#39;&#39;MB. If it runs out of space, the database will stop working even though there may be drive space available.&#39;&#39;) FROM sys.database_files WHERE max_size &lt;&gt; 268435456 AND max_size &lt;&gt; -1&#39;;\r\n\r\n    INSERT  INTO #BlitzResults\r\n            ( CheckID ,\r\n              Priority ,\r\n              FindingsGroup ,\r\n              Finding ,\r\n              URL ,\r\n              Details\r\n            )\r\n            SELECT  81 AS CheckID ,\r\n                    200 AS Priority ,\r\n                    &#39;Non-Active Server Config&#39; AS FindingsGroup ,\r\n                    cr.name AS Finding ,\r\n                    &#39;http:\/\/www.BrentOzar.com\/blitz\/sp_configure\/&#39; AS URL ,\r\n                    ( &#39;This sp_configure option isn&#39;&#39;t running under its set value.  Its set value is &#39;\r\n                      + CAST(cr.[Value] AS VARCHAR(100))\r\n                      + &#39; and its running value is &#39;\r\n                      + CAST(cr.value_in_use AS VARCHAR(100))\r\n                      + &#39;. When someone does a RECONFIGURE or restarts the instance, this setting will start taking effect.&#39; ) AS Details\r\n            FROM    sys.configurations cr\r\n            WHERE   cr.value &lt;&gt; cr.value_in_use;\r\n\r\n\r\n    IF EXISTS ( SELECT  *\r\n                FROM    sys.all_objects\r\n                WHERE   name = &#39;dm_server_services&#39; ) \r\n        SET @StringToExecute = &#39;INSERT INTO #BlitzResults (CheckID, Priority, FindingsGroup, Finding, URL, Details)\r\n        SELECT  83 AS CheckID ,\r\n                250 AS Priority ,\r\n                &#39;&#39;Server Info&#39;&#39; AS FindingsGroup ,\r\n                &#39;&#39;Services&#39;&#39; AS Finding ,\r\n                &#39;&#39;&#39;&#39; AS URL ,\r\n                N&#39;&#39;Service: &#39;&#39; + servicename + N&#39;&#39; runs under service account &#39;&#39; + service_account + N&#39;&#39;. Last startup time: &#39;&#39; + COALESCE(CAST(CAST(last_startup_time AS DATETIME) AS VARCHAR(50)), &#39;&#39;not shown.&#39;&#39;) + &#39;&#39;. Startup type: &#39;&#39; + startup_type_desc + N&#39;&#39;, currently &#39;&#39; + status_desc + &#39;&#39;.&#39;&#39; \r\n                FROM sys.dm_server_services;&#39;\r\n    EXECUTE(@StringToExecute);\r\n\r\n\r\n\/* Check 84 - SQL Server 2012 *\/\r\n    IF EXISTS ( SELECT  *\r\n                FROM    sys.all_objects o\r\n                        INNER JOIN sys.all_columns c ON o.object_id = c.object_id\r\n                WHERE   o.name = &#39;dm_os_sys_info&#39;\r\n                        AND c.name = &#39;physical_memory_kb&#39; ) \r\n        BEGIN\r\n            SET @StringToExecute = &#39;INSERT INTO #BlitzResults (CheckID, Priority, FindingsGroup, Finding, URL, Details)\r\n        SELECT  84 AS CheckID ,\r\n                250 AS Priority ,\r\n                &#39;&#39;Server Info&#39;&#39; AS FindingsGroup ,\r\n                &#39;&#39;Hardware&#39;&#39; AS Finding ,\r\n                &#39;&#39;&#39;&#39; AS URL ,\r\n                &#39;&#39;Logical processors: &#39;&#39; + CAST(cpu_count AS VARCHAR(50)) + &#39;&#39;. Physical memory: &#39;&#39; + CAST( CAST(ROUND((physical_memory_kb \/ 1024.0 \/ 1024), 1) AS INT) AS VARCHAR(50)) + &#39;&#39;GB.&#39;&#39;\r\n\t\tFROM sys.dm_os_sys_info&#39;;\r\n            EXECUTE(@StringToExecute);\r\n        END\r\n\r\n\/* Check 84 - SQL Server 2008 *\/\r\n    IF EXISTS ( SELECT  *\r\n                FROM    sys.all_objects o\r\n                        INNER JOIN sys.all_columns c ON o.object_id = c.object_id\r\n                WHERE   o.name = &#39;dm_os_sys_info&#39;\r\n                        AND c.name = &#39;physical_memory_in_bytes&#39; ) \r\n        BEGIN\r\n            SET @StringToExecute = &#39;INSERT INTO #BlitzResults (CheckID, Priority, FindingsGroup, Finding, URL, Details)\r\n        SELECT  84 AS CheckID ,\r\n                250 AS Priority ,\r\n                &#39;&#39;Server Info&#39;&#39; AS FindingsGroup ,\r\n                &#39;&#39;Hardware&#39;&#39; AS Finding ,\r\n                &#39;&#39;&#39;&#39; AS URL ,\r\n                &#39;&#39;Logical processors: &#39;&#39; + CAST(cpu_count AS VARCHAR(50)) + &#39;&#39;. Physical memory: &#39;&#39; + CAST( CAST(ROUND((physical_memory_in_bytes \/ 1024.0 \/ 1024 \/ 1024), 1) AS INT) AS VARCHAR(50)) + &#39;&#39;GB.&#39;&#39;\r\n\t\tFROM sys.dm_os_sys_info&#39;;\r\n            EXECUTE(@StringToExecute);\r\n        END\r\n\r\n\r\n    INSERT  INTO #BlitzResults\r\n            ( CheckID ,\r\n              Priority ,\r\n              FindingsGroup ,\r\n              Finding ,\r\n              URL ,\r\n              Details\r\n            )\r\n            SELECT  85 AS CheckID ,\r\n                    250 AS Priority ,\r\n                    &#39;Server Info&#39; AS FindingsGroup ,\r\n                    &#39;SQL Server Service&#39; AS Finding ,\r\n                    &#39;&#39; AS URL ,\r\n                    N&#39;Version: &#39;\r\n                    + CAST(SERVERPROPERTY(&#39;productversion&#39;) AS NVARCHAR(100))\r\n                    + N&#39;. Patch Level: &#39;\r\n                    + CAST(SERVERPROPERTY(&#39;productlevel&#39;) AS NVARCHAR(100))\r\n                    + N&#39;. Edition: &#39;\r\n                    + CAST(SERVERPROPERTY(&#39;edition&#39;) AS VARCHAR(100))\r\n                    + N&#39;. AlwaysOn Enabled: &#39;\r\n                    + CAST(COALESCE(SERVERPROPERTY(&#39;IsHadrEnabled&#39;), 0) AS VARCHAR(100))\r\n                    + N&#39;. AlwaysOn Mgr Status: &#39;\r\n                    + CAST(COALESCE(SERVERPROPERTY(&#39;HadrManagerStatus&#39;), 0) AS VARCHAR(100))\r\n\t\r\n\r\n    INSERT  INTO #BlitzResults\r\n            ( CheckID ,\r\n              Priority ,\r\n              FindingsGroup ,\r\n              Finding ,\r\n              URL ,\r\n              Details\r\n            )\r\n    VALUES  ( -1 ,\r\n              255 ,\r\n              &#39;Thanks!&#39; ,\r\n              &#39;From Brent Ozar Unlimited&#39; ,\r\n              &#39;http:\/\/www.BrentOzar.com\/blitz\/&#39; ,\r\n              &#39;Thanks from the Brent Ozar Unlimited team.  We hope you found this tool useful, and if you need help relieving your SQL Server pains, email us at Help@BrentOzar.com.&#39;\r\n            );\r\n\r\n    SET @Version = 16;\r\n    INSERT  INTO #BlitzResults\r\n            ( CheckID ,\r\n              Priority ,\r\n              FindingsGroup ,\r\n              Finding ,\r\n              URL ,\r\n              Details\r\n\t\t            \r\n            )\r\n    VALUES  ( -1 ,\r\n              0 ,\r\n              &#39;sp_Blitz v16 Dec 13 2012&#39; ,\r\n              &#39;From Brent Ozar Unlimited&#39; ,\r\n              &#39;http:\/\/www.BrentOzar.com\/blitz\/&#39; ,\r\n              &#39;Thanks from the Brent Ozar Unlimited team.  We hope you found this tool useful, and if you need help relieving your SQL Server pains, email us at Help@BrentOzar.com.&#39;\r\n\t\t            \r\n            );\r\n\r\n\r\n\r\n    IF @OutputType = &#39;COUNT&#39; \r\n        BEGIN\r\n            SELECT  COUNT(*) AS Warnings\r\n            FROM    #BlitzResults\r\n        END\r\n    ELSE \r\n        BEGIN\r\n            SELECT  [Priority] ,\r\n                    [FindingsGroup] ,\r\n                    [Finding] ,\r\n                    [URL] ,\r\n                    [Details] ,\r\n                    [QueryPlan] ,\r\n                    [QueryPlanFiltered] ,\r\n                    CheckID\r\n            FROM    #BlitzResults\r\n            ORDER BY Priority ,\r\n                    FindingsGroup ,\r\n                    Finding ,\r\n                    Details;\r\n        END\r\n  \r\n    DROP TABLE #BlitzResults;\r\n\r\n\r\n    IF @OutputProcedureCache = 1 \r\n        SELECT TOP 20\r\n                total_worker_time \/ execution_count AS AvgCPU ,\r\n                total_worker_time AS TotalCPU ,\r\n                CAST(ROUND(100.00 * total_worker_time\r\n                           \/ ( SELECT   SUM(total_worker_time)\r\n                               FROM     sys.dm_exec_query_stats\r\n                             ), 2) AS MONEY) AS PercentCPU ,\r\n                total_elapsed_time \/ execution_count AS AvgDuration ,\r\n                total_elapsed_time AS TotalDuration ,\r\n                CAST(ROUND(100.00 * total_elapsed_time\r\n                           \/ ( SELECT   SUM(total_elapsed_time)\r\n                               FROM     sys.dm_exec_query_stats\r\n                             ), 2) AS MONEY) AS PercentDuration ,\r\n                total_logical_reads \/ execution_count AS AvgReads ,\r\n                total_logical_reads AS TotalReads ,\r\n                CAST(ROUND(100.00 * total_logical_reads\r\n                           \/ ( SELECT   SUM(total_logical_reads)\r\n                               FROM     sys.dm_exec_query_stats\r\n                             ), 2) AS MONEY) AS PercentReads ,\r\n                execution_count ,\r\n                CAST(ROUND(100.00 * execution_count\r\n                           \/ ( SELECT   SUM(execution_count)\r\n                               FROM     sys.dm_exec_query_stats\r\n                             ), 2) AS MONEY) AS PercentExecutions ,\r\n                CASE WHEN DATEDIFF(mi, creation_time, qs.last_execution_time) = 0\r\n                     THEN 0\r\n                     ELSE CAST(( 1.00 * execution_count \/ DATEDIFF(mi,\r\n                                                              creation_time,\r\n                                                              qs.last_execution_time) ) AS MONEY)\r\n                END AS executions_per_minute ,\r\n                qs.creation_time AS plan_creation_time ,\r\n                qs.last_execution_time ,\r\n                text ,\r\n                text_filtered ,\r\n                query_plan ,\r\n                query_plan_filtered ,\r\n                sql_handle ,\r\n                query_hash ,\r\n                plan_handle ,\r\n                query_plan_hash\r\n        FROM    #dm_exec_query_stats qs\r\n        ORDER BY CASE UPPER(@CheckProcedureCacheFilter)\r\n                   WHEN &#39;CPU&#39; THEN total_worker_time\r\n                   WHEN &#39;READS&#39; THEN total_logical_reads\r\n                   WHEN &#39;EXECCOUNT&#39; THEN execution_count\r\n                   WHEN &#39;DURATION&#39; THEN total_elapsed_time\r\n                   ELSE total_worker_time\r\n                 END DESC\r\n    SET NOCOUNT OFF;\r\nGO\r\n\r\n\/*\r\nSample execution call with the most common parameters:\r\nEXEC [dbo].[sp_Blitz]\r\n    @CheckUserDatabaseObjects = 1 ,\r\n    @CheckProcedureCache = 1 ,\r\n    @OutputType = &#39;TABLE&#39; ,\r\n    @OutputProcedureCache = 0 ,\r\n    @CheckProcedureCacheFilter = NULL,\r\n\t@CheckServerInfo = 0\r\n\r\n*\/\r\n<\/pre>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u68c0\u67e5\u662f\u5426\u5907\u4efd\uff0c\u5b89\u5168\u4e0a\u67e5\u8be2\u7ba1\u7406\u5458\u89d2\u8272\u7684\u662f\u54ea\u4e9b\u8d26\u53f7\uff0c\u7ef4\u62a4\u4e0aDBCC checkdb\u65f6\u95f4\u7b49\u3002 sp_Blitz US [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[36],"tags":[],"class_list":["post-2372","post","type-post","status-publish","format-standard","hentry","category-sql-server"],"blocksy_meta":[],"_links":{"self":[{"href":"https:\/\/enjoyasp.net\/index.php\/wp-json\/wp\/v2\/posts\/2372","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/enjoyasp.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/enjoyasp.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/enjoyasp.net\/index.php\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/enjoyasp.net\/index.php\/wp-json\/wp\/v2\/comments?post=2372"}],"version-history":[{"count":0,"href":"https:\/\/enjoyasp.net\/index.php\/wp-json\/wp\/v2\/posts\/2372\/revisions"}],"wp:attachment":[{"href":"https:\/\/enjoyasp.net\/index.php\/wp-json\/wp\/v2\/media?parent=2372"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/enjoyasp.net\/index.php\/wp-json\/wp\/v2\/categories?post=2372"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/enjoyasp.net\/index.php\/wp-json\/wp\/v2\/tags?post=2372"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}