zoukankan      html  css  js  c++  java
  • [SQL] SQL 日常检查脚本

       1 --sqlserver  日常检查脚本
       2 
       3 print '----------------------------'
       4 print ' 0.sqlserver all information  '
       5 print '----------------------------'
       6 print '                             '
       7 print '*********************************'
       8 
       9 --Step 1: Setting NULLs and quoted identifiers to ON and checking the version of SQL Server 
      10 GO
      11 SET ANSI_NULLS ON
      12 GO
      13 SET QUOTED_IDENTIFIER ON
      14 GO
      15 
      16 
      17 IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'prodver') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)                        
      18 drop table prodver
      19 create table prodver ([index] int, Name nvarchar(50),Internal_value int, Charcater_Value nvarchar(50))
      20 insert into prodver exec xp_msver 'ProductVersion'
      21 if (select substring(Charcater_Value,1,1)from prodver)!=8
      22 begin
      23 
      24                    
      25 -- Step 2: This code will be used if the instance is Not SQL Server 2000 
      26 
      27 
      28 Declare @image_path nvarchar(100)                        
      29 Declare @startup_type int                        
      30 Declare @startuptype nvarchar(100)                        
      31 Declare @start_username nvarchar(100)                        
      32 Declare @instance_name nvarchar(100)                        
      33 Declare @system_instance_name nvarchar(100)                        
      34 Declare @log_directory nvarchar(100)                        
      35 Declare @key nvarchar(1000)                        
      36 Declare @registry_key nvarchar(100)                        
      37 Declare @registry_key1 nvarchar(300)                        
      38 Declare @registry_key2 nvarchar(300)                        
      39 Declare @IpAddress nvarchar(20)                        
      40 Declare @domain nvarchar(50)                        
      41 Declare @cluster int                        
      42 Declare @instance_name1 nvarchar(100)                        
      43 -- Step 3: Reading registry keys for IP,Binaries,Startup type ,startup username, errorlogs location and domain.
      44 SET @instance_name = coalesce(convert(nvarchar(100), serverproperty('InstanceName')),'MSSQLSERVER');                        
      45 If @instance_name!='MSSQLSERVER'                        
      46 Set @instance_name=@instance_name                       
      47  
      48     Set @instance_name1= coalesce(convert(nvarchar(100), serverproperty('InstanceName')),'MSSQLSERVER');                        
      49 If @instance_name1!='MSSQLSERVER'                        
      50 Set @instance_name1='MSSQL$'+@instance_name1                        
      51 EXEC master.dbo.xp_regread N'HKEY_LOCAL_MACHINE', N'SoftwareMicrosoftMicrosoft SQL ServerInstance NamesSQL', @instance_name, @system_instance_name output;                        
      52                         
      53 Set @key=N'SYSTEMCurrentControlSetServices' +@instance_name1;                        
      54 SET @registry_key = N'SoftwareMicrosoftMicrosoft SQL Server' + @system_instance_name + 'MSSQLServerParameters';                        
      55 If @registry_key is NULL                        
      56 set @instance_name=coalesce(convert(nvarchar(100), serverproperty('InstanceName')),'MSSQLSERVER');                        
      57 EXEC master.dbo.xp_regread N'HKEY_LOCAL_MACHINE', N'SoftwareMicrosoftMicrosoft SQL ServerInstance NamesSQL', @instance_name, @system_instance_name output;                        
      58 
      59 
      60 SET @registry_key = N'SoftwareMicrosoftMicrosoft SQL Server' + @system_instance_name + 'MSSQLServerParameters';                        
      61 SET @registry_key1 = N'SoftwareMicrosoftMicrosoft SQL Server' + @system_instance_name + 'MSSQLServersupersocketnetlibTCPIP1';                        
      62 SET @registry_key2 = N'SYSTEMControlSet001ServicesTcpipParameters';                        
      63                         
      64 EXEC master.dbo.xp_regread 'HKEY_LOCAL_MACHINE',@key,@value_name='ImagePath',@value=@image_path OUTPUT                        
      65 EXEC master.dbo.xp_regread 'HKEY_LOCAL_MACHINE',@key,@value_name='Start',@value=@startup_type OUTPUT                        
      66 EXEC master.dbo.xp_regread 'HKEY_LOCAL_MACHINE',@key,@value_name='ObjectName',@value=@start_username OUTPUT                        
      67 EXEC master.dbo.xp_regread 'HKEY_LOCAL_MACHINE',@registry_key,@value_name='SQLArg1',@value=@log_directory OUTPUT                        
      68 EXEC master.dbo.xp_regread 'HKEY_LOCAL_MACHINE',@registry_key1,@value_name='IpAddress',@value=@IpAddress OUTPUT                        
      69 EXEC master.dbo.xp_regread 'HKEY_LOCAL_MACHINE',@registry_key2,@value_name='Domain',@value=@domain OUTPUT                        
      70                         
      71 Set @startuptype=
      72 (select 'Start Up Mode' =                        
      73 CASE                        
      74 WHEN @startup_type=2 then 'AUTOMATIC'                        
      75 WHEN @startup_type=3 then 'MANUAL'                        
      76 WHEN @startup_type=4 then 'Disabled'                        
      77 END)                        
      78                         
      79 --Step 4: Getting the cluster node names if the server is on cluster .else this value will be NULL.
      80 
      81 
      82 declare @Out nvarchar(400)                        
      83 SELECT @Out = COALESCE(@Out+'' ,'') + Nodename                        
      84 from sys.dm_os_cluster_nodes                        
      85                         
      86 -- Step 5: printing Server details 
      87                         
      88 SELECT                       
      89 @domain as 'Domain',                      
      90 serverproperty('ComputerNamePhysicalNetBIOS') as 'MachineName',                      
      91 CPU_COUNT as 'CPUCount',
      92 (physical_memory_in_bytes/1048576) as 'PhysicalMemoryMB',                      
      93 @Ipaddress as 'IP_Address',                      
      94 @instance_name1 as 'InstanceName',
      95 @image_path as 'BinariesPath',                      
      96 @log_directory as 'ErrorLogsLocation',                      
      97 @start_username as 'StartupUser',                      
      98 @Startuptype as 'StartupType',                      
      99 serverproperty('Productlevel') as 'ServicePack',                      
     100 serverproperty('edition') as 'Edition',                      
     101 serverproperty('productversion') as 'Version',                      
     102 serverproperty('collation') as 'Collation',                      
     103 serverproperty('Isclustered') as 'ISClustered',                      
     104 @out as 'ClusterNodes',                      
     105 serverproperty('IsFullTextInstalled') as 'ISFullText'                       
     106 From sys.dm_os_sys_info                         
     107                       
     108 
     109 
     110 -- Step 6: Printing database details 
     111 
     112 SELECT                       
     113 serverproperty ('ComputerNamePhysicalNetBIOS') as 'Machine'                      
     114 ,@instance_name1 as InstanceName,                      
     115 (SELECT 'file_type' =                      
     116 CASE                      
     117 WHEN s.groupid <> 0 THEN 'data'                      
     118 WHEN s.groupid = 0 THEN 'log'                      
     119 END) AS 'fileType'                      
     120 , d.dbid as 'DBID'                      
     121 , d.name AS 'DBName'                      
     122 , s.name AS 'LogicalFileName'                      
     123 , s.filename AS 'PhysicalFileName'                      
     124   , (s.size * 8 / 1024) AS 'FileSizeMB' -- file size in MB                      
     125   , d.cmptlevel as 'CompatibilityLevel'                      
     126   , DATABASEPROPERTYEX (d.name,'Recovery') as 'RecoveryModel'                      
     127   , DATABASEPROPERTYEX (d.name,'Status') as 'DatabaseStatus' ,                     
     128   --, d.is_published as 'Publisher'                      
     129   --, d.is_subscribed as 'Subscriber'                      
     130   --, d.is_distributor as 'Distributor' 
     131   (SELECT 'is_replication' =                      
     132 CASE                      
     133 WHEN d.category = 1 THEN 'Published'                      
     134 WHEN d.category = 2 THEN 'subscribed'                      
     135 WHEN d.category = 4 THEN 'Merge published'
     136 WHEN d.category = 8 THEN 'merge subscribed'
     137 Else 'NO replication'
     138 END) AS 'Is_replication'                      
     139   , m.mirroring_state as 'MirroringState'                      
     140 --INTO master.[dbo].[databasedetails]                      
     141 FROM                      
     142 sys.sysdatabases d INNER JOIN sys.sysaltfiles s                      
     143 ON                      
     144 d.dbid=s.dbid                      
     145 INNER JOIN sys.database_mirroring m                      
     146 ON                      
     147 d.dbid=m.database_id                      
     148 ORDER BY                      
     149 d.name                      
     150           
     151           
     152 --Step 7 :printing Backup details                       
     153 
     154 Select distinct                             
     155 b.machine_name as 'ServerName',                        
     156 b.server_name as 'InstanceName',                        
     157 b.database_name as 'DatabaseName',                            
     158 d.database_id 'DBID',                            
     159 CASE b.[type]                                  
     160 WHEN 'D' THEN 'Full'                                  
     161 WHEN 'I' THEN 'Differential'                                  
     162 WHEN 'L' THEN 'Transaction Log'                                  
     163 END as 'BackupType'                                 
     164 --INTO [dbo].[backupdetails]                        
     165 from sys.databases d inner join msdb.dbo.backupset b                            
     166 On b.database_name =d.name                        
     167 
     168 End
     169 else
     170 
     171 begin
     172 
     173 --Step 8: If the instance is 2000 this code will be used.
     174 
     175 declare @registry_key4 nvarchar(100)                        
     176 declare @Host_Name varchar(100)
     177 declare @CPU varchar(3)
     178 declare @nodes nvarchar(400)
     179 set @nodes =null /* We are not able to trap the node names for SQL Server 2000 so far*/
     180 declare @mirroring varchar(15)
     181 set @mirroring ='NOT APPLICABLE' /*Mirroring does not exist in SQL Server 2000*/
     182 Declare @reg_node1 varchar(100)
     183 Declare @reg_node2 varchar(100)
     184 Declare @reg_node3 varchar(100)
     185 Declare @reg_node4 varchar(100)
     186  
     187 SET @reg_node1 = N'ClusterNodes1'
     188 SET @reg_node2 = N'ClusterNodes2'
     189 SET @reg_node3 = N'ClusterNodes3'
     190 SET @reg_node4 = N'ClusterNodes4'
     191  
     192 Declare @image_path1 varchar(100)
     193 Declare @image_path2 varchar(100)
     194 Declare @image_path3 varchar(100)
     195 Declare @image_path4 varchar(100)
     196 
     197 set @image_path1=null
     198 set @image_path2=null
     199 set @image_path3=null
     200 set @image_path4=null
     201 
     202 
     203 Exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE',@reg_node1, @value_name='NodeName',@value=@image_path1 OUTPUT
     204 Exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE',@reg_node2, @value_name='NodeName',@value=@image_path2 OUTPUT
     205 Exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE',@reg_node3, @value_name='NodeName',@value=@image_path3 OUTPUT
     206 Exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE',@reg_node4, @value_name='NodeName',@value=@image_path4 OUTPUT
     207 
     208     IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'nodes') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)                        
     209 drop table nodes
     210 Create table nodes (name varchar (20))
     211  insert into nodes values (@image_path1)
     212  insert into nodes values (@image_path2)
     213  insert into nodes values (@image_path3)
     214  insert into nodes values (@image_path4)
     215  --declare @Out nvarchar(400)                        
     216  --declare @value nvarchar (20)
     217  SELECT @Out = COALESCE(@Out+'/' ,'') + name from nodes where name is not null
     218    
     219 -- Step 9: Reading registry keys for Number of CPUs,Binaries,Startup type ,startup username, errorlogs location and domain.
     220 
     221 SET @instance_name = coalesce(convert(nvarchar(100), serverproperty('InstanceName')),'MSSQLSERVER');
     222 IF @instance_name!='MSSQLSERVER'
     223 
     224 
     225 BEGIN
     226 set @system_instance_name=@instance_name
     227 set @instance_name='MSSQL$'+@instance_name
     228 
     229 
     230 SET @key=N'SYSTEMCurrentControlSetServices' +@instance_name;
     231 SET @registry_key = N'SoftwareMicrosoftMicrosoft SQL Server' + @system_instance_name + 'MSSQLServerParameters';
     232 SET @registry_key1 = N'SoftwareMicrosoftMicrosoft SQL Server' + @system_instance_name + 'Setup';
     233 SET @registry_key2 = N'SYSTEMCurrentControlSetServicesTcpipParameters';
     234 SET @registry_key4 = N'SYSTEMCurrentControlSetControlSession ManagerEnvironment'
     235 
     236 
     237 
     238 EXEC master.dbo.xp_regread 'HKEY_LOCAL_MACHINE',@registry_key1,@value_name='SQLPath',@value=@image_path OUTPUT
     239 EXEC master.dbo.xp_regread 'HKEY_LOCAL_MACHINE',@key,@value_name='Start',@value=@startup_type OUTPUT
     240 EXEC master.dbo.xp_regread 'HKEY_LOCAL_MACHINE',@key,@value_name='ObjectName',@value=@start_username OUTPUT
     241 EXEC master.dbo.xp_regread 'HKEY_LOCAL_MACHINE',@registry_key,@value_name='SQLArg1',@value=@log_directory OUTPUT
     242 EXEC master.dbo.xp_regread 'HKEY_LOCAL_MACHINE',@registry_key2,@value_name='Domain',@value=@domain OUTPUT
     243 EXEC master.dbo.xp_regread 'HKEY_LOCAL_MACHINE',@registry_key4,@value_name='NUMBER_OF_PROCESSORS',@value=@CPU OUTPUT                        
     244 
     245 END
     246 
     247 IF @instance_name='MSSQLSERVER'
     248 BEGIN
     249 SET @key=N'SYSTEMCurrentControlSetServices' +@instance_name;
     250 SET @registry_key = N'SoftwareMicrosoftMSSQLSERVERMSSQLServerParameters';
     251 SET @registry_key1 = N'SoftwareMicrosoftMSSQLSERVERSetup';
     252 SET @registry_key2 = N'SYSTEMCurrentControlSetServicesTcpipParameters';
     253 SET @registry_key4 = N'SYSTEMCurrentControlSetControlSession ManagerEnvironment'                                              
     254 
     255 EXEC master.dbo.xp_regread 'HKEY_LOCAL_MACHINE',@registry_key1,@value_name='SQLPath',@value=@image_path OUTPUT
     256 EXEC master.dbo.xp_regread 'HKEY_LOCAL_MACHINE',@key,@value_name='Start',@value=@startup_type OUTPUT
     257 EXEC master.dbo.xp_regread 'HKEY_LOCAL_MACHINE',@key,@value_name='ObjectName',@value=@start_username OUTPUT
     258 EXEC master.dbo.xp_regread 'HKEY_LOCAL_MACHINE',@registry_key,@value_name='SQLArg1',@value=@log_directory OUTPUT
     259 --EXEC master.dbo.xp_regread 'HKEY_LOCAL_MACHINE',@registry_key1,@value_name='IpAddress',@value=@IpAddress OUTPUT
     260 EXEC master.dbo.xp_regread 'HKEY_LOCAL_MACHINE',@registry_key2,@value_name='Domain',@value=@domain OUTPUT
     261 EXEC master.dbo.xp_regread 'HKEY_LOCAL_MACHINE',@registry_key4,@value_name='NUMBER_OF_PROCESSORS',@value=@CPU OUTPUT                        
     262 
     263 
     264 END
     265 set @startuptype= (select 'Start Up Mode' =
     266 CASE
     267 WHEN @startup_type=2 then 'AUTOMATIC'
     268 WHEN @startup_type=3 then 'MANUAL'
     269 WHEN @startup_type=4 then 'Disabled'
     270 END)
     271 
     272 
     273 --Step 10 : Using ipconfig and xp_msver to get physical memory and IP
     274 
     275 
     276 IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'tmp') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)                      
     277 DROP TABLE tmp
     278 create table tmp (server varchar(100)default cast( serverproperty ('Machinename') as varchar),[index] int, name sysname,internal_value int,character_value varchar(30))
     279 insert into tmp([index],name,internal_value,character_value) exec xp_msver PhysicalMemory
     280 
     281 IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'ipadd') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)                      
     282 drop table ipadd
     283 create table ipadd (server varchar(100)default cast( serverproperty ('Machinename') as varchar),IP varchar (100))
     284 insert into ipadd (IP)exec xp_cmdshell 'ipconfig'
     285 delete from ipadd where ip not like '%IP Address.%' or IP is null
     286 
     287 
     288 
     289 
     290 -- Step 11 : Getting the Server details 
     291 
     292 
     293 SELECT  top 1              
     294 @domain as 'Domain',                      
     295 serverproperty('Machinename') as 'MachineName',                      
     296 @CPU as 'CPUCount',
     297 cast (t.internal_value as bigint) as PhysicalMemoryMB,
     298 cast(substring ( I.IP , 44,41) as nvarchar(20))as IP_Address,
     299 serverproperty('Instancename') as 'InstanceName',                      
     300 @image_path as 'BinariesPath',                      
     301 @log_directory as 'ErrorLogsLocation',                      
     302 @start_username as 'StartupUser',                      
     303 @Startuptype as 'StartupType',                      
     304 serverproperty('Productlevel') as 'ServicePack',                      
     305 serverproperty('edition') as 'Edition',                      
     306 serverproperty('productversion') as 'Version',                      
     307 serverproperty('collation') as 'Collation',                      
     308 serverproperty('Isclustered') as 'ISClustered',                      
     309 @Out as 'ClustreNodes',
     310 serverproperty('IsFullTextInstalled') as 'ISFullText'                       
     311 From tmp t inner join IPAdd I
     312 on t.server = I.server
     313 
     314 
     315 --Step 12 : Getting the instance details 
     316 
     317 
     318 SELECT                       
     319 serverproperty ('Machinename') as 'Machine',                      
     320 serverproperty ('Instancename') as 'InstanceName',                      
     321 (SELECT 'file_type' =                      
     322 CASE                      
     323 WHEN s.groupid <> 0 THEN 'data'                      
     324 WHEN s.groupid = 0 THEN 'log'                      
     325 END) AS 'fileType'                      
     326 , d.dbid as 'DBID'                      
     327 , d.name AS 'DBName'                      
     328 , s.name AS 'LogicalFileName'                      
     329 , s.filename AS 'PhysicalFileName'                      
     330 , (s.size * 8 / 1024) AS 'FileSizeMB' -- file size in MB                      
     331 ,d.cmptlevel as 'CompatibilityLevel'                      
     332 , DATABASEPROPERTYEX (d.name,'Recovery') as 'RecoveryModel'                      
     333 , DATABASEPROPERTYEX (d.name,'Status') as 'DatabaseStatus' ,                     
     334 (SELECT 'is_replication' =                      
     335 CASE                      
     336 WHEN d.category = 1 THEN 'Published'                      
     337 WHEN d.category = 2 THEN 'subscribed'                      
     338 WHEN d.category = 4 THEN 'Merge published'
     339 WHEN d.category = 8 THEN 'merge subscribed'
     340 Else 'NO replication'
     341  END) AS 'Is_replication',
     342  @Mirroring as 'MirroringState'
     343 FROM                      
     344 sysdatabases d INNER JOIN sysaltfiles s                      
     345 ON                      
     346 d.dbid=s.dbid                      
     347 ORDER BY                      
     348 d.name                      
     349 
     350 
     351 --Step 13 : Getting backup details 
     352 
     353 
     354 Select distinct                             
     355 b.machine_name as 'ServerName',                        
     356 b.server_name as 'InstanceName',                        
     357 b.database_name as 'DatabaseName',                            
     358 d.dbid 'DBID',                            
     359 CASE b.[type]                                  
     360 WHEN 'D' THEN 'Full'                                  
     361 WHEN 'I' THEN 'Differential'                                  
     362 WHEN 'L' THEN 'Transaction Log'                                  
     363 END as 'BackupType'                                 
     364 from sysdatabases d inner join msdb.dbo.backupset b                            
     365 On b.database_name =d.name   
     366 
     367 
     368 --Step 14: Dropping the table we created for IP and Physical memory
     369 
     370 
     371 Drop Table TMP
     372 Drop Table IPADD
     373 drop table Nodes
     374 end
     375 go
     376 
     377 
     378 --Step 15 : Setting Nulls and Quoted identifier back to Off 
     379 
     380 SET ANSI_NULLS OFF
     381 GO
     382 SET QUOTED_IDENTIFIER OFF
     383 GO
     384 
     385 
     386 print '*********************************'
     387 print '     '
     388 print '     '
     389 print '     '
     390 print '     '
     391 print '----------------------------'
     392 print ' 1.sqlserver all information  '
     393 print '----------------------------'
     394 print '                             '
     395 print '*********************************'
     396 use master
     397 go
     398 print 'ths information about sqlserver '
     399 print '                                '
     400 print @@version
     401 go
     402 
     403 
     404 print '                                                   '
     405 print '                                                   '
     406 select cast(serverproperty('productversion') as varchar(30)) as 产品版本号,
     407 cast(serverproperty('productlevel') as varchar(30)) as sp_level,
     408 cast(serverproperty('edition') as varchar(30)) as 版本
     409 go
     410 print '                                                   '
     411 print '                                                   '
     412 print 'SQLSERVER max user connect         '
     413 print '                                   '
     414 print @@max_connections
     415 go
     416 print '*********************************'
     417 print '                             '
     418 print '                             '
     419 print '                             '
     420 print '----------------------------'
     421 print '2.查看服务器有哪些数据库'
     422 print '----------------------------'
     423 print '*********************************'
     424 print '                           '
     425 SELECT DatabaseName,DataSize,LogSize,DataSize+LogSize AS TotalSize, Collation, RecoveryType,AutoClose,AutoShrink
     426 FROM 
     427 (SELECT DBID,
     428 CASE Sum(size*8/1024) 
     429 WHEN 0 THEN 1 
     430 ELSE Sum(size*8/1024) 
     431 END AS DataSize
     432 FROM master..sysaltfiles
     433 WHERE GroupID <> 0
     434 GROUP BY DBID) q1
     435 INNER JOIN
     436 (SELECT DBID,
     437 CASE Sum(size*8/1024) 
     438 WHEN 0 THEN 1 
     439 ELSE Sum(size*8/1024)
     440 END AS LogSize
     441 FROM master..sysaltfiles
     442 WHERE GroupID = 0
     443 GROUP BY DBID) q2 
     444 ON q1.DBID = q2.DBID
     445 INNER JOIN
     446 (SELECT DBID, [name] AS DatabaseName,
     447 CONVERT(varchar(100),DATABASEPROPERTYEX([Name], 'Collation')) AS Collation,
     448 CONVERT(varchar(100),DATABASEPROPERTYEX([Name], 'Recovery')) AS RecoveryType,
     449 CASE CONVERT(varchar(10),DATABASEPROPERTYEX([Name], 'IsAutoClose'))
     450 WHEN 0 THEN '-'
     451 WHEN 1 THEN 'Yes'
     452 END  AS AutoClose,
     453   CASE CONVERT(varchar(10),DATABASEPROPERTYEX([Name], 'IsAutoShrink'))
     454 WHEN 0 THEN '-'
     455 WHEN 1 THEN 'Yes'
     456 END AS AutoShrink
     457 FROM master.dbo.sysdatabases) q3
     458 ON q1.DBID = q3.dbid
     459 ORDER BY DatabaseName 
     460 print '*********************************'
     461 print '                             '
     462 print '                             '
     463 print '                             '
     464 print '----------------------------'
     465 print '3.查看每个数据库具体结构信息'
     466 print'----------------------------'
     467 print '*********************************'
     468 print '                         '
     469 use master
     470 go
     471 declare @databasename varchar(50)
     472 declare cur01 cursor for
     473 select name from sys.databases
     474 open cur01
     475 fetch next from cur01 into @databasename
     476 while @@fetch_status=0
     477 begin
     478 begin
     479 select 'databasename:  '+ @databasename
     480 print '                     '
     481 exec sp_helpdb @databasename
     482 end
     483 fetch next from cur01 into @databasename;
     484 end;
     485 close cur01
     486 deallocate cur01
     487 go
     488 print '*********************************'
     489 print '                             '
     490 print '                             '
     491 print '                             '
     492 print '----------------------------'
     493 print '4.1所有数据库的index          '
     494 print '----------------------------'
     495 print '*********************************'
     496 use master
     497 go
     498 BEGIN
     499 CREATE TABLE #INDEXFRAGINFO
     500 (
     501 DatabaseName nvarchar(128),
     502 DatabaseID smallint,
     503 full_obj_name nvarchar(384),
     504 index_id INT, 
     505 [name] nvarchar(128), 
     506 index_type_desc nvarchar(60), 
     507 index_depth tinyint,
     508 index_level tinyint,
     509 [AVG Fragmentation] float, 
     510 fragment_count bigint,
     511 [Rank] bigint 
     512 )
     513 
     514 
     515 DECLARE @command VARCHAR(1000) 
     516 SELECT @command = 'Use [' + '?' + '] select ' + '''' + '?' + '''' + ' AS DatabaseName,
     517 DB_ID() AS DatabaseID,
     518 QUOTENAME(DB_NAME(i.database_id), '+ '''' + '"' + '''' +')+ N'+ '''' + '.' + '''' +'+ QUOTENAME(OBJECT_SCHEMA_NAME(i.object_id, i.database_id), '+ '''' + '"' + '''' +')+ N'+ '''' + '.' + '''' +'+ QUOTENAME(OBJECT_NAME(i.object_id, i.database_id), '+ '''' + '"' + '''' +') as full_obj_name, 
     519 i.index_id,
     520 o.name, 
     521 i.index_type_desc, 
     522 i.index_depth,
     523 i.index_level,
     524 i.avg_fragmentation_in_percent as [AVG Fragmentation], 
     525 i.fragment_count, 
     526 i.rnk as Rank
     527 from (
     528 select *, DENSE_RANK() OVER(PARTITION by database_id ORDER BY avg_fragmentation_in_percent DESC) as rnk
     529 from sys.dm_db_index_physical_stats(DB_ID(), default, default, default,'+ '''' + 'limited' + '''' +')
     530 where avg_fragmentation_in_percent >0 AND 
     531 INDEX_ID > 0 AND 
     532 Page_Count > 500 
     533 ) as i
     534 join sys.indexes o on o.object_id = i.object_id and o.index_id = i.index_id
     535 where i.rnk <= 25
     536 order by i.database_id, i.rnk;'
     537 
     538 
     539 INSERT #INDEXFRAGINFO EXEC sp_MSForEachDB @command 
     540 
     541 
     542 SELECT substring(databasename,0,30) as databasename ,ltrim(databaseID) as databaseID,substring(full_obj_name,0,50) as full_obj_name ,
     543 ltrim(index_id) as index_id, [name], 
     544 index_type_desc, ltrim(index_depth) as index_depth, ltrim(index_level) as index_level, ltrim([AVG Fragmentation]) as [AVG Fragmentation] ,
     545  ltrim(fragment_count) as fragment_count, ltrim([Rank]) as [Rank]
     546 FROM #INDEXFRAGINFO
     547 Where DatabaseID > 4
     548 order by [RANK];
     549 
     550 
     551 DROP TABLE #INDEXFRAGINFO
     552 
     553 
     554 END
     555 GO
     556 
     557 
     558 print '*********************************'
     559 print '                             '
     560 print '                             '
     561 print '                             '
     562 print '----------------------------'
     563 print '4.2找出很少使用的index         '
     564 print '----------------------------'
     565 print '*********************************'
     566 
     567 
     568 declare @dbid int
     569 select @dbid = db_id()
     570 select objectname=object_name(s.object_id), s.object_id
     571 , indexname=i.name, i.index_id
     572 , user_seeks AS 搜索次数, user_scans AS 扫描次数, 
     573 user_lookups AS 查找次数, user_updates 更新次数
     574 from sys.dm_db_index_usage_stats s,
     575 sys.indexes i
     576 where database_id = @dbid 
     577 and objectproperty(s.object_id,'IsUserTable') = 1
     578 and i.object_id = s.object_id
     579 and i.index_id = s.index_id
     580 order by (user_seeks + user_scans + user_lookups + user_updates) asc
     581 go
     582 
     583 print '                             '
     584 print '                             '
     585 print '                             '
     586 print '----------------------------'
     587 print '4.3所有数据库未使用的索引  '
     588 print '----------------------------'
     589 print '*********************************'
     590 
     591 
     592 SELECT TOP 1
     593         DatabaseName = DB_NAME()
     594         ,TableName = OBJECT_NAME(s.[object_id])
     595         ,IndexName = i.name
     596         ,user_updates    
     597         ,system_updates    
     598         -- Useful fields below:
     599         --, *
     600 INTO #TempUnusedIndexes
     601 FROM   sys.dm_db_index_usage_stats s 
     602 INNER JOIN sys.indexes i ON  s.[object_id] = i.[object_id] 
     603     AND s.index_id = i.index_id 
     604 WHERE  s.database_id = DB_ID()
     605     AND OBJECTPROPERTY(s.[object_id], 'IsMsShipped') = 0
     606     AND    user_seeks = 0
     607     AND user_scans = 0 
     608     AND user_lookups = 0
     609     AND s.[object_id] = -999  -- Dummy value to get table structure.
     610 ;
     611 
     612 
     613 -- Loop around all the databases on the server.
     614 EXEC sp_MSForEachDB    'USE [?]; 
     615 -- Table already exists.
     616 INSERT INTO #TempUnusedIndexes 
     617 SELECT TOP 10    
     618         DatabaseName = DB_NAME()
     619         ,TableName = OBJECT_NAME(s.[object_id])
     620         ,IndexName = i.name
     621         ,user_updates    
     622         ,system_updates    
     623 FROM   sys.dm_db_index_usage_stats s 
     624 INNER JOIN sys.indexes i ON  s.[object_id] = i.[object_id] 
     625     AND s.index_id = i.index_id 
     626 WHERE  s.database_id = DB_ID()
     627     AND OBJECTPROPERTY(s.[object_id], ''IsMsShipped'') = 0
     628     AND    user_seeks = 0
     629     AND user_scans = 0 
     630     AND user_lookups = 0
     631     AND i.name IS NOT NULL    -- Ignore HEAP indexes.
     632 ORDER BY user_updates DESC
     633 ;
     634 '
     635 
     636 
     637 -- Select records.
     638 SELECT TOP 10 * FROM #TempUnusedIndexes ORDER BY [user_updates] DESC
     639 -- Tidy up.
     640 DROP TABLE #TempUnusedIndexes
     641 
     642 
     643 print '                             '
     644 print '                             '
     645 print '                             '
     646 print '----------------------------'
     647 print '4.4所有数据库高开销的缺失索引  '
     648 print '----------------------------'
     649 print '*********************************'
     650 
     651 
     652 SELECT  TOP 10 
     653         [Total Cost]  = ROUND(avg_total_user_cost * avg_user_impact * (user_seeks + user_scans),0) 
     654         , avg_user_impact
     655         , TableName = statement
     656         , [EqualityUsage] = equality_columns 
     657         , [InequalityUsage] = inequality_columns
     658         , [Include Cloumns] = included_columns
     659 FROM        sys.dm_db_missing_index_groups g 
     660 INNER JOIN    sys.dm_db_missing_index_group_stats s 
     661        ON s.group_handle = g.index_group_handle 
     662 INNER JOIN    sys.dm_db_missing_index_details d 
     663        ON d.index_handle = g.index_handle
     664 ORDER BY [Total Cost] DESC;
     665 
     666 
     667 print '                             '
     668 print '                             '
     669 print '                             '
     670 print '----------------------------'
     671 print '5.查询数据库IO                 '
     672 print '----------------------------'
     673 print '*********************************'
     674 go
     675 WITH IOFORDATABASE AS
     676 (
     677 SELECT
     678  DB_NAME(VFS.database_id) AS DatabaseName
     679 ,CASE WHEN smf.type = 1 THEN 'LOG_FILE' ELSE 'DATA_FILE' END AS DatabaseFile_Type
     680 ,SUM(VFS.num_of_bytes_written) AS IO_Write
     681 ,SUM(VFS.num_of_bytes_read) AS IO_Read
     682 ,SUM(VFS.num_of_bytes_read + VFS.num_of_bytes_written) AS Total_IO
     683 ,SUM(VFS.io_stall) AS IO_STALL
     684 FROM sys.dm_io_virtual_file_stats(NULL, NULL) AS VFS
     685 JOIN sys.master_files AS smf
     686   ON VFS.database_id = smf.database_id
     687  AND VFS.file_id = smf.file_id
     688 GROUP BY 
     689  DB_NAME(VFS.database_id)
     690 ,smf.type
     691 )
     692 SELECT 
     693  ltrim(ROW_NUMBER() OVER(ORDER BY io_stall DESC)) AS RowNumber
     694 ,substring(DatabaseName,1,30) as DatabaseName
     695 
     696 
     697 ,DatabaseFile_Type
     698 ,ltrim(CAST(1.0 * IO_Read/ (1024 * 1024) AS DECIMAL(12, 2))) AS IO_Read_MB
     699 ,ltrim(CAST(1.0 * IO_Write/ (1024 * 1024) AS DECIMAL(12, 2))) AS IO_Write_MB
     700 ,ltrim(CAST(1. * Total_IO / (1024 * 1024) AS DECIMAL(12, 2))) AS IO_TOTAL_MB
     701 ,ltrim(CAST(IO_STALL / 1000. AS DECIMAL(12, 2))) AS IO_STALL_Seconds
     702 ,ltrim(CAST(100. * IO_STALL / SUM(IO_STALL) OVER() AS DECIMAL(10, 2))) AS IO_STALL_Pct
     703 FROM IOFORDATABASE
     704 ORDER BY IO_STALL_Seconds DESC;
     705 go
     706 print '*********************************'
     707 print '                             '
     708 print '                             '
     709 print '                             '
     710 print '----------------------------'
     711 print '6.查看数据库是否有死锁         '
     712 print '----------------------------'
     713 print '*********************************'
     714 use master
     715 go
     716 select ltrim(request_session_id) "会话ID",
     717 substring(resource_type,1,30) "被锁定的资源",
     718 resource_database_id "数据库",
     719 object_name(resource_associated_entity_id) "对象",
     720 request_mode "资源模式",
     721 request_status  "锁状态"
     722 from sys.dm_tran_locks
     723 go
     724 print '*********************************'
     725 print '                             '
     726 print '                             '
     727 print '                             '
     728 print '----------------------------'
     729 print '7.查看性能统计信息             '
     730 print'----------------------------'
     731 print '*********************************'
     732 use master
     733 go
     734 dbcc freeproccache
     735 go
     736 select t.text as "执行的文本", st.total_logical_reads  as "逻辑读取总次数",
     737 st.total_physical_reads  as "物理读取总次数",
     738 st.total_elapsed_time/1000000 as "占用的总时间",
     739 st.total_logical_writes  as "逻辑写入总次数"
     740 from sys.dm_exec_query_stats st
     741 cross apply sys.dm_exec_sql_text(st.sql_handle) t
     742 go
     743 print '*********************************'
     744 print '                             '
     745 print '                             '
     746 print '                             '
     747 print '----------------------------'
     748 print '8.临时数据库使用情况              '
     749 print '----------------------------'
     750 print '*********************************'
     751 use master
     752 go
     753 select ltrim(sum(user_object_reserved_page_count)*8) as user_objects_kb,
     754    ltrim(sum(internal_object_reserved_page_count)*8) as internal_objects_kb,
     755    ltrim(sum(version_store_reserved_page_count)*8) as version_store_kb,
     756    ltrim(sum(unallocated_extent_page_count)*8) as freespace_kb
     757 from sys.dm_db_file_space_usage
     758 where database_id = 2
     759 go
     760 print '*********************************'
     761 print '                             '
     762 print '                             '
     763 print '                             '
     764 print '----------------------------'
     765 print '9.查CPU瓶颈                    '
     766 print '----------------------------'
     767 print '*********************************'
     768 use master
     769 go
     770 Select ltrim(scheduler_id) as scheduler_id,
     771 ltrim(current_tasks_count) as current_tasks_count ,
     772 ltrim(runnable_tasks_count) as current_tasks_count
     773 from sys.dm_os_schedulers where scheduler_id<255 
     774 go
     775 print '*********************************'
     776 print '                             '
     777 print '                             '
     778 print '                             '
     779 print '------------------------------------------'
     780 print '10.当前被缓存的消耗CPU资源最多的批处理或者过程'
     781 print '------------------------------------------'
     782 print '*********************************'
     783 use master
     784 go
     785 Select top 50 ltrim(sum(total_worker_time)) as total_cpu_time,
     786 ltrim(sum(execution_count)) as total_execution_count, 
     787 ltrim(count(*)) as number_of_statements,plan_handle 
     788 from sys.dm_exec_query_stats qs group by 
     789 plan_handle order by sum(total_worker_time) desc 
     790 go
     791 print '*********************************'
     792 print '                             '
     793 print '                             '
     794 print '                             '
     795 print '--------------------------------------------'
     796 print '11.查询前100个缓存使用率高、最消耗缓存的sql语句'
     797 print '--------------------------------------------'
     798 print '*********************************'
     799 use master
     800 go
     801 select top 100 ltrim(usecounts) as usecounts,
     802 objtype,
     803 ltrim(p.size_in_bytes) as  size_in_bytes ,
     804 sql.text
     805 from sys.dm_exec_cached_plans  p
     806 outer apply
     807 sys.dm_exec_sql_text(p.plan_handle) sql
     808 order by usecounts desc
     809 go
     810 print '*********************************'
     811 print '                             '
     812 print '                             '
     813 print '                             '
     814 print '---------------------------------------------------------------'
     815 print '12.解数据库中的缓存情况,包括被使用的次数、缓存类型、占用的内存大小'
     816 print '---------------------------------------------------------------'
     817 print '*********************************'
     818 use master
     819 go
     820 SELECT usecounts=ltrim(usecounts), substring(cacheobjtype,1,30) as cacheobjtype, objtype,ltrim(size_in_bytes) as size_in_bytes, plan_handle
     821 FROM sys.dm_exec_cached_plans
     822 go
     823 print '*********************************'
     824 print '                             '
     825 print '                             '
     826 print '                             '
     827 print '----------------------------'
     828 print '13.计划缓存总数'
     829 print '----------------------------'
     830 print '*********************************'
     831 use master
     832 go
     833 Select ltrim(Count(*)) CNT,
     834 cast(sum(size_in_bytes)/1024/1024 as varchar(100))+' MB' TotalSize
     835 From sys.dm_exec_cached_plans
     836 go
     837 print '*********************************'
     838 print '                             '
     839 print '                             '
     840 print '                             '
     841 print '--------------------------------------'
     842 print '14.检查SQL Server的执行缓存和数据缓存占用'
     843 print '--------------------------------------'
     844 print '*********************************'
     845 use master
     846 go
     847 dbcc memorystatus 
     848 go
     849 print '*********************************'
     850 print '                             '
     851 print '                             '
     852 print '                             '
     853 print '-------------------------------------'
     854 print '15.所有数据库备份情况'
     855 print '-------------------------------------'
     856 print '*********************************'
     857 -- sql server 2000/2005 version
     858 
     859 
     860 use master
     861 go
     862 set nocount on
     863 go
     864 declare @counter smallint
     865 declare @dbname varchar(100)
     866 declare @db_bkpdate varchar(100)
     867 declare @status varchar(20)
     868 declare @svr_name varchar(100)
     869 declare @media_set_id varchar(20)
     870 declare @filepath varchar(1000)
     871 declare @filestatus int
     872 declare @fileavailable varchar(20)
     873 declare @backupsize float
     874 
     875 
     876 select @counter=max(dbid) from master..sysdatabases
     877 create table #backup_details 
     878 (
     879 servername varchar(100),
     880 databasename varchar(100),
     881 bkpdate varchar(20) null,
     882 backupsize_in_mb varchar(20),
     883 status varchar(20),
     884 filepath varchar(1000),
     885 fileavailable varchar(200)
     886 )
     887 select @svr_name = cast(serverproperty('servername')as sysname)
     888 while @counter > 0
     889 begin
     890 /* need to re-initialize all variables*/
     891 select @dbname = null , @db_bkpdate = null ,
     892 @media_set_id = null , @backupsize = null ,
     893 @filepath = null , @filestatus = null , 
     894 @fileavailable = null , @status = null , @backupsize = null
     895 
     896 
     897 select @dbname = name from master..sysdatabases where dbid = @counter
     898 select @db_bkpdate = max(backup_start_date) from msdb..backupset where database_name = @dbname and type='d'
     899 select @media_set_id = media_set_id from msdb..backupset where backup_start_date = ( select max(backup_start_date) from msdb..backupset where database_name = @dbname and type='d')
     900 select @backupsize = backup_size from msdb..backupset where backup_start_date = ( select max(backup_start_date) from msdb..backupset where database_name = @dbname and type='d')
     901 select @filepath = physical_device_name from msdb..backupmediafamily where media_set_id = @media_set_id
     902 exec master..xp_fileexist @filepath , @filestatus out
     903 if @filestatus = 1
     904 set @fileavailable = 'available'
     905 else
     906 set @fileavailable = 'not available'
     907 if (datediff(day,@db_bkpdate,getdate()) > 7)
     908 set @status = 'warning'
     909 else
     910 set @status = 'healthy'
     911 set @backupsize = (@backupsize/1024)/1024
     912 insert into #backup_details select @svr_name,@dbname,@db_bkpdate,@backupsize,@status,@filepath,@fileavailable
     913 update #backup_details
     914 set status = 'warning' where bkpdate is null
     915 set @counter = @counter - 1
     916 end
     917 select substring(servername,0,20) AS [服务器名],
     918 substring(databasename,0,20) AS [数据库名], 
     919 rtrim(ltrim(bkpdate)) AS  [备份日期],
     920 rtrim(ltrim(backupsize_in_mb)) AS [备份大小],
     921 rtrim(ltrim([status])) AS [备份状态],
     922 substring(rtrim(ltrim(filepath)),0,40) AS  [备份文件路径],
     923 rtrim(fileavailable) AS  [备份文件是否可用]
     924  from #backup_details where databasename not in ('tempdb','northwind','pubs')
     925 drop table #backup_details
     926 set nocount off
     927 go
     928 
     929 
     930 print '*********************************'
     931 print '                             '
     932 print '                             '
     933 print '                             '
     934 print '-------------------------------------'
     935 print '16.监控CPU瓶颈'
     936 print '-------------------------------------'
     937 print '*********************************'
     938 use master
     939 go
     940 
     941 
     942 print '-------------------------------------'
     943 print '16.1当前缓存的哪些批处理或过程占用了大部分 CPU 资源'
     944 print '-------------------------------------'
     945 SELECT TOP 50 
     946       ltrim(SUM(qs.total_worker_time)) AS total_cpu_time, 
     947       ltrim(SUM(qs.execution_count)) AS total_execution_count,
     948       ltrim(COUNT(*)) AS  number_of_statements, 
     949       qs.sql_handle 
     950 FROM sys.dm_exec_query_stats AS qs
     951 GROUP BY qs.sql_handle
     952 ORDER BY SUM(qs.total_worker_time) DESC
     953 go
     954 
     955 
     956 
     957 
     958 print '                             '
     959 print '                             '
     960 print '-------------------------------------------------------'
     961 print '16.2查询显示缓存计划所占用的 CPU 总使用率(带 SQL 文本)'
     962 print '-------------------------------------------------------'
     963 SELECT 
     964       total_cpu_time, 
     965       total_execution_count,
     966       number_of_statements,
     967       s2.text
     968       --(SELECT SUBSTRING(s2.text, statement_start_offset / 2, ((CASE WHEN statement_end_offset = -1 THEN (LEN(CONVERT(NVARCHAR(MAX), s2.text)) * 2) ELSE statement_end_offset END) - statement_start_offset) / 2) ) AS query_text
     969 FROM 
     970       (SELECT TOP 50 
     971             SUM(qs.total_worker_time) AS total_cpu_time, 
     972             SUM(qs.execution_count) AS total_execution_count,
     973             COUNT(*) AS  number_of_statements, 
     974             qs.sql_handle --,
     975             --MIN(statement_start_offset) AS statement_start_offset, 
     976             --MAX(statement_end_offset) AS statement_end_offset
     977       FROM 
     978             sys.dm_exec_query_stats AS qs
     979       GROUP BY qs.sql_handle
     980       ORDER BY SUM(qs.total_worker_time) DESC) AS stats
     981       CROSS APPLY sys.dm_exec_sql_text(stats.sql_handle) AS s2
     982 go
     983 
     984 
     985 print '                             '
     986 print '                             '
     987 print '-------------------------------------------------------'
     988 print '16.3显示 CPU 平均占用率最高的前 50 个 SQL 语句'
     989 print '-------------------------------------------------------'
     990 
     991 
     992 SELECT TOP 50
     993 total_worker_time/execution_count AS [Avg CPU Time],
     994 (SELECT SUBSTRING(text,statement_start_offset/2,(CASE WHEN statement_end_offset = -1 then LEN(CONVERT(nvarchar(max), text)) * 2 ELSE statement_end_offset end -statement_start_offset)/2) FROM sys.dm_exec_sql_text(sql_handle)) AS query_text, *
     995 FROM sys.dm_exec_query_stats 
     996 ORDER BY [Avg CPU Time] DESC
     997 go
     998 
     999 
    1000 print '                             '
    1001 print '                             '
    1002 print '-------------------------------------------------------'
    1003 print '16.4找出过多编译/重新编译的 DMV 查询'
    1004 print '-------------------------------------------------------'
    1005 select * from sys.dm_exec_query_optimizer_info
    1006 where 
    1007       counter = 'optimizations'
    1008       or counter = 'elapsed time'
    1009 go
    1010 
    1011 
    1012 
    1013 
    1014 print '                             '
    1015 print '                             '
    1016 print '-------------------------------------------------------'
    1017 print '16.5显示已重新编译的前 25 个存储过程'
    1018 print '-------------------------------------------------------'
    1019 select top 25
    1020       sql_text.text,
    1021       sql_handle,
    1022       plan_generation_num,
    1023       execution_count,
    1024       dbid,
    1025       objectid 
    1026 from sys.dm_exec_query_stats a
    1027       cross apply sys.dm_exec_sql_text(sql_handle) as sql_text
    1028 where plan_generation_num > 1
    1029 order by plan_generation_num desc
    1030 go
    1031 
    1032 
    1033 
    1034 
    1035 print '                             '
    1036 print '                             '
    1037 print '-------------------------------------------------------'
    1038 print '16.6哪个查询占用了最多的 CPU 累计使用率'
    1039 print '-------------------------------------------------------'
    1040 
    1041 
    1042 SELECT 
    1043     ltrim(highest_cpu_queries.plan_handle) as plan_handle, 
    1044     ltrim(highest_cpu_queries.total_worker_time) as total_worker_time,
    1045     q.dbid,
    1046     ltrim(q.objectid),
    1047     q.number,
    1048     q.encrypted,
    1049     q.[text]
    1050 from 
    1051     (select top 50 
    1052         qs.plan_handle, 
    1053         qs.total_worker_time
    1054     from 
    1055         sys.dm_exec_query_stats qs
    1056     order by qs.total_worker_time desc) as highest_cpu_queries
    1057     cross apply sys.dm_exec_sql_text(plan_handle) as q
    1058 order by highest_cpu_queries.total_worker_time desc
    1059 go
    1060 
    1061 
    1062 
    1063 
    1064 print '                             '
    1065 print '                             '
    1066 print '-------------------------------------------------------'
    1067 print '16.7可能占用大量 CPU 使用率的运算符
    1068 print '-------------------------------------------------------'
    1069 
    1070 
    1071 select *
    1072 from 
    1073       sys.dm_exec_cached_plans
    1074       cross apply sys.dm_exec_query_plan(plan_handle)
    1075 where 
    1076       cast(query_plan as nvarchar(max)) like '%Sort%'
    1077       or cast(query_plan as nvarchar(max)) like '%Hash Match%'
    1078 go
    1079 
    1080 
    1081 
    1082 
    1083 print '                             '
    1084 print '                             '
    1085 print '-------------------------------------------------------'
    1086 print '17.内存瓶颈'
    1087 print '-------------------------------------------------------'
    1088 print '                             '
    1089 print '                             '
    1090 print '-------------------------------------------------------'
    1091 print '17.1确保已启用 SQL Server 中的高级选项'
    1092 print '-------------------------------------------------------'
    1093 use master
    1094 go
    1095 sp_configure 'show advanced options'
    1096 go
    1097 sp_configure 'show advanced options', 1
    1098 go
    1099 reconfigure
    1100 go
    1101 print '                             '
    1102 print '                             '
    1103 print '-------------------------------------------------------'
    1104 print '17.2运行以下查询以检查内存相关配置选项'
    1105 print '-------------------------------------------------------'
    1106 
    1107 go
    1108 sp_configure 'awe_enabled'
    1109 go
    1110 sp_configure 'min server memory'
    1111 go
    1112 sp_configure 'max server memory'
    1113 go
    1114 sp_configure 'min memory per query'
    1115 go
    1116 sp_configure 'query wait'
    1117 go
    1118 
    1119 
    1120 print '                             '
    1121 print '                             '
    1122 print '-------------------------------------------------------'
    1123 print '17.3查看 CPU、计划程序内存和缓冲池信息'
    1124 print '-------------------------------------------------------'
    1125 
    1126 
    1127 select 
    1128 ltrim(cpu_count) as cpu_count,
    1129 ltrim(hyperthread_ratio) as hyperthread_ratio,
    1130 ltrim(scheduler_count) as scheduler_count,
    1131 ltrim(physical_memory_in_bytes / 1024 / 1024) as physical_memory_mb,
    1132 ltrim(virtual_memory_in_bytes / 1024 / 1024) as virtual_memory_mb,
    1133 ltrim(bpool_committed * 8 / 1024) as bpool_committed_mb,
    1134 ltrim(bpool_commit_target * 8 / 1024) as bpool_target_mb,
    1135 ltrim(bpool_visible * 8 / 1024) as bpool_visible_mb
    1136 from sys.dm_os_sys_info
    1137 go
    1138 
    1139 
    1140 print '                             '
    1141 print '                             '
    1142 print '-------------------------------------------------------'
    1143 print '17.4I/O 瓶颈'
    1144 print '-------------------------------------------------------'
    1145 select wait_type, ltrim(waiting_tasks_count) as waiting_tasks_count , ltrim(wait_time_ms) as wait_time_ms , 
    1146 ltrim(signal_wait_time_ms) as signal_wait_time_ms, ltrim(wait_time_ms / waiting_tasks_count) as avgtime
    1147 from sys.dm_os_wait_stats  
    1148 where wait_type like 'PAGEIOLATCH%'  and waiting_tasks_count > 0
    1149 order by wait_type
    1150 go
    1151 
    1152 
    1153 print '                             '
    1154 print '                             '
    1155 print '-------------------------------------------------------'
    1156 print '17.5查找当前挂起的 I/O 请求'
    1157 print '-------------------------------------------------------'
    1158 
    1159 
    1160 print '正常情况下不返回任何值'
    1161 
    1162 
    1163 select 
    1164     database_id, 
    1165     file_id, 
    1166     io_stall,
    1167     io_pending_ms_ticks,
    1168     scheduler_address 
    1169 from  sys.dm_io_virtual_file_stats(NULL, NULL)t1,
    1170         sys.dm_io_pending_io_requests as t2
    1171 where t1.file_handle = t2.io_handle
    1172 go
    1173 
    1174 
    1175 
    1176 
    1177 print '                             '
    1178 print '                             '
    1179 print '-------------------------------------------------------'
    1180 print '17.6查看IO相关查询读取次数'
    1181 print '-------------------------------------------------------'
    1182 
    1183 
    1184 select top 5 (total_logical_reads/execution_count) as avg_logical_reads,
    1185                    (total_logical_writes/execution_count) as avg_logical_writes,
    1186            (total_physical_reads/execution_count) as avg_physical_reads,
    1187            Execution_count, statement_start_offset, p.query_plan, q.text
    1188 from sys.dm_exec_query_stats
    1189       cross apply sys.dm_exec_query_plan(plan_handle) p
    1190       cross apply sys.dm_exec_sql_text(plan_handle) as q
    1191 order by (total_logical_reads + total_logical_writes)/execution_count Desc
    1192 go
    1193 
    1194 
    1195 
    1196 
    1197 print '                             '
    1198 print '                             '
    1199 print '-------------------------------------------------------'
    1200 print '17.7查找哪些批处理/请求生成的 I/O 最多'
    1201 print '-------------------------------------------------------'
    1202 
    1203 
    1204 select top 5 
    1205     ltrim(total_logical_reads/execution_count) as avg_logical_reads,
    1206     ltrim(total_logical_writes/execution_count) as avg_logical_writes,
    1207     ltrim(total_physical_reads/execution_count) as avg_phys_reads,
    1208      ltrim(Execution_count) as Execution_count, 
    1209     ltrim(statement_start_offset) as stmt_start_offset, 
    1210     sql_handle, 
    1211     plan_handle
    1212 from sys.dm_exec_query_stats  
    1213 order by  (total_logical_reads + total_logical_writes) Desc
    1214 go
    1215 
    1216 
    1217 
    1218 print '                             '
    1219 print '                             '
    1220 print '-------------------------------------------------------'
    1221 print '18.阻塞'
    1222 print '-------------------------------------------------------'
    1223 
    1224 
    1225 print '                             '
    1226 print '                             '
    1227 print '-------------------------------------------------------'
    1228 print '18.1 确定阻塞的会话'
    1229 print '-------------------------------------------------------'
    1230 use master
    1231 go
    1232 select blocking_session_id, wait_duration_ms, session_id from 
    1233 sys.dm_os_waiting_tasks
    1234 where blocking_session_id is not null
    1235 go
    1236 
    1237 
    1238 print '                             '
    1239 print '                             '
    1240 print '-------------------------------------------------------'
    1241 print '18.2 SQL 等待分析和前 10 个等待的资源'
    1242 print '-------------------------------------------------------'
    1243 select top 10 ltrim(wait_type) as wait_type, ltrim(waiting_tasks_count) as waiting_tasks_count,
    1244  ltrim(wait_time_ms) as  wait_time_ms,   
    1245  ltrim(max_wait_time_ms) as  max_wait_time_ms,
    1246  ltrim(signal_wait_time_ms) as signal_wait_time_ms
    1247 from sys.dm_os_wait_stats
    1248 --where wait_type not in ('CLR_SEMAPHORE','LAZYWRITER_SLEEP','RESOURCE_QUEUE','SLEEP_TASK','SLEEP_SYSTEMTASK','WAITFOR')
    1249 order by wait_time_ms desc
    1250 go
    1251 
    1252 
    1253 
    1254 print '                             '
    1255 print '                             '
    1256 print '-------------------------------------------------------'
    1257 print '19. 查看各个数据库性能负载'
    1258 print '-------------------------------------------------------'
    1259 
    1260 
    1261 SELECT
    1262 substring (a.name,0,12) as [数据库名],
    1263 [连接数] = (SELECT COUNT(*)
    1264 FROM master..sysprocesses b
    1265 WHERE
    1266 a.dbid = b.dbid),
    1267 
    1268 
    1269 [阻塞进程] = (SELECT COUNT(*)
    1270 FROM master..sysprocesses b
    1271 WHERE
    1272 a.dbid = b.dbid AND
    1273 blocked <> 0),
    1274 
    1275 
    1276 [总内存] = ISNULL((SELECT SUM(memusage)
    1277 FROM
    1278 master..sysprocesses b
    1279 WHERE
    1280 a.dbid = b.dbid),0),
    1281 
    1282 
    1283 [总IO] = ISNULL((SELECT SUM(physical_io)
    1284 FROM
    1285 master..sysprocesses b
    1286 WHERE
    1287 a.dbid = b.dbid),0),
    1288 
    1289 
    1290 [总CPU] = ISNULL((SELECT SUM(cpu)
    1291 FROM
    1292 master..sysprocesses b
    1293 WHERE
    1294 a.dbid = b.dbid),0),
    1295 
    1296 
    1297 [总等待时间] = ISNULL((SELECT SUM(waittime)
    1298 FROM
    1299 master..sysprocesses b
    1300 WHERE
    1301 a.dbid = b.dbid),0),
    1302 
    1303 
    1304 [SELECTs] = (SELECT COUNT(*) 
    1305 FROM master..sysprocesses b
    1306 WHERE 
    1307 a.dbid = b.dbid AND
    1308 b.cmd LIKE '%SELECT%'),
    1309 
    1310 
    1311 [DELETEs] = (SELECT COUNT(*) 
    1312 FROM master..sysprocesses b
    1313 WHERE 
    1314 a.dbid = b.dbid AND
    1315 b.cmd LIKE '%DELETE%'),
    1316 
    1317 
    1318 [DBCC Commands] = ISNULL((SELECT COUNT(*)
    1319 FROM
    1320 master..sysprocesses b
    1321 WHERE
    1322 a.dbid = b.dbid and
    1323 b.cmd like '%DBCC%'),0),
    1324 
    1325 
    1326 [BCP Running] = ISNULL((SELECT COUNT(*)
    1327 FROM
    1328 master..sysprocesses b
    1329 WHERE
    1330 a.dbid = b.dbid and
    1331 b.cmd like '%BCP%'),0),
    1332 
    1333 
    1334 [Backups Running] = ISNULL((SELECT COUNT(*)
    1335 FROM
    1336 master..sysprocesses b
    1337 WHERE
    1338 a.dbid = b.dbid and
    1339 b.cmd LIKE '%BACKUP%'),0)
    1340 
    1341 
    1342 FROM master.dbo.sysdatabases a WITH (nolock)
    1343 WHERE 
    1344 DatabasePropertyEx(a.name,'Status') = 'ONLINE'
    1345 ORDER BY [数据库名]
    1346 go
    1347 
    1348 
    1349 
    1350 print '                             '
    1351 print '                             '
    1352 print '-------------------------------------------------------'
    1353 print '20. 查看所有数据库大小、恢复模式等信息'
    1354 print '-------------------------------------------------------'
    1355 SELECT substring (DatabaseName,0,12) as DatabaseName,DataSize,LogSize,DataSize+LogSize AS TotalSize, Collation, RecoveryType,AutoClose,AutoShrink
    1356 FROM 
    1357 (SELECT DBID,
    1358 CASE Sum(size*8/1024) 
    1359 WHEN 0 THEN 1 
    1360 ELSE Sum(size*8/1024) 
    1361 END AS DataSize
    1362 FROM master..sysaltfiles
    1363 WHERE GroupID <> 0
    1364 GROUP BY DBID) q1
    1365 INNER JOIN
    1366 (SELECT DBID,
    1367 CASE Sum(size*8/1024) 
    1368 WHEN 0 THEN 1 
    1369 ELSE Sum(size*8/1024)
    1370 END AS LogSize
    1371 FROM master..sysaltfiles
    1372 WHERE GroupID = 0
    1373 GROUP BY DBID) q2 
    1374 ON q1.DBID = q2.DBID
    1375 INNER JOIN
    1376 (SELECT DBID, [name] AS DatabaseName,
    1377 CONVERT(varchar(100),DATABASEPROPERTYEX([Name], 'Collation')) AS Collation,
    1378 CONVERT(varchar(100),DATABASEPROPERTYEX([Name], 'Recovery')) AS RecoveryType,
    1379 CASE CONVERT(varchar(10),DATABASEPROPERTYEX([Name], 'IsAutoClose'))
    1380 WHEN 0 THEN '-'
    1381 WHEN 1 THEN 'Yes'
    1382 END  AS AutoClose,
    1383   CASE CONVERT(varchar(10),DATABASEPROPERTYEX([Name], 'IsAutoShrink'))
    1384 WHEN 0 THEN '-'
    1385 WHEN 1 THEN 'Yes'
    1386 END AS AutoShrink
    1387 FROM master.dbo.sysdatabases) q3
    1388 ON q1.DBID = q3.dbid
    1389 ORDER BY DatabaseName 
    1390 
    1391 
    1392 print '                             '
    1393 print '                             '
    1394 print '-------------------------------------------------------'
    1395 print '21. 查看数据库群集信息'
    1396 print '-------------------------------------------------------'
    1397 
    1398 
    1399 PRINT ' **** Cluster Information ****'
    1400 PRINT ' '
    1401 PRINT ' The following is information on the cluster you are connected'
    1402 PRINT ' '
    1403 PRINT '... Name of all nodes used and are part of this failover cluster'
    1404 SELECT * FROM sys.dm_os_cluster_nodes 
    1405 PRINT ' '
    1406 PRINT '... Node which is the active '
    1407 SELECT SERVERPROPERTY('ComputerNamePhysicalNetBIOS') 
    1408 PRINT ' '
    1409 PRINT '... Drive letters that are part of the resourse group which contain the data and log files'
    1410 SELECT * FROM sys.dm_io_cluster_shared_drives
    1411 go
    1412 
    1413 
    1414 
    1415 
    1416 print '                             '
    1417 print '                             '
    1418 print '-------------------------------------------------------'
    1419 print '22. 当前数据库服务器登录用户、会话连接数、认证类型'
    1420 print '-------------------------------------------------------'
    1421 
    1422 
    1423 SELECT '认证方式'=(
    1424 CASE 
    1425 WHEN nt_user_name IS not null THEN 'windows认证' 
    1426 ELSE 'SQL认证' 
    1427 END),
    1428 login_name AS '登录名', ISNULL(nt_user_name,'-') AS 'Windows登录名',
    1429 COUNT(session_id) AS '会话数'
    1430 FROM sys.dm_exec_sessions
    1431 GROUP BY login_name,nt_user_name
    1432 go
    1433 
    1434 
    1435 
    1436 
    1437 print '                             '
    1438 print '                             '
    1439 print '-------------------------------------------------------'
    1440 print '23. 查看执行效率低的语句'
    1441 print '-------------------------------------------------------'
    1442 
    1443 
    1444 
    1445 SELECT creation_time  N'语句编译时间'
    1446         ,last_execution_time  N'上次执行时间'
    1447         ,total_physical_reads N'物理读取总次数'
    1448         ,total_logical_reads/execution_count N'每次逻辑读次数'
    1449         ,total_logical_reads  N'逻辑读取总次数'
    1450         ,total_logical_writes N'逻辑写入总次数'
    1451         ,execution_count  N'执行次数'
    1452         ,total_worker_time/1000 N'所用的CPU总时间ms'
    1453         ,total_elapsed_time/1000  N'总花费时间ms'
    1454         ,(total_elapsed_time / execution_count)/1000  N'平均时间ms'
    1455         ,SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,
    1456          ((CASE statement_end_offset
    1457           WHEN -1 THEN DATALENGTH(st.text)
    1458           ELSE qs.statement_end_offset END
    1459             - qs.statement_start_offset)/2) + 1) N'执行语句'
    1460 FROM sys.dm_exec_query_stats AS qs
    1461 CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st
    1462 where SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,
    1463          ((CASE statement_end_offset
    1464           WHEN -1 THEN DATALENGTH(st.text)
    1465           ELSE qs.statement_end_offset END
    1466             - qs.statement_start_offset)/2) + 1) not like '%fetch%'
    1467 ORDER BY  total_elapsed_time / execution_count DESC;
    1468 
    1469 
    1470 
    1471 print '                             '
    1472 print '                             '
    1473 print '-------------------------------------------------------'
    1474 print '24. 所有数据库高开销的缺失索引'
    1475 print '-------------------------------------------------------'
    1476 
    1477 
    1478 SELECT  TOP 100 
    1479         [Total Cost]  = ROUND(avg_total_user_cost * avg_user_impact * (user_seeks + user_scans),0) 
    1480         , avg_user_impact
    1481         , TableName = statement
    1482         , [EqualityUsage] = equality_columns 
    1483         , [InequalityUsage] = inequality_columns
    1484         , [Include Cloumns] = included_columns
    1485 FROM        sys.dm_db_missing_index_groups g 
    1486 INNER JOIN    sys.dm_db_missing_index_group_stats s 
    1487        ON s.group_handle = g.index_group_handle 
    1488 INNER JOIN    sys.dm_db_missing_index_details d 
    1489        ON d.index_handle = g.index_handle
    1490 ORDER BY [Total Cost] DESC;
    1491 
    1492 
    1493 print '                             '
    1494 print '                             '
    1495 print '-------------------------------------------------------'
    1496 print '25. 查看buffer cache命中率'
    1497 print '-------------------------------------------------------'
    1498 
    1499 
    1500  SELECT  
    1501 (CAST(SUM(CASE LTRIM(RTRIM(counter_name))    
    1502 WHEN 'Buffer cache hit ratio'    
    1503 THEN CAST(cntr_value AS INTEGER) ELSE NULL END) AS FLOAT) /   
    1504 CAST(SUM(CASE LTRIM(RTRIM(counter_name))    
    1505 WHEN 'Buffer cache hit ratio base' THEN CAST(cntr_value AS INTEGER)ELSE NULL END) AS FLOAT)) * 100   
    1506 AS BufferCacheHitRatio   
    1507 FROM sys.dm_os_performance_counters    
    1508 WHERE LTRIM(RTRIM([object_name])) LIKE '%:Buffer Manager' AND    
    1509  [counter_name] LIKE 'Buffer Cache Hit Ratio%'  
    1510 go
    1511 
    1512 
    1513 print '                             '
    1514 print '                             '
    1515 print '-------------------------------------------------------'
    1516 print '26. 查看job执行情况'
    1517 print '-------------------------------------------------------'
    1518 
    1519 
    1520 
    1521 SELECT 作业名     = sj.name 
    1522       ,开始时间 = sja.start_execution_date 
    1523       ,结束时间   = sja.stop_execution_date 
    1524       ,状态    = CASE  
    1525                    WHEN ISNULL(sjh.run_status,-1) = -1 AND sja.start_execution_date IS NULL AND sja.stop_execution_date IS NULL THEN 'Idle' 
    1526                    WHEN ISNULL(sjh.run_status,-1) = -1 AND sja.start_execution_date IS NOT NULL AND sja.stop_execution_date IS NULL THEN 'Running' 
    1527                    WHEN ISNULL(sjh.run_status,-1) =0  THEN 'Failed' 
    1528                    WHEN ISNULL(sjh.run_status,-1) =1  THEN 'Succeeded' 
    1529                    WHEN ISNULL(sjh.run_status,-1) =2  THEN 'Retry' 
    1530                    WHEN ISNULL(sjh.run_status,-1) =3  THEN 'Canceled' 
    1531                    END 
    1532   FROM MSDB.DBO.sysjobs sj 
    1533   JOIN MSDB.DBO.sysjobactivity sja 
    1534     ON sj.job_id = sja.job_id  
    1535   JOIN (SELECT MaxSessionid = MAX(Session_id) FROM MSDB.DBO.syssessions) ss 
    1536     ON ss.MaxSessionid = sja.session_id 
    1537 LEFT JOIN MSDB.DBO.sysjobhistory sjh 
    1538     ON sjh.instance_id = sja.job_history_id
    1539 
    1540 
    1541 
    1542 
    1543 print '                             '
    1544 print '                             '
    1545 print '-------------------------------------------------------'
    1546 print '27. 获得每个数据库空间使用情况'
    1547 print '-------------------------------------------------------'
    1548 CREATE TABLE #output( 
    1549 server_name varchar(128), 
    1550 dbname varchar(128), 
    1551 physical_name varchar(260), 
    1552 dt datetime, 
    1553 file_group_name varchar(128), 
    1554 size_mb int, 
    1555 free_mb int)  
    1556  
    1557 exec sp_MSforeachdb @command1= 
    1558 'USE [?]; INSERT #output 
    1559 SELECT CAST(SERVERPROPERTY(''ServerName'') AS varchar(128)) AS server_name, 
    1560 ''?'' AS dbname, 
    1561 f.filename AS physical_name, 
    1562 CAST(FLOOR(CAST(getdate() AS float)) AS datetime) AS dt, 
    1563 g.groupname, 
    1564 CAST (size*8.0/1024.0 AS int) AS ''size_mb'', 
    1565 CAST((size - FILEPROPERTY(f.name,''SpaceUsed''))*8.0/1024.0 AS int) AS ''free_mb'' 
    1566 FROM sysfiles f 
    1567 JOIN sysfilegroups g 
    1568 ON f.groupid = g.groupid' 
    1569  
    1570 SELECT * FROM #output 
    1571 
    1572 
    1573 drop TABLE #output
    1574 
    1575 
    1576 print '                             '
    1577 print '                             '
    1578 print '-------------------------------------------------------'
    1579 print '28.Buffer Pool缓冲池里面修改过的页总数大小'
    1580 print '-------------------------------------------------------'
    1581 
    1582 
    1583 SELECT count(*) * 8/1024 as cached_pages_mb,
    1584 convert(varchar(5),convert(decimal(5,2),(100-1.0*(select count(*) from sys.dm_os_buffer_descriptors b 
    1585 where b.database_id=a.database_id and is_modified=0)/count(*)*100.0)))+'%'modified_percentage,
    1586 CASE database_id WHEN 32767 THEN 'ResourceDb'
    1587 ELSE db_name(database_id)
    1588 END AS Database_name
    1589 FROM sys.dm_os_buffer_descriptors a
    1590 GROUP BY db_name(database_id),database_id
    1591 ORDER BY cached_pages_mb DESC;
    1592 
    1593 
    1594 /*
    1595 
    1596 
    1597 如果一个数据库的大部分(超过80%)是修改过的,那么这个数据库写操作非常多。
    1598 反之如果这个比例接近0,那么该数据库的活动几乎是只读的。读写的比例对磁盘的安排是很重要的。
    1599 
    1600 
    1601 */
    1602 
    1603 print '                             '
    1604 print '                             '
    1605 print '-------------------------------------------------------'
    1606 print '29.查看 tempdb 大小和增长参数'
    1607 print '-------------------------------------------------------'
    1608 
    1609 
    1610 
    1611 SELECT 
    1612     name AS FileName, 
    1613     size*1.0/128 AS FileSizeinMB,
    1614     CASE max_size 
    1615         WHEN 0 THEN 'Autogrowth is off.'
    1616         WHEN -1 THEN 'Autogrowth is on.'
    1617         ELSE 'Log file will grow to a maximum size of 2 TB.'
    1618     END,
    1619     growth AS 'GrowthValue',
    1620     'GrowthIncrement' = 
    1621         CASE
    1622             WHEN growth = 0 THEN 'Size is fixed and will not grow.'
    1623             WHEN growth > 0 AND is_percent_growth = 0 
    1624                 THEN 'Growth value is in 8-KB pages.'
    1625             ELSE 'Growth value is a percentage.'
    1626         END
    1627 FROM tempdb.sys.database_files;
    1628 GO
    1629 
    1630 
    1631 
    1632 
    1633 print '                             '
    1634 print '                             '
    1635 print '-------------------------------------------------------'
    1636 print '30.查看 客户端连接IP'
    1637 print '-------------------------------------------------------'
    1638 
    1639 
    1640 SELECT distinct client_net_address FROM sys.dm_exec_connections 
    1641 WHERE session_id >50 and session_id != @@SPID and client_net_address 
    1642 not like '%<local machine>%'
    1643 go
    1644 
    1645 
    1646 print '                             '
    1647 print '                             '
    1648 print '-------------------------------------------------------'
    1649 print '31.查看消耗性能的存储过程名、存储过程内容'
    1650 print '-------------------------------------------------------'
    1651 
    1652 
    1653 select distinct procname,text,b.cached_time,
    1654 b.last_execution_time,b.total_elapsed_time,
    1655 b.avg_elapsed_time,
    1656 b.last_elapsed_time,b.execution_count
    1657  from (
    1658 select top 1000 sql_text.text as text,
    1659 sql_handle,
    1660 plan_generation_num,
    1661 execution_count,
    1662 dbid,
    1663 objectid
    1664 from sys.dm_exec_query_stats a
    1665 cross apply sys.dm_exec_sql_text(sql_handle) as sql_text
    1666 where plan_generation_num > 1
    1667 order by plan_generation_num desc
    1668 )  a,
    1669 
    1670 
    1671 (
    1672 SELECT TOP 1000 d.object_id, d.database_id, OBJECT_NAME(object_id, database_id) 'procname', 
    1673 d.cached_time, d.last_execution_time, d.total_elapsed_time, d.total_elapsed_time/d.execution_count AS [avg_elapsed_time],
    1674 d.last_elapsed_time, d.execution_count
    1675 FROM sys.dm_exec_procedure_stats AS d
    1676 ORDER BY [total_worker_time] DESC
    1677 ) b where a.objectid=b.object_id
    1678 order by avg_elapsed_time,execution_count desc
    1679 go
    View Code
  • 相关阅读:
    Android视图动画集合AndoridViewAnimations
    调整窗口大小时进行页面刷新(设定定时器)
    通过拖动来变换元素顺序
    jquery的input:type=file实现文件上传
    ajax请求的data数据格式
    Cookie的新增,设置与清除
    比较两个对象是否一样的代码
    5.3日,7:20开始 阮一峰js的早课学习
    在线代码编辑器使用案例代码
    layui当点击增加的时候,将form中的值获取的添加到table行中代码
  • 原文地址:https://www.cnblogs.com/Areas/p/5849607.html
Copyright © 2011-2022 走看看