You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							164 lines
						
					
					
						
							4.9 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							164 lines
						
					
					
						
							4.9 KiB
						
					
					
				
								<?php
							 | 
						|
								
							 | 
						|
								/* 
							 | 
						|
								V4.55 3 Jan 2005  (c) 2000-2005 John Lim (jlim@natsoft.com.my). All rights reserved.
							 | 
						|
								  Released under both BSD license and Lesser GPL library license. 
							 | 
						|
								  Whenever there is any discrepancy between the two licenses, 
							 | 
						|
								  the BSD license will take precedence. See License.txt. 
							 | 
						|
								  Set tabs to 4 for best viewing.
							 | 
						|
								  
							 | 
						|
								  Latest version is available at http://adodb.sourceforge.net
							 | 
						|
								  
							 | 
						|
								  Library for basic performance monitoring and tuning 
							 | 
						|
								  
							 | 
						|
								*/
							 | 
						|
								
							 | 
						|
								// security - hide paths
							 | 
						|
								if (!defined('ADODB_DIR')) die();
							 | 
						|
								
							 | 
						|
								/*
							 | 
						|
									MSSQL has moved most performance info to Performance Monitor
							 | 
						|
								*/
							 | 
						|
								class perf_mssql extends adodb_perf{
							 | 
						|
									var $sql1 = 'cast(sql1 as text)';
							 | 
						|
									var $createTableSQL = "CREATE TABLE adodb_logsql (
							 | 
						|
										  created datetime NOT NULL,
							 | 
						|
										  sql0 varchar(250) NOT NULL,
							 | 
						|
										  sql1 varchar(4000) NOT NULL,
							 | 
						|
										  params varchar(3000) NOT NULL,
							 | 
						|
										  tracer varchar(500) NOT NULL,
							 | 
						|
										  timer decimal(16,6) NOT NULL
							 | 
						|
										)";
							 | 
						|
										
							 | 
						|
									var $settings = array(
							 | 
						|
									'Ratios',
							 | 
						|
										'data cache hit ratio' => array('RATIO',
							 | 
						|
											"select round((a.cntr_value*100.0)/b.cntr_value,2) from master.dbo.sysperfinfo a, master.dbo.sysperfinfo b where a.counter_name = 'Buffer cache hit ratio' and b.counter_name='Buffer cache hit ratio base'",
							 | 
						|
											'=WarnCacheRatio'),
							 | 
						|
										'prepared sql hit ratio' => array('RATIO',
							 | 
						|
											array('dbcc cachestats','Prepared',1,100),
							 | 
						|
											''),
							 | 
						|
										'adhoc sql hit ratio' => array('RATIO',
							 | 
						|
											array('dbcc cachestats','Adhoc',1,100),
							 | 
						|
											''),
							 | 
						|
									'IO',
							 | 
						|
										'data reads' => array('IO',
							 | 
						|
										"select cntr_value from master.dbo.sysperfinfo where counter_name = 'Page reads/sec'"),
							 | 
						|
										'data writes' => array('IO',
							 | 
						|
										"select cntr_value from master.dbo.sysperfinfo where counter_name = 'Page writes/sec'"),
							 | 
						|
											
							 | 
						|
									'Data Cache',
							 | 
						|
										'data cache size' => array('DATAC',
							 | 
						|
										"select cntr_value*8192 from master.dbo.sysperfinfo where counter_name = 'Total Pages' and object_name='SQLServer:Buffer Manager'",
							 | 
						|
											'' ),
							 | 
						|
										'data cache blocksize' => array('DATAC',
							 | 
						|
											"select 8192",'page size'),
							 | 
						|
									'Connections',
							 | 
						|
										'current connections' => array('SESS',
							 | 
						|
											'=sp_who',
							 | 
						|
											''),
							 | 
						|
										'max connections' => array('SESS',
							 | 
						|
											"SELECT @@MAX_CONNECTIONS",
							 | 
						|
											''),
							 | 
						|
								
							 | 
						|
										false
							 | 
						|
									);
							 | 
						|
									
							 | 
						|
									
							 | 
						|
									function perf_mssql(&$conn)
							 | 
						|
									{
							 | 
						|
										if ($conn->dataProvider == 'odbc') {
							 | 
						|
											$this->sql1 = 'sql1';
							 | 
						|
											//$this->explain = false;
							 | 
						|
										}
							 | 
						|
										$this->conn =& $conn;
							 | 
						|
									}
							 | 
						|
									
							 | 
						|
									function Explain($sql,$partial=false)
							 | 
						|
									{
							 | 
						|
										
							 | 
						|
										$save = $this->conn->LogSQL(false);
							 | 
						|
										if ($partial) {
							 | 
						|
											$sqlq = $this->conn->qstr($sql.'%');
							 | 
						|
											$arr = $this->conn->GetArray("select distinct sql1 from adodb_logsql where sql1 like $sqlq");
							 | 
						|
											if ($arr) {
							 | 
						|
												foreach($arr as $row) {
							 | 
						|
													$sql = reset($row);
							 | 
						|
													if (crc32($sql) == $partial) break;
							 | 
						|
												}
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
										
							 | 
						|
										$s = '<p><b>Explain</b>: '.htmlspecialchars($sql).'</p>';
							 | 
						|
										$this->conn->Execute("SET SHOWPLAN_ALL ON;");
							 | 
						|
										$sql = str_replace('?',"''",$sql);
							 | 
						|
										global $ADODB_FETCH_MODE;
							 | 
						|
										
							 | 
						|
										$save = $ADODB_FETCH_MODE;
							 | 
						|
										$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
							 | 
						|
										$rs =& $this->conn->Execute($sql);
							 | 
						|
										//adodb_printr($rs);
							 | 
						|
										$ADODB_FETCH_MODE = $save;
							 | 
						|
										if ($rs) {
							 | 
						|
											$rs->MoveNext();
							 | 
						|
											$s .= '<table bgcolor=white border=0 cellpadding="1" callspacing=0><tr><td nowrap align=center> Rows<td nowrap align=center> IO<td nowrap align=center> CPU<td align=left>     Plan</tr>';
							 | 
						|
											while (!$rs->EOF) {
							 | 
						|
												$s .= '<tr><td>'.round($rs->fields[8],1).'<td>'.round($rs->fields[9],3).'<td align=right>'.round($rs->fields[10],3).'<td nowrap><pre>'.htmlspecialchars($rs->fields[0])."</td></pre></tr>\n"; ## NOTE CORRUPT </td></pre> tag is intentional!!!!
							 | 
						|
												$rs->MoveNext();
							 | 
						|
											}
							 | 
						|
											$s .= '</table>';
							 | 
						|
											
							 | 
						|
											$rs->NextRecordSet();
							 | 
						|
										}
							 | 
						|
										
							 | 
						|
										$this->conn->Execute("SET SHOWPLAN_ALL OFF;");
							 | 
						|
										$this->conn->LogSQL($save);
							 | 
						|
										$s .= $this->Tracer($sql);
							 | 
						|
										return $s;
							 | 
						|
									}
							 | 
						|
									
							 | 
						|
									function Tables()
							 | 
						|
									{
							 | 
						|
									global $ADODB_FETCH_MODE;
							 | 
						|
									
							 | 
						|
										$save = $ADODB_FETCH_MODE;
							 | 
						|
										$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
							 | 
						|
										//$this->conn->debug=1;
							 | 
						|
										$s = '<table border=1 bgcolor=white><tr><td><b>tablename</b></td><td><b>size_in_k</b></td><td><b>index size</b></td><td><b>reserved size</b></td></tr>';
							 | 
						|
										$rs1 = $this->conn->Execute("select distinct name from sysobjects where xtype='U'");
							 | 
						|
										if ($rs1) {
							 | 
						|
											while (!$rs1->EOF) {
							 | 
						|
												$tab = $rs1->fields[0];
							 | 
						|
												$tabq = $this->conn->qstr($tab);
							 | 
						|
												$rs2 = $this->conn->Execute("sp_spaceused $tabq");
							 | 
						|
												if ($rs2) {
							 | 
						|
													$s .= '<tr><td>'.$tab.'</td><td align=right>'.$rs2->fields[3].'</td><td align=right>'.$rs2->fields[4].'</td><td align=right>'.$rs2->fields[2].'</td></tr>';
							 | 
						|
													$rs2->Close();
							 | 
						|
												}
							 | 
						|
												$rs1->MoveNext();
							 | 
						|
											}
							 | 
						|
											$rs1->Close();
							 | 
						|
										}
							 | 
						|
										$ADODB_FETCH_MODE = $save;
							 | 
						|
										return $s.'</table>';
							 | 
						|
									}
							 | 
						|
									
							 | 
						|
									function sp_who()
							 | 
						|
									{
							 | 
						|
										$arr = $this->conn->GetArray('sp_who');
							 | 
						|
										return sizeof($arr);
							 | 
						|
									}
							 | 
						|
									
							 | 
						|
									function HealthCheck($cli=false)
							 | 
						|
									{
							 | 
						|
										
							 | 
						|
										$this->conn->Execute('dbcc traceon(3604)');
							 | 
						|
										$html =  adodb_perf::HealthCheck($cli);
							 | 
						|
										$this->conn->Execute('dbcc traceoff(3604)');
							 | 
						|
										return $html;
							 | 
						|
									}
							 | 
						|
									
							 | 
						|
									
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								?>
							 |