| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140 | ---- © 2012 Microsoft.  All Rights Reserved.---- This script installs the stored procedures and functions invoked when a user opens the -- Performance Dashboard reports.  This script must be run against each SQL Server instance which-- you plan to monitor via the reports.---- Script must not be run in a transactionSET IMPLICIT_TRANSACTIONS OFFIF @@TRANCOUNT > 0 ROLLBACK TRANGO-- Options that are saved with object definitionSET QUOTED_IDENTIFIER ON		-- Required to call methods on XML typeSET ANSI_NULLS ON				-- All queries use IS NULL checkgouse msdbgodeclare @Version nvarchar(100)declare @MajorVer tinyintdeclare @dec1 intselect @Version = convert(nvarchar(100), serverproperty('ProductVersion'))select @dec1 = charindex('.', @Version)select @MajorVer = convert(tinyint, substring(@Version, 1, @dec1 - 1))if not (@MajorVer >= 10)begin	RAISERROR('SETUP FAILED: This server does not meet the requirements (SQL 2008 or later) for running the Performance Dashboard Reports.  This script will terminate and the required procedures will not be installed.', 18, 1)endGO-- Prevent installs against SQL Azure (cross DB query limitation and DMV scoping)if SERVERPROPERTY('Edition') = N'SQL Azure'begin	RAISERROR('SETUP FAILED: SQL Azure is currently not supported by the Performance Dashboard Reports.', 18, 1);	-- On SQL Azure we can't raise a high enough severity error to abort execution of the script, so this will	-- unfortunately continue on past this pointendgoif not exists (select * from sys.schemas where name = 'MS_PerfDashboard')	exec('create schema MS_PerfDashboard')goif OBJECTPROPERTY(object_id('MS_PerfDashboard.tblConfigValues'), 'IsUserTable') = 1	drop table MS_PerfDashboard.tblConfigValuesgocreate table MS_PerfDashboard.tblConfigValues(	Attribute varchar(60) not null PRIMARY KEY,	AttribValue sql_variant null)goset nocount on;go-- NOTE: ReportVersion attribute must be synchronized with .RDL versioninsert into MS_PerfDashboard.tblConfigValues (Attribute, AttribValue) values ('ReportVersion', '2012-01-31');insert into MS_PerfDashboard.tblConfigValues (Attribute, AttribValue) values ('InstalledDate', GETDATE());insert into MS_PerfDashboard.tblConfigValues (Attribute, AttribValue) values ('InstalledBy', SUSER_SNAME());goif object_id('MS_PerfDashboard.usp_CheckDependencies', 'P') is not null	drop procedure MS_PerfDashboard.usp_CheckDependenciesgocreate procedure MS_PerfDashboard.usp_CheckDependenciesasbegin	declare @Version nvarchar(100)	declare @MajorVer tinyint, @MinorVer tinyint, @BuildNum smallint	declare @dec1 int, @dec2 int, @dec3 int	select @Version = convert(nvarchar(100), serverproperty('ProductVersion'))	select @dec1 = charindex('.', @Version)	select @MajorVer = convert(tinyint, substring(@Version, 1, @dec1 - 1));		select @MajorVer as major_version, 		NULL as minor_version, 		NULL as build_number,		convert(nvarchar(128), SERVERPROPERTY('MachineName')) + 			CASE WHEN convert(nvarchar(128), SERVERPROPERTY('InstanceName')) IS NOT NULL THEN N'\' + convert(nvarchar(128), SERVERPROPERTY('InstanceName'))			ELSE N''			END as ServerInstance,		@Version as ProductVersion,		serverproperty('ProductLevel') as ProductLevel,		serverproperty('Edition') as Edition	if not (@MajorVer >= 10)	begin		RAISERROR('This server does not meet the requirements (SQL 2008 or later) for running the Performance Dashboard Reports.  This server is running version %s', 18, 1, @Version)	endendgogrant execute on MS_PerfDashboard.usp_CheckDependencies to publicgoif OBJECTPROPERTY(object_id('MS_PerfDashboard.fn_WaitTypeCategory'), 'IsScalarFunction') = 1	drop function MS_PerfDashboard.fn_WaitTypeCategorygocreate function MS_PerfDashboard.fn_WaitTypeCategory(@wait_type nvarchar(60)) returns varchar(60)asbegin	declare @category nvarchar(60)	select @category = 		case 			when @wait_type = N'SOS_SCHEDULER_YIELD' then N'CPU'			when @wait_type = N'THREADPOOL' then N'Worker Thread'			when @wait_type like N'LCK_M_%' then N'Lock'			when @wait_type like N'LATCH_%' then N'Latch'			when @wait_type like N'PAGELATCH_%' then N'Buffer Latch'			when @wait_type like N'PAGEIOLATCH_%' then N'Buffer IO'			when @wait_type like N'RESOURCE_SEMAPHORE_%' then N'Compilation'			when @wait_type like N'CLR_%' or @wait_type like N'SQLCLR%' then N'SQL CLR'			when @wait_type like N'DBMIRROR%' or @wait_type = N'MIRROR_SEND_MESSAGE' then N'Mirroring'			when @wait_type like N'XACT%' or @wait_type like N'DTC_%' or @wait_type like N'TRAN_MARKLATCH_%' or @wait_type like N'MSQL_XACT_%' or @wait_type = N'TRANSACTION_MUTEX' then N'Transaction'			when @wait_type like N'SLEEP_%' or @wait_type in(N'LAZYWRITER_SLEEP', N'SQLTRACE_BUFFER_FLUSH', N'SQLTRACE_INCREMENTAL_FLUSH_SLEEP', N'SQLTRACE_WAIT_ENTRIES', N'FT_IFTS_SCHEDULER_IDLE_WAIT', N'XE_DISPATCHER_WAIT', N'REQUEST_FOR_DEADLOCK_SEARCH', N'SLEEP_TASK', N'LOGMGR_QUEUE', N'ONDEMAND_TASK_QUEUE', N'CHECKPOINT_QUEUE', N'XE_TIMER_EVENT') then N'Idle'			when @wait_type like N'PREEMPTIVE_%' then N'Preemptive'			when @wait_type like N'BROKER_%' then N'Service Broker'			when @wait_type in (N'LOGMGR', N'LOGBUFFER', N'LOGMGR_RESERVE_APPEND', N'LOGMGR_FLUSH', N'WRITELOG') then N'Tran Log IO'			when @wait_type in (N'ASYNC_NETWORK_IO', N'NET_WAITFOR_PACKET') then N'Network IO'			when @wait_type in (N'CXPACKET', N'EXCHANGE') then N'Parallelism'			when @wait_type in (N'RESOURCE_SEMAPHORE', N'CMEMTHREAD', N'SOS_RESERVEDMEMBLOCKLIST') then N'Memory'			when @wait_type in (N'WAITFOR', N'WAIT_FOR_RESULTS', N'BROKER_RECEIVE_WAITFOR') then N'User Wait'			when @wait_type in (N'TRACEWRITE', N'SQLTRACE_LOCK', N'SQLTRACE_FILE_BUFFER', N'SQLTRACE_FILE_WRITE_IO_COMPLETION') then N'Tracing'			when @wait_type in (N'FT_RESTART_CRAWL', N'FULLTEXT GATHERER', N'MSSEARCH') then N'Full Text Search'			when @wait_type in (N'ASYNC_IO_COMPLETION', N'IO_COMPLETION', N'BACKUPIO', N'WRITE_COMPLETION') then N'Other Disk IO'			else N'Other'		end	return @categoryendgoGRANT EXECUTE ON MS_PerfDashboard.fn_WaitTypeCategory TO publicgoif OBJECTPROPERTY(object_id('MS_PerfDashboard.fn_QueryTextFromHandle'), 'IsTableFunction') = 1	drop function MS_PerfDashboard.fn_QueryTextFromHandlegoCREATE function MS_PerfDashboard.fn_QueryTextFromHandle(@handle varbinary(64), @statement_start_offset int, @statement_end_offset int)RETURNS @query_text TABLE (database_id smallint, object_id int, encrypted bit, query_text nvarchar(max))begin	if @handle is not null	begin		declare @start int, @end int		declare @dbid smallint, @objectid int, @encrypted bit		declare @batch nvarchar(max), @query nvarchar(max)		-- statement_end_offset is zero prior to beginning query execution (e.g., compilation)		select 			@start = isnull(@statement_start_offset, 0), 			@end = case when @statement_end_offset is null or @statement_end_offset = 0 then -1						else @statement_end_offset 					end		select @dbid = t.dbid, 			@objectid = t.objectid, 			@encrypted = t.encrypted, 			@batch = t.text 		from sys.dm_exec_sql_text(@handle) as t		select @query = case 				when @encrypted = cast(1 as bit) then N'encrypted text' 				else ltrim(substring(@batch, @start / 2 + 1, case when (@end - @start) / 2 >= 0 then (@end - @start) / 2 else 1000 end))			end		-- Found internal queries (e.g., CREATE INDEX) with end offset of original batch that is 		-- greater than the length of the internal query and thus returns nothing if we don't do this		if datalength(@query) = 0		begin			select @query = @batch		end		insert into @query_text (database_id, object_id, encrypted, query_text) 		values (@dbid, @objectid, @encrypted, @query)	end	returnendgoGRANT SELECT ON MS_PerfDashboard.fn_QueryTextFromHandle TO publicgoif OBJECTPROPERTY(object_id('MS_PerfDashboard.fn_hexstrtovarbin'), 'IsScalarFunction') = 1	drop function MS_PerfDashboard.fn_hexstrtovarbingocreate function MS_PerfDashboard.fn_hexstrtovarbin(@input varchar(8000)) returns varbinary(8000) as begin 	declare @result varbinary(8000)	if @input is not null	begin		declare @i int, @l int 		select @result = 0x, @l = len(@input) / 2, @i = 2 			while @i <= @l 		begin 			set @result = @result + 			cast(cast(case lower(substring(@input, @i*2-1, 1)) 				when '0' then 0x00 				when '1' then 0x10 				when '2' then 0x20 				when '3' then 0x30 				when '4' then 0x40 				when '5' then 0x50 				when '6' then 0x60 				when '7' then 0x70 				when '8' then 0x80 				when '9' then 0x90 				when 'a' then 0xa0 				when 'b' then 0xb0 				when 'c' then 0xc0 				when 'd' then 0xd0 				when 'e' then 0xe0 				when 'f' then 0xf0 				end as tinyint) | 			cast(case lower(substring(@input, @i*2, 1)) 				when '0' then 0x00 				when '1' then 0x01 				when '2' then 0x02 				when '3' then 0x03 				when '4' then 0x04 				when '5' then 0x05 				when '6' then 0x06 				when '7' then 0x07 				when '8' then 0x08 				when '9' then 0x09 				when 'a' then 0x0a 				when 'b' then 0x0b 				when 'c' then 0x0c 				when 'd' then 0x0d 				when 'e' then 0x0e 				when 'f' then 0x0f 				end as tinyint) as binary(1)) 		set @i = @i + 1 		end 	end	return @result end goGRANT EXECUTE ON MS_PerfDashboard.fn_hexstrtovarbin TO publicgoif OBJECTPROPERTY(object_id('MS_PerfDashboard.fn_DatediffMilliseconds'), 'IsScalarFunction') = 1	drop function MS_PerfDashboard.fn_DatediffMillisecondsgocreate function MS_PerfDashboard.fn_DatediffMilliseconds(@start datetime, @end datetime) returns bigint as begin 	return (datediff(dd, @start, @end) * cast(86400000 as bigint) + datediff(ms, dateadd(dd, datediff(dd, @start, @end), @start), @end))endgoif object_id('MS_PerfDashboard.usp_Main_GetCPUHistory', 'P') is not null	drop procedure MS_PerfDashboard.usp_Main_GetCPUHistorygocreate procedure MS_PerfDashboard.usp_Main_GetCPUHistoryasbegin	declare @ms_now bigint		select @ms_now = ms_ticks from sys.dm_os_sys_info;	select top 15 record_id,		dateadd(ms, -1 * (@ms_now - [timestamp]), GetDate()) as EventTime, 		SQLProcessUtilization,		SystemIdle,		100 - SystemIdle - SQLProcessUtilization as OtherProcessUtilization	from (		select 			record.value('(./Record/@id)[1]', 'int') as record_id,			record.value('(./Record/SchedulerMonitorEvent/SystemHealth/SystemIdle)[1]', 'int') as SystemIdle,			record.value('(./Record/SchedulerMonitorEvent/SystemHealth/ProcessUtilization)[1]', 'int') as SQLProcessUtilization,			timestamp		from (			select timestamp, convert(xml, record) as record 			from sys.dm_os_ring_buffers 			where ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR'			and record like '%<SystemHealth>%') as x		) as y 	order by record_id desc	endgogrant execute on MS_PerfDashboard.usp_Main_GetCPUHistory to publicgoif object_id('MS_PerfDashboard.usp_Main_GetMiscInfo', 'P') is not null	drop procedure MS_PerfDashboard.usp_Main_GetMiscInfogocreate procedure MS_PerfDashboard.usp_Main_GetMiscInfoasbegin	select 		(select count(*) from sys.traces) as running_traces,		(select count(*) from sys.databases) as number_of_databases,		(select count(*) from sys.dm_db_missing_index_group_stats) as missing_index_count,		(select waiting_tasks_count from sys.dm_os_wait_stats where wait_type = N'SQLCLR_QUANTUM_PUNISHMENT') as clr_quantum_waits,		(select count(*) from sys.dm_os_ring_buffers where ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR' and record like N'%<NonYieldSchedBegin>%') as non_yield_count,		(select cpu_count from sys.dm_os_sys_info) as number_of_cpus,		(select scheduler_count from sys.dm_os_sys_info) as number_of_schedulers,		(select COUNT(*) from sys.dm_xe_sessions) as number_of_xevent_sessions,		(select convert(varchar(30), AttribValue) from MS_PerfDashboard.tblConfigValues where Attribute = 'ReportVersion') as report_script_version	endgogrant execute on MS_PerfDashboard.usp_Main_GetMiscInfo to publicgoif object_id('MS_PerfDashboard.usp_Main_GetSessionInfo', 'P') is not null	drop procedure MS_PerfDashboard.usp_Main_GetSessionInfogocreate procedure MS_PerfDashboard.usp_Main_GetSessionInfoasbegin	select count(*) as num_sessions,		sum(convert(bigint, s.total_elapsed_time)) as total_elapsed_time,		sum(convert(bigint, s.cpu_time)) as cpu_time, 		case when sum(convert(bigint, s.total_elapsed_time)) - sum(convert(bigint, s.cpu_time)) > 0			then sum(convert(bigint, s.total_elapsed_time)) - sum(convert(bigint, s.cpu_time))			else 0		end as wait_time,		sum(convert(bigint, MS_PerfDashboard.fn_DatediffMilliseconds(login_time, getdate()))) - sum(convert(bigint, s.total_elapsed_time)) as idle_connection_time,		case when sum(s.logical_reads) > 0 then (sum(s.logical_reads) - isnull(sum(s.reads), 0)) / convert(float, sum(s.logical_reads))			else NULL			end as cache_hit_ratio	from sys.dm_exec_sessions s	where s.is_user_process = 0x1endgogrant execute on MS_PerfDashboard.usp_Main_GetSessionInfo to publicgoif object_id('MS_PerfDashboard.usp_Main_GetRequestInfo', 'P') is not null	drop procedure MS_PerfDashboard.usp_Main_GetRequestInfogocreate procedure MS_PerfDashboard.usp_Main_GetRequestInfoasbegin	select count(r.request_id) as num_requests,		sum(convert(bigint, r.total_elapsed_time)) as total_elapsed_time,		sum(convert(bigint, r.cpu_time)) as cpu_time,		case when sum(convert(bigint, r.total_elapsed_time)) - sum(convert(bigint, r.cpu_time)) > 0			then sum(convert(bigint, r.total_elapsed_time)) - sum(convert(bigint, r.cpu_time))			else 0		end as wait_time,		case when sum(r.logical_reads) > 0 then (sum(r.logical_reads) - isnull(sum(r.reads), 0)) / convert(float, sum(r.logical_reads))			else NULL			end as cache_hit_ratio	from sys.dm_exec_requests r		join sys.dm_exec_sessions s on r.session_id = s.session_id	where s.is_user_process = 0x1endgogrant execute on MS_PerfDashboard.usp_Main_GetRequestInfo to publicgoif object_id('MS_PerfDashboard.usp_Main_GetRequestWaits', 'P') is not null	drop procedure MS_PerfDashboard.usp_Main_GetRequestWaitsgocreate procedure MS_PerfDashboard.usp_Main_GetRequestWaitsasbegin	SELECT 		r.session_id, 		MS_PerfDashboard.fn_WaitTypeCategory(r.wait_type) AS wait_category, 		r.wait_type, 		r.wait_time	FROM sys.dm_exec_requests AS r 		INNER JOIN sys.dm_exec_sessions AS s ON r.session_id = s.session_id	WHERE r.wait_type IS NOT NULL  		AND s.is_user_process = 0x1		-- TODO: parameterizeendgoGRANT EXECUTE ON MS_PerfDashboard.usp_Main_GetRequestWaits TO publicgoif object_id('MS_PerfDashboard.usp_GetPageDetails', 'P') is not null	drop procedure MS_PerfDashboard.usp_GetPageDetailsgocreate procedure MS_PerfDashboard.usp_GetPageDetails @wait_resource varchar(100)asbegin	declare @database_id smallint, @file_id smallint, @page_no int	declare @t TABLE (ParentObject varchar(256), Object varchar(256), Field varchar(256), VALUE sql_variant)	declare @colon1 int, @colon2 int	select @colon1 = charindex(':', @wait_resource)	select @colon2 = charindex(':', @wait_resource, @colon1 + 1)	select @database_id = substring(@wait_resource, 1, @colon1 - 1)	select @file_id = substring(@wait_resource, @colon1 + 1, @colon2 - @colon1 - 1)	select @page_no = substring(@wait_resource, @colon2 + 1, 100)		BEGIN TRY		insert into @t exec sp_executesql N'dbcc page(@database_id, @file_id, @page_no) with tableresults', N'@database_id smallint, @file_id smallint, @page_no int', @database_id, @file_id, @page_no	END TRY	BEGIN CATCH		--do nothing	END CATCH		select @database_id as database_id, 		quotename(db_name(@database_id)) as database_name,		@file_id as file_id,		@page_no as page_no,		convert(int, [Metadata: ObjectId]) as [object_id], 		quotename(object_schema_name(convert(int, [Metadata: ObjectId]), @database_id)) + N'.' + quotename(object_name(convert(int, [Metadata: ObjectId]), @database_id)) as [object_name],		convert(smallint, [Metadata: IndexId]) as [index_id],		convert(int, [m_level]) as page_level,		case convert(int, [m_type])			when 1 then N'Data Page'			when 2 then N'Index Page'			when 3 then N'Text Mix Page'			when 4 then N'Text Tree Page'			when 8 then N'GAM Page'			when 9 then N'SGAM Page'			when 10 then N'IAM Page'			when 11 then N'PFS Page'			else convert(nvarchar(10), [m_type])	-- other types intentionally omitted		end as page_type	from (select * from @t where ParentObject = 'PAGE HEADER:' and 			Field IN ('Metadata: ObjectId', 'Metadata: IndexId', 'm_objId (AllocUnitId.idObj)', 'm_level', 'm_type')) as x		pivot (min([VALUE]) for Field in ([Metadata: ObjectId], [Metadata: IndexId], [m_level], [m_type])) as zendgoGRANT EXECUTE ON MS_PerfDashboard.usp_GetPageDetails TO publicgoif OBJECTPROPERTY(object_id('MS_PerfDashboard.usp_GetPlanGuideDetails'), 'IsProcedure') = 1	drop procedure MS_PerfDashboard.usp_GetPlanGuideDetailsgocreate procedure MS_PerfDashboard.usp_GetPlanGuideDetails @database_name nvarchar(128), @plan_guide_name nvarchar(128)asbegin	if (LEFT(@database_name, 1) = N'[' and RIGHT(@database_name, 1) = N']')	begin		select @database_name = substring(@database_name, 2, len(@database_name) - 2)	end	if (LEFT(@plan_guide_name, 1) = N'[' and RIGHT(@plan_guide_name, 1) = N']')	begin		select @plan_guide_name = substring(@plan_guide_name, 2, len(@plan_guide_name) - 2)	end	if db_id(@database_name) is not null	begin		declare @cmd nvarchar(4000)		select @cmd = N'select * from [' + @database_name + N'].[sys].[plan_guides] where name = @P1'		exec sp_executesql @cmd, N'@P1 nvarchar(128)', @plan_guide_name	end	else	begin		-- return empty result set		select * from [sys].[plan_guides] where 0 = 1	endendgogrant execute on MS_PerfDashboard.usp_GetPlanGuideDetails to publicgoif OBJECTPROPERTY(object_id('MS_PerfDashboard.usp_TransformShowplanXMLToTable'), 'IsProcedure') = 1	drop procedure MS_PerfDashboard.usp_TransformShowplanXMLToTablegoCREATE PROCEDURE MS_PerfDashboard.usp_TransformShowplanXMLToTable @plan_handle nvarchar(256), @stmt_start_offset int, @stmt_end_offset int, @fDebug bit = 0x0ASBEGIN	SET NOCOUNT ON	declare @plan nvarchar(max)	declare @dbid int, @objid int	declare @xml_plan xml	declare @error int	declare @output TABLE (		node_id int, 		parent_node_id int, 		relevant_xml_text nvarchar(max), 		stmt_text nvarchar(max), 		logical_op nvarchar(128), 		physical_op nvarchar(128), 		output_list nvarchar(max), 		avg_row_size float, 		est_cpu float, 		est_io float, 		est_rows float, 		est_rewinds float, 		est_rebinds float, 		est_subtree_cost float,		warnings nvarchar(max))	BEGIN TRY		-- handle may be invalid now, or XML may be too deep to convert		select @dbid = p.dbid, @objid = p.objectid, @plan = p.query_plan from sys.dm_exec_text_query_plan(msdb.MS_PerfDashboard.fn_hexstrtovarbin(@plan_handle), @stmt_start_offset, @stmt_end_offset) as p		select @xml_plan = convert(xml, @plan)		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		insert into @output 		select nd.node_id,			x.parent_node_id,			case when @fDebug = 0x1 then 							case 								when x.parent_node_id is null then @plan 								else convert(nvarchar(max), x.plan_node) 							end					else NULL					end as relevant_xml_text,			nd.stmt_text, 			nd.logical_op, 			nd.physical_op, 			nd.output_list, 			nd.avg_row_size, 			nd.est_cpu, 			nd.est_io, 			nd.est_rows, 			nd.est_rewinds, 			nd.est_rebinds, 			nd.est_subtree_cost,			nd.warnings		from (select 				splan.row.query('.') as plan_node,				splan.row.value('../../@NodeId', 'int') as parent_node_id			from (select @xml_plan as query_plan) as p				cross apply p.query_plan.nodes('//sp:RelOp') as splan (row)) as x				outer apply MS_PerfDashboard.fn_ShowplanRowDetails(plan_node) as nd		order by isnull(parent_node_id, -1) asc		-- Statements such as WAITFOR, etc may not have a RelOp so just show the statement type if available		if @@rowcount = 0		begin			;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)			insert into @output (stmt_text) select isnull(@xml_plan.value('(//@StatementType)[1]', 'nvarchar(max)'), N'Unknown Statement')		end	END TRY	BEGIN CATCH		select @error = ERROR_NUMBER()-- 		select -- 			cast(NULL as int) as node_id, -- 			cast(NULL as int) as parent_node_id,-- 			cast(NULL as nvarchar(max)) as relevant_xml_text,-- 			cast(NULL as nvarchar(max)) as stmt_text,-- 			cast(NULL as nvarchar(128)) as logical_op,-- 			cast(NULL as nvarchar(128)) as physical_op,-- 			cast(NULL as nvarchar(max)) as output_list,-- 			cast(NULL as float) as avg_row_size,-- 			cast(NULL as float) as est_cpu,-- 			cast(NULL as float) as est_io,-- 			cast(NULL as float) as est_rows,-- 			cast(NULL as float) as est_rewinds,-- 			cast(NULL as float) as est_rebinds,-- 			cast(NULL as float) as est_subtree_cost,-- 			cast(NULL as nvarchar(max)) as warnings-- 		where 0 = 1	END CATCH	-- This may be an empty set if there was an exception caught above	SELECT		node_id,		parent_node_id, 		relevant_xml_text, 		stmt_text, 		logical_op, 		physical_op, 		output_list, 		avg_row_size, 		est_cpu, 		est_io, 		est_rows, 		est_rewinds, 		est_rebinds, 		est_subtree_cost,		warnings	FROM @outputENDgogrant execute on MS_PerfDashboard.usp_TransformShowplanXMLToTable to publicgo/*  * *	Helper procedures for building showplan output.  These are called, indirectly, by MS_PerfDashboard.usp_TransformShowplanXMLToTable and because *	they belong to the same schema we do not need to grant EXECUTE permissions to users.  They are not intended to be called directly as they require *	proper context within the showplan XML in order to return meaningful output. * * */if OBJECTPROPERTY(object_id('MS_PerfDashboard.fn_ShowplanBuildColumnReference'), 'IsScalarFunction') = 1	drop function MS_PerfDashboard.fn_ShowplanBuildColumnReferencegocreate function MS_PerfDashboard.fn_ShowplanBuildColumnReference(@node_data xml, @include_alias_or_table bit)returns nvarchar(max)asbegin	declare @output nvarchar(max)	declare @table nvarchar(256), @alias nvarchar(256), @column nvarchar(256)	;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)	select @alias = @node_data.value('(./sp:ColumnReference/@Alias)[1]', 'nvarchar(256)'),		@table = @node_data.value('(./sp:ColumnReference/@Table)[1]', 'nvarchar(256)'),		@column = @node_data.value('(./sp:ColumnReference/@Column)[1]', 'nvarchar(256)')	select @column = case when left(@column, 1) = N'[' and right(@column, 1) = N']' then @column else quotename(@column) end	if @include_alias_or_table = 0x1 and coalesce(@alias, @table) is not null	begin		select @alias = case when left(@alias, 1) = N'[' and right(@alias, 1) = N']' then @alias else quotename(@alias) end		select @table = case when left(@table, 1) = N'[' and right(@table, 1) = N']' then @table else quotename(@table) end		select @output = case 					when @alias is not null then @alias					else @table				end + N'.' + @column	end	else	begin		select @output = @column	end	return @outputendgoif OBJECTPROPERTY(object_id('MS_PerfDashboard.fn_ShowplanBuildColumnReferenceList'), 'IsScalarFunction') = 1	drop function MS_PerfDashboard.fn_ShowplanBuildColumnReferenceListgocreate function MS_PerfDashboard.fn_ShowplanBuildColumnReferenceList (@node_data xml, @include_alias_or_table bit)returns nvarchar(max)asbegin	declare @output nvarchar(max)	declare @count int, @ctr int	;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)	select @output = N'', @ctr = 1, @count = @node_data.value('count(./sp:ColumnReference)', 'int')	-- iterate over each element in the list	while @ctr <= @count	begin		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @output = @output + case when @ctr > 1 then N', ' else N'' end + MS_PerfDashboard.fn_ShowplanBuildColumnReference(@node_data.query('./sp:ColumnReference[position() = sql:variable("@ctr")]'), @include_alias_or_table)		select @ctr = @ctr + 1	end	return @outputendgoif OBJECTPROPERTY(object_id('MS_PerfDashboard.fn_ShowplanBuildDefinedValuesList'), 'IsScalarFunction') = 1	drop function MS_PerfDashboard.fn_ShowplanBuildDefinedValuesListgocreate function MS_PerfDashboard.fn_ShowplanBuildDefinedValuesList (@node_data xml)returns nvarchar(max)asbegin	declare @output nvarchar(max)	;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)	select @output = convert(nvarchar(max), @node_data.query('for $val in /sp:DefinedValue				return concat(($val/sp:ColumnReference/@Column)[1], "=", ($val/sp:ScalarOperator/@ScalarString)[1], ",")'))	declare @len int	select @len = len(@output)	if (@len > 0)	begin		select @output = left(@output, @len - 1)	end	return @outputendgoif OBJECTPROPERTY(object_id('MS_PerfDashboard.fn_ShowplanBuildOrderBy'), 'IsScalarFunction') = 1	drop function MS_PerfDashboard.fn_ShowplanBuildOrderBygocreate function MS_PerfDashboard.fn_ShowplanBuildOrderBy (@node_data xml)returns nvarchar(max)asbegin	declare @output nvarchar(max)	;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)	select @output = convert(nvarchar(max), @node_data.query('for $col in /sp:OrderByColumn					return concat(if (($col/sp:ColumnReference/@Alias)[1] > "") then concat(($col/sp:ColumnReference/@Alias)[1], ".") else if (($col/sp:ColumnReference/@Table)[1] > "") then concat(($col/sp:ColumnReference/@Table)[1], ".") else "", string(($col/sp:ColumnReference/@Column)[1]), if ($col/@Ascending = 1) then " ASC" else " DESC", ",")'))	declare @len int	select @len = len(@output)	if (@len > 0)	begin		select @output = left(@output, @len - 1)	end	return @outputendgoif OBJECTPROPERTY(object_id('MS_PerfDashboard.fn_ShowplanBuildRowset'), 'IsScalarFunction') = 1	drop function MS_PerfDashboard.fn_ShowplanBuildRowsetgocreate function MS_PerfDashboard.fn_ShowplanBuildRowset (@node_data xml)returns nvarchar(max)asbegin	declare @output nvarchar(max)	;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)	select @output = MS_PerfDashboard.fn_ShowplanBuildObject(@node_data.query('./sp:Object'))	return @outputendgoif OBJECTPROPERTY(object_id('MS_PerfDashboard.fn_ShowplanBuildScalarExpression'), 'IsScalarFunction') = 1	drop function MS_PerfDashboard.fn_ShowplanBuildScalarExpressiongocreate function MS_PerfDashboard.fn_ShowplanBuildScalarExpression (@node_data xml)returns nvarchar(max)asbegin	declare @output nvarchar(max)	select @output = N''	;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)	select @output = @node_data.value('(./sp:ScalarOperator/@ScalarString)[1]', 'nvarchar(max)')	return @outputendgoif OBJECTPROPERTY(object_id('MS_PerfDashboard.fn_ShowplanBuildScalarExpressionList'), 'IsScalarFunction') = 1	drop function MS_PerfDashboard.fn_ShowplanBuildScalarExpressionListgocreate function MS_PerfDashboard.fn_ShowplanBuildScalarExpressionList (@node_data xml)returns nvarchar(max)asbegin	declare @output nvarchar(max)	;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)	select @output = convert(nvarchar(max), @node_data.query('for $op in ./sp:ScalarOperator					return concat(string($op/@ScalarString), ",")'))	declare @len int	select @len = len(@output)	if (@len > 0)	begin		select @output = left(@output, @len - 1)	end	return @outputendgoif OBJECTPROPERTY(object_id('MS_PerfDashboard.fn_ShowplanBuildScanRange'), 'IsScalarFunction') = 1	drop function MS_PerfDashboard.fn_ShowplanBuildScanRangegocreate function MS_PerfDashboard.fn_ShowplanBuildScanRange (@node_data xml, @scan_type nvarchar(30))returns nvarchar(max)asbegin	declare @output nvarchar(max)	set @output = N''	declare @count int, @ctr int	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:RangeColumns') = 1)	begin			;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @ctr = 1, @count = @node_data.value('count(./sp:RangeColumns/sp:ColumnReference)', 'int')		while @ctr <= @count		begin			;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)			select @output = @output + 					case when @ctr > 1 then N' AND ' else '' end + MS_PerfDashboard.fn_ShowplanBuildColumnReferenceList(@node_data.query('./sp:RangeColumns/sp:ColumnReference[position() = sql:variable("@ctr")]'), 0x1)					+ N' ' + 				case UPPER(@scan_type) 					when 'BINARY IS' then N'IS'					when 'EQ' then N'='					when 'GE' then N'>='					when 'GT' then N'>'					when 'IS' then N'IS'					when 'IS NOT' then N'IS NOT'					when 'IS NOT NULL' then N'IS NOT NULL'					when 'IS NULL' then N'IS NULL'					when 'LE' then N'<='					when 'LT' then N'<'					when 'NE' then N'<>'				end				 + N' '				+ MS_PerfDashboard.fn_ShowplanBuildScalarExpressionList(@node_data.query('./sp:RangeExpressions/sp:ScalarOperator[position() = sql:variable("@ctr")]'))			select @ctr = @ctr + 1		end	end		--if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:RangeExpressions') = 1)	--begin	--	;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)	--	select @output = @output + N'(RANGE: (' + MS_PerfDashboard.fn_ShowplanBuildScalarExpressionList(@node_data.query('./sp:RangeExpressions/*')) + N'))'	--end	return @outputendgoif OBJECTPROPERTY(object_id('MS_PerfDashboard.fn_ShowplanBuildSeekPredicates'), 'IsScalarFunction') = 1	drop function MS_PerfDashboard.fn_ShowplanBuildSeekPredicatesgocreate function MS_PerfDashboard.fn_ShowplanBuildSeekPredicates (@node_data xml)returns nvarchar(max)asbegin	declare @output nvarchar(max)	declare @count int, @ctr int	;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)	select @output = N'', @ctr = 1, @count = @node_data.value('count(./sp:SeekPredicates/sp:SeekPredicate)', 'int')	-- iterate over each element in the list	while @ctr <= @count	begin		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @output = @output + case when @ctr > 1 then N' AND ' else N'' end + MS_PerfDashboard.fn_ShowplanBuildSeekPredicate(@node_data.query('./sp:SeekPredicates/sp:SeekPredicate[position() = sql:variable("@ctr")]/*'))		select @ctr = @ctr + 1	end	return @output;endgoif OBJECTPROPERTY(object_id('MS_PerfDashboard.fn_ShowplanBuildSeekPredicatesNew'), 'IsScalarFunction') = 1	drop function MS_PerfDashboard.fn_ShowplanBuildSeekPredicatesNewgoCREATE function [MS_PerfDashboard].[fn_ShowplanBuildSeekPredicatesNew] (@node_data xml)returns nvarchar(max)asbegin	declare @output nvarchar(max)	declare @count int, @ctr int	;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)	select @output = N'', @ctr = 1, @count = @node_data.value('count(./sp:SeekPredicates/sp:SeekPredicateNew)', 'int')		-- iterate over each element in the list	while @ctr <= @count	begin		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @output = @output + case when @ctr > 1 then N' AND ' else N'' end + MS_PerfDashboard.fn_ShowplanBuildSeekPredicate(@node_data.query('./sp:SeekPredicates/sp:SeekPredicateNew/sp:SeekKeys[position() = sql:variable("@ctr")]/*'))		select @ctr = @ctr + 1	end	return @outputendgoif OBJECTPROPERTY(object_id('MS_PerfDashboard.fn_ShowplanBuildSeekPredicate'), 'IsScalarFunction') = 1	drop function MS_PerfDashboard.fn_ShowplanBuildSeekPredicategocreate function MS_PerfDashboard.fn_ShowplanBuildSeekPredicate (@node_data xml)returns nvarchar(max)asbegin	declare @output nvarchar(max)	set @output = N''	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:IsNotNull') = 1)	begin		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @output = @output + MS_PerfDashboard.fn_ShowplanBuildColumnReference(@node_data.query('./sp:IsNotNull/sp:ColumnReference'), 0x0) + N' IS NOT NULL'	end	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:Prefix') = 1)	begin		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @output = @output + MS_PerfDashboard.fn_ShowplanBuildScanRange(@node_data.query('./sp:Prefix/*'), @node_data.value('(./sp:Prefix/@ScanType)[1]', 'nvarchar(100)'))	end	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:StartRange') = 1)	begin		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @output = @output + case when datalength(@output) > 0 then N' AND ' else '' end + MS_PerfDashboard.fn_ShowplanBuildScanRange(@node_data.query('./sp:StartRange/*'), @node_data.value('(./sp:StartRange/@ScanType)[1]', 'nvarchar(100)'))	end	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:EndRange') = 1)	begin		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @output = @output + case when datalength(@output) > 0 then N' AND ' else '' end + MS_PerfDashboard.fn_ShowplanBuildScanRange(@node_data.query('./sp:EndRange/*'), @node_data.value('(./sp:EndRange/@ScanType)[1]', 'nvarchar(100)'))	end	return @outputendgoif OBJECTPROPERTY(object_id('MS_PerfDashboard.fn_ShowplanBuildObject'), 'IsScalarFunction') = 1	drop function MS_PerfDashboard.fn_ShowplanBuildObjectgocreate function MS_PerfDashboard.fn_ShowplanBuildObject (@node_data xml)returns nvarchar(max)asbegin	declare @object nvarchar(max)	set @object = N''	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:Object/@Server') = 1)	begin		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @object = @object + @node_data.value('(./sp:Object/@Server)[1]', 'nvarchar(128)') + N'.'	end	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:Object/@Database') = 1)	begin		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @object = @object + @node_data.value('(./sp:Object/@Database)[1]', 'nvarchar(128)') + N'.'	end	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:Object/@Schema') = 1)	begin		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @object = @object + @node_data.value('(./sp:Object/@Schema)[1]', 'nvarchar(128)') + N'.'	end	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:Object/@Table') = 1)	begin		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @object = @object + @node_data.value('(./sp:Object/@Table)[1]', 'nvarchar(128)')	end	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:Object/@Index') = 1)	begin		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @object = @object + N'.' + @node_data.value('(./sp:Object/@Index)[1]', 'nvarchar(128)')	end	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:Object/@Alias') = 1)	begin		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @object = @object + N' AS ' + @node_data.value('(./sp:Object/@Alias)[1]', 'nvarchar(128)')	end	return @objectendgoif OBJECTPROPERTY(object_id('MS_PerfDashboard.fn_ShowplanBuildWarnings'), 'IsScalarFunction') = 1	drop function MS_PerfDashboard.fn_ShowplanBuildWarningsgocreate function MS_PerfDashboard.fn_ShowplanBuildWarnings(@relop_node xml)returns nvarchar(max)asbegin	declare @output nvarchar(max)	if (@relop_node.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:RelOp/sp:Warnings') = 1)	begin		if (@relop_node.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:RelOp/sp:Warnings[@NoJoinPredicate = 1]') = 1)		begin			select @output = N'NO JOIN PREDICATE'		end				if (@relop_node.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:RelOp/sp:Warnings/sp:ColumnsWithNoStatistics') = 1)		begin			;with xmlnamespaces ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' as sp)			select @output = case when @output is null then N'' else @output + N', ' end + N'NO STATS: ' + MS_PerfDashboard.fn_ShowplanBuildColumnReferenceList(@relop_node.query('./sp:RelOp/sp:Warnings/sp:ColumnsWithNoStatistics/*'), 0x1)		end	end	return @outputendgoif OBJECTPROPERTY(object_id('MS_PerfDashboard.fn_ShowplanFormatAssert'), 'IsScalarFunction') = 1	drop function MS_PerfDashboard.fn_ShowplanFormatAssertgoCREATE FUNCTION MS_PerfDashboard.fn_ShowplanFormatAssert(@node_data xml)RETURNS nvarchar(max)asbegin	declare @output nvarchar(max)	;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)	select @output = N'Assert(' + @node_data.value('(./sp:Assert/sp:Predicate/sp:ScalarOperator/@ScalarString)[1]', 'nvarchar(max)') + N'))'	return @output;endgoif OBJECTPROPERTY(object_id('MS_PerfDashboard.fn_ShowplanFormatBitmap'), 'IsScalarFunction') = 1	drop function MS_PerfDashboard.fn_ShowplanFormatBitmapgoCREATE FUNCTION MS_PerfDashboard.fn_ShowplanFormatBitmap(@node_data xml)RETURNS nvarchar(max)asbegin	declare @output nvarchar(max)	;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)	select @output = N'Bitmap(Hash Keys:(' + MS_PerfDashboard.fn_ShowplanBuildColumnReferenceList(@node_data.query('./sp:Bitmap/sp:HashKeys/sp:ColumnReference'), 0x1) + N'))'	return @output;endgoif OBJECTPROPERTY(object_id('MS_PerfDashboard.fn_ShowplanFormatComputeScalar'), 'IsScalarFunction') = 1	drop function MS_PerfDashboard.fn_ShowplanFormatComputeScalargoCREATE FUNCTION MS_PerfDashboard.fn_ShowplanFormatComputeScalar(@node_data xml, @physical_op nvarchar(128))returns nvarchar(max)asbegin	declare @output nvarchar(max)	;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)	select @output = @physical_op + N'(DEFINE: (' + MS_PerfDashboard.fn_ShowplanBuildDefinedValuesList(@node_data.query('./sp:DefinedValues/*')) + N'))';	return @output;endgoif OBJECTPROPERTY(object_id('MS_PerfDashboard.fn_ShowplanFormatConcat'), 'IsScalarFunction') = 1	drop function MS_PerfDashboard.fn_ShowplanFormatConcatgoCREATE FUNCTION MS_PerfDashboard.fn_ShowplanFormatConcat(@node_data xml)RETURNS nvarchar(max)asbegin	return N'Concatenation'endgoif OBJECTPROPERTY(object_id('MS_PerfDashboard.fn_ShowplanFormatCollapse'), 'IsScalarFunction') = 1	drop function MS_PerfDashboard.fn_ShowplanFormatCollapsegoCREATE FUNCTION MS_PerfDashboard.fn_ShowplanFormatCollapse(@node_data xml)RETURNS nvarchar(max)asbegin	return N'Collapse'endgoif OBJECTPROPERTY(object_id('MS_PerfDashboard.fn_ShowplanFormatIndexScan'), 'IsScalarFunction') = 1	drop function MS_PerfDashboard.fn_ShowplanFormatIndexScangoCREATE FUNCTION MS_PerfDashboard.fn_ShowplanFormatIndexScan(@node_data xml, @physical_op nvarchar(128))RETURNS nvarchar(max)asbegin	declare @output nvarchar(max)		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)	select @output = @physical_op + N'(OBJECT: (' + MS_PerfDashboard.fn_ShowplanBuildObject(@node_data.query('./sp:IndexScan/sp:Object')) + N')'		if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:IndexScan/sp:SeekPredicates/sp:SeekPredicate') = 1)	begin		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @output = @output + N', SEEK: (' + MS_PerfDashboard.fn_ShowplanBuildSeekPredicates(@node_data.query('./sp:IndexScan/sp:SeekPredicates')) + N')'	end	else if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:IndexScan/sp:SeekPredicates/sp:SeekPredicateNew') = 1)	begin		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @output = @output + N', SEEK: (' + MS_PerfDashboard.fn_ShowplanBuildSeekPredicatesNew(@node_data.query('./sp:IndexScan/sp:SeekPredicates')) + N')'	end	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:IndexScan/sp:Predicate') = 1)	begin		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @output = @output + N', WHERE: (' + MS_PerfDashboard.fn_ShowplanBuildScalarExpression(@node_data.query('./sp:IndexScan/sp:Predicate/*')) + N')'	end	select @output = @output + N')'	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:IndexScan[@Lookup = 1]') = 1)	begin		select @output = @output + N' LOOKUP'	end	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:IndexScan[@Ordered = 1]') = 1)	begin		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @output = @output + N' ORDERED ' + ISNULL(@node_data.value('(./sp:IndexScan/@ScanDirection)[1]', 'nvarchar(128)'), '')	end	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:IndexScan[@ForcedIndex = 1]') = 1)	begin		select @output = @output + N' FORCEDINDEX'	end	return @output;endgoif OBJECTPROPERTY(object_id('MS_PerfDashboard.fn_ShowplanFormatConstantScan'), 'IsScalarFunction') = 1	drop function MS_PerfDashboard.fn_ShowplanFormatConstantScangoCREATE FUNCTION MS_PerfDashboard.fn_ShowplanFormatConstantScan(@node_data xml)RETURNS nvarchar(max)asbegin	declare @output nvarchar(max)	select @output = N'Constant Scan'	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:ConstantScan/sp:Values') = 1)	begin		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @output = @output + N'(VALUES: (' + MS_PerfDashboard.fn_ShowplanBuildScalarExpressionList(@node_data.query('./sp:ConstantScan/sp:Values/sp:Row/*')) + N'))'	end	return @outputendgoif OBJECTPROPERTY(object_id('MS_PerfDashboard.fn_ShowplanFormatDeletedInsertedScan'), 'IsScalarFunction') = 1	drop function MS_PerfDashboard.fn_ShowplanFormatDeletedInsertedScango-- Passed the Rowset element of XML showplan and extracts the Object detailsCREATE FUNCTION MS_PerfDashboard.fn_ShowplanFormatDeletedInsertedScan(@node_data xml, @physical_op nvarchar(128))RETURNS nvarchar(max)asbegin	declare @output nvarchar(max)	;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)	select @output = @physical_op + N'(' + MS_PerfDashboard.fn_ShowplanBuildRowset(@node_data) + N')'	return @output;endgoif OBJECTPROPERTY(object_id('MS_PerfDashboard.fn_ShowplanFormatFilter'), 'IsScalarFunction') = 1	drop function MS_PerfDashboard.fn_ShowplanFormatFiltergoCREATE FUNCTION MS_PerfDashboard.fn_ShowplanFormatFilter(@node_data xml)RETURNS nvarchar(max)asbegin	declare @output nvarchar(max)	declare @fStartup tinyint	;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)	select @fStartup = case when (@node_data.exist('./sp:Filter[@StartupExpression = 1]') = 1) then 1 else 0 end	;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)	select @output = N'Filter(WHERE: (' + 		case when @fStartup = 1 then N'STARTUP EXPRESSION(' else N'' end + 		MS_PerfDashboard.fn_ShowplanBuildScalarExpression(@node_data.query('./sp:Filter/sp:Predicate/*')) +		case when @fStartup = 1 then N')' else N'' end + 		N'))'	return @output;endgoif OBJECTPROPERTY(object_id('MS_PerfDashboard.fn_ShowplanFormatHashMatch'), 'IsScalarFunction') = 1	drop function MS_PerfDashboard.fn_ShowplanFormatHashMatchgoCREATE FUNCTION MS_PerfDashboard.fn_ShowplanFormatHashMatch(@node_data xml, @logical_op nvarchar(128))RETURNS nvarchar(max)asbegin	declare @output nvarchar(max)	select @output = N'Hash Match(' + @logical_op	if (@logical_op = N'Aggregate')	begin		if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:Hash/sp:HashKeysBuild') = 1)		begin			;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)			select @output = @output + N', HASH:(' + MS_PerfDashboard.fn_ShowplanBuildColumnReferenceList(@node_data.query('./sp:Hash/sp:HashKeysBuild/sp:ColumnReference'), 0x1) + N')'		end			if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:Hash/sp:BuildResidual') = 1)		begin			;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)			select @output = @output + N', RESIDUAL:(' + MS_PerfDashboard.fn_ShowplanBuildScalarExpression(@node_data.query('./sp:Hash/sp:BuildResidual/*')) + N')'		end		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @output = @output + N', DEFINE: (' + MS_PerfDashboard.fn_ShowplanBuildDefinedValuesList(@node_data.query('./sp:Hash/sp:DefinedValues/*')) + N')';	end	else	begin		if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:Hash/sp:HashKeysBuild') = 1)		begin			;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)			select @output = @output + N', HASH:(' + 				MS_PerfDashboard.fn_ShowplanBuildColumnReferenceList(@node_data.query('./sp:Hash/sp:HashKeysBuild/sp:ColumnReference'), 0x1) + 				N')=(' + 				MS_PerfDashboard.fn_ShowplanBuildColumnReferenceList(@node_data.query('./sp:Hash/sp:HashKeysProbe/sp:ColumnReference'), 0x1) + N')'		end			if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:Hash/sp:BuildResidual') = 1) or			(@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:Hash/sp:ProbeResidual') = 1)		begin			declare @build_residual bit				select @build_residual = 0x0, @output = @output + N', RESIDUAL:('				if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:Hash/sp:BuildResidual') = 1)			begin				;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)				select @output = @output + MS_PerfDashboard.fn_ShowplanBuildScalarExpression(@node_data.query('./sp:Hash/sp:BuildResidual/*'))				select @build_residual = 0x1			end				if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:Hash/sp:ProbeResidual') = 1)			begin				;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)				select @output = @output + case when @build_residual = 0x1 then N' AND ' else '' end + MS_PerfDashboard.fn_ShowplanBuildScalarExpression(@node_data.query('./sp:Hash/sp:ProbeResidual/*'))			end			select @output = @output + N')'		end	end	select @output = @output + N')'	return @output;endgoif OBJECTPROPERTY(object_id('MS_PerfDashboard.fn_ShowplanFormatMerge'), 'IsScalarFunction') = 1	drop function MS_PerfDashboard.fn_ShowplanFormatMergegoCREATE FUNCTION MS_PerfDashboard.fn_ShowplanFormatMerge(@node_data xml, @logical_op nvarchar(128))RETURNS nvarchar(max)asbegin	declare @output nvarchar(max)	;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)	select @output = N'Merge Join(' + @logical_op + case when @node_data.exist('./sp:Merge[@ManyToMany = 1]') = 1 then N', MANY-TO-MANY'			else N'' end	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:Merge/sp:InnerSideJoinColumns') = 1)	begin		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @output = @output + N', MERGE: (' + MS_PerfDashboard.fn_ShowplanBuildColumnReferenceList(@node_data.query('./sp:Merge/sp:InnerSideJoinColumns/sp:ColumnReference'), 0x1) + N')=(' + MS_PerfDashboard.fn_ShowplanBuildColumnReferenceList(@node_data.query('./sp:Merge/sp:OuterSideJoinColumns/sp:ColumnReference'), 0x1) + N')'	end	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:Merge/sp:Residual') = 1)	begin		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @output = @output + N', RESIDUAL: (' + MS_PerfDashboard.fn_ShowplanBuildScalarExpression(@node_data.query('./sp:Merge/sp:Residual/*')) + N')'	end	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:Merge/sp:PassThru') = 1)	begin		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @output = @output + N', PASSTHRU: (' + MS_PerfDashboard.fn_ShowplanBuildScalarExpression(@node_data.query('./sp:Merge/sp:PassThru/*')) + N')'	end	select @output = @output + N')'	return @output;endgoif OBJECTPROPERTY(object_id('MS_PerfDashboard.fn_ShowplanFormatNestedLoops'), 'IsScalarFunction') = 1	drop function MS_PerfDashboard.fn_ShowplanFormatNestedLoopsgoCREATE FUNCTION MS_PerfDashboard.fn_ShowplanFormatNestedLoops(@node_data xml, @logical_op nvarchar(128))RETURNS nvarchar(max)asbegin	declare @output nvarchar(max)	select @output = N'Nested Loops(' + @logical_op	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:NestedLoops/sp:OuterReferences') = 1)	begin		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @output = @output + N', OUTER REFERENCES:' + MS_PerfDashboard.fn_ShowplanBuildColumnReferenceList(@node_data.query('./sp:NestedLoops/sp:OuterReferences/sp:ColumnReference'), 0x1)	end	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:NestedLoops/sp:Predicate') = 1)	begin		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @output = @output + N', WHERE: (' + MS_PerfDashboard.fn_ShowplanBuildScalarExpression(@node_data.query('./sp:NestedLoops/sp:Predicate/*')) + N')'	end	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:NestedLoops/sp:PassThru') = 1)	begin		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @output = @output + N', PASSTHRU:(' + MS_PerfDashboard.fn_ShowplanBuildScalarExpression(@node_data.query('./sp:NestedLoops/sp:PassThru/*')) + N')'	end	select @output = @output + N')'	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:NestedLoops[@Optimized = 1]') = 1)	begin		select @output = @output + N' OPTIMIZED'	end	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:NestedLoops[@WithOrderedPrefetch = 1]') = 1)	begin		select @output = @output + N' WITH ORDERED PREFETCH'	end	else if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:NestedLoops[@WithUnorderedPrefetch = 1]') = 1)	begin		select @output = @output + N' WITH UNORDERED PREFETCH'	end	return @output;endgoif OBJECTPROPERTY(object_id('MS_PerfDashboard.fn_ShowplanFormatParallelism'), 'IsScalarFunction') = 1	drop function MS_PerfDashboard.fn_ShowplanFormatParallelismgoCREATE FUNCTION MS_PerfDashboard.fn_ShowplanFormatParallelism(@node_data xml, @logical_op nvarchar(128))RETURNS nvarchar(max)asbegin	declare @output nvarchar(max)	select @output = N'Parallelism(' + @logical_op + N')'	--TODO: Extend to show partitioning information, order by information		return @output;endgoif OBJECTPROPERTY(object_id('MS_PerfDashboard.fn_ShowplanFormatSimpleUpdate'), 'IsScalarFunction') = 1	drop function MS_PerfDashboard.fn_ShowplanFormatSimpleUpdategoCREATE FUNCTION MS_PerfDashboard.fn_ShowplanFormatSimpleUpdate(@node_data xml, @physical_op nvarchar(128))RETURNS nvarchar(max)asbegin	declare @output nvarchar(max)	;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)	select @output = @physical_op + N'(' + MS_PerfDashboard.fn_ShowplanBuildObject(@node_data.query('./sp:Object'))	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:SetPredicate') = 1)	begin		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @output = @output + N', SET: ' + MS_PerfDashboard.fn_ShowplanBuildScalarExpression(@node_data.query('./sp:SetPredicate/*'))	end	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:SeekPredicate') = 1)	begin		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @output = @output + N', WHERE: (' + MS_PerfDashboard.fn_ShowplanBuildSeekPredicate(@node_data.query('./sp:SeekPredicate/*')) + N')'	end	select @output = @output + N')'	return @output;endgoif OBJECTPROPERTY(object_id('MS_PerfDashboard.fn_ShowplanFormatRemoteQuery'), 'IsScalarFunction') = 1	drop function MS_PerfDashboard.fn_ShowplanFormatRemoteQuerygoCREATE FUNCTION MS_PerfDashboard.fn_ShowplanFormatRemoteQuery(@node_data xml)RETURNS nvarchar(max)asbegin	declare @output nvarchar(max)	select @output = N'Remote Query('	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:RemoteQuery/@RemoteSource') = 1)	begin		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @output = @output + N'SOURCE: (' + @node_data.value('(./sp:RemoteQuery/@RemoteSource)[1]', 'nvarchar(256)') + N')'	end	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:RemoteQuery/@RemoteObject') = 1)	begin		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @output = @output + N'OBJECT: (' + @node_data.value('(./sp:RemoteQuery/@RemoteObject)[1]', 'nvarchar(256)') + N')'	end	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:RemoteQuery/@RemoteQuery') = 1)	begin		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @output = @output + N', QUERY: (' + @node_data.value('(./sp:RemoteQuery/@RemoteQuery)[1]', 'nvarchar(max)') + N')'	end	select @output = @output + N')'	return @output;endgoif OBJECTPROPERTY(object_id('MS_PerfDashboard.fn_ShowplanFormatRemoteScan'), 'IsScalarFunction') = 1	drop function MS_PerfDashboard.fn_ShowplanFormatRemoteScangoCREATE FUNCTION MS_PerfDashboard.fn_ShowplanFormatRemoteScan(@node_data xml)RETURNS nvarchar(max)asbegin	declare @output nvarchar(max)	select @output = N'Remote Scan('	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:RemoteScan/@RemoteSource') = 1)	begin		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @output = @output + N'SOURCE: (' + @node_data.value('(./sp:RemoteScan/@RemoteSource)[1]', 'nvarchar(256)') + N')'	end	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:RemoteScan/@RemoteObject') = 1)	begin		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @output = @output + N'OBJECT: (' + @node_data.value('(./sp:RemoteScan/@RemoteObject)[1]', 'nvarchar(256)') + N')'	end	select @output = @output + N')'	return @output;endgoif OBJECTPROPERTY(object_id('MS_PerfDashboard.fn_ShowplanFormatRemoteModify'), 'IsScalarFunction') = 1	drop function MS_PerfDashboard.fn_ShowplanFormatRemoteModifygoCREATE FUNCTION MS_PerfDashboard.fn_ShowplanFormatRemoteModify(@node_data xml, @logical_op nvarchar(128))RETURNS nvarchar(max)asbegin	declare @output nvarchar(max)	select @output = @logical_op + N'('	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:RemoteModify/@RemoteSource') = 1)	begin		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @output = @output + N'SOURCE: (' + @node_data.value('(./sp:RemoteModify/@RemoteSource)[1]', 'nvarchar(256)') + N')'	end	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:RemoteModify/@RemoteObject') = 1)	begin		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @output = @output + N'OBJECT: (' + @node_data.value('(./sp:RemoteModify/@RemoteObject)[1]', 'nvarchar(256)') + N')'	end	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:RemoteModify/sp:SetPredicate') = 1)	begin		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @output = @output + N'WHERE: (' + MS_PerfDashboard.fn_ShowplanBuildScalarExpression(@node_data.query('./sp:RemoteModify/sp:SetPredicate/*')) + N')'	end	select @output = @output + N')'	return @output;endgoif OBJECTPROPERTY(object_id('MS_PerfDashboard.fn_ShowplanFormatSort'), 'IsScalarFunction') = 1	drop function MS_PerfDashboard.fn_ShowplanFormatSortgoCREATE FUNCTION MS_PerfDashboard.fn_ShowplanFormatSort(@node_data xml, @logical_op nvarchar(128))RETURNS nvarchar(max)asbegin	declare @output nvarchar(max)	select @output = N'Sort('	if @logical_op = N'Sort'	begin		if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:Sort[@Distinct = 1]') = 1)		begin			select @output = @output + N'DISTINCT '		end		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @output = @output + N'ORDER BY: (' + MS_PerfDashboard.fn_ShowplanBuildOrderBy(@node_data.query('./sp:Sort/sp:OrderBy/sp:OrderByColumn')) + N')'	end	else if @logical_op = N'TopN Sort'	begin		select @output = @output + N'TOP ' + @node_data.value('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; (./sp:TopSort/@Rows)[1]', 'nvarchar(50)') + N', '		if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:TopSort[@Distinct = 1]') = 1)		begin			select @output = @output + N'DISTINCT '		end		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @output = @output + N'ORDER BY: (' + MS_PerfDashboard.fn_ShowplanBuildOrderBy(@node_data.query('./sp:TopSort/sp:OrderBy/sp:OrderByColumn')) + N')'	end	else if @logical_op = N'Distinct Sort'	begin		select @output = @output + N'DISTINCT '		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @output = @output + N'ORDER BY: (' + MS_PerfDashboard.fn_ShowplanBuildOrderBy(@node_data.query('./sp:Sort/sp:OrderBy/sp:OrderByColumn')) + N')'	end	select @output = @output + N')'	return @output;endgoif OBJECTPROPERTY(object_id('MS_PerfDashboard.fn_ShowplanFormatSplit'), 'IsScalarFunction') = 1	drop function MS_PerfDashboard.fn_ShowplanFormatSplitgoCREATE FUNCTION MS_PerfDashboard.fn_ShowplanFormatSplit(@node_data xml)RETURNS nvarchar(max)asbegin	declare @output nvarchar(max)	select @output = N'Split'	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:Split/sp:ActionColumn') = 1)	begin		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @output = @output + N'(' + MS_PerfDashboard.fn_ShowplanBuildColumnReferenceList(@node_data.query('./sp:Split/sp:ActionColumn/sp:ColumnReference'), 0x1) + N')'	end	return @output;endgoif OBJECTPROPERTY(object_id('MS_PerfDashboard.fn_ShowplanFormatStreamAggregate'), 'IsScalarFunction') = 1	drop function MS_PerfDashboard.fn_ShowplanFormatStreamAggregategoCREATE FUNCTION MS_PerfDashboard.fn_ShowplanFormatStreamAggregate(@node_data xml)RETURNS nvarchar(max)asbegin	declare @output nvarchar(max)	declare @need_comma bit	select @output = N'Stream Aggregate('	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:StreamAggregate/sp:GroupBy') = 1)	begin		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @output = @output + N'GROUP BY: (' + MS_PerfDashboard.fn_ShowplanBuildColumnReferenceList(@node_data.query('./sp:StreamAggregate/sp:GroupBy/sp:ColumnReference'), 0x1) + N')'		select @need_comma = 0x1	end	;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)	select @output = @output + 			case when @need_comma = 0x1 then N', ' else N'' end 		+ N'DEFINE: (' + MS_PerfDashboard.fn_ShowplanBuildDefinedValuesList(@node_data.query('./sp:StreamAggregate/sp:DefinedValues/sp:DefinedValue')) + N')'	select @output = @output + N')'	return @output;endgoif OBJECTPROPERTY(object_id('MS_PerfDashboard.fn_ShowplanFormatSegment'), 'IsScalarFunction') = 1	drop function MS_PerfDashboard.fn_ShowplanFormatSegmentgoCREATE FUNCTION MS_PerfDashboard.fn_ShowplanFormatSegment(@node_data xml)RETURNS nvarchar(max)asbegin	declare @output nvarchar(max)	select @output = N'Segment'	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:Segment/sp:GroupBy/sp:ColumnReference') = 1)	begin		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @output = @output + N'(GROUP BY: ' + MS_PerfDashboard.fn_ShowplanBuildColumnReferenceList(@node_data.query('./sp:Segment/sp:GroupBy/sp:ColumnReference'), 0x1) + N')'	end	return @output;endgoif OBJECTPROPERTY(object_id('MS_PerfDashboard.fn_ShowplanFormatSpool'), 'IsScalarFunction') = 1	drop function MS_PerfDashboard.fn_ShowplanFormatSpoolgoCREATE FUNCTION MS_PerfDashboard.fn_ShowplanFormatSpool(@node_data xml, @physical_op nvarchar(128))RETURNS nvarchar(max)asbegin	declare @output nvarchar(max)	select @output = @physical_op	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:Spool/sp:SeekPredicate') = 1)	begin		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @output = @output + N'(' + MS_PerfDashboard.fn_ShowplanBuildSeekPredicate(@node_data.query('./sp:Spool/sp:SeekPredicate/*')) + N')'	end	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:Spool[@Stack = 1]') = 1)	begin		select @output = @output + N' WITH STACK'	end	return @output;endgoif OBJECTPROPERTY(object_id('MS_PerfDashboard.fn_ShowplanFormatTableScan'), 'IsScalarFunction') = 1	drop function MS_PerfDashboard.fn_ShowplanFormatTableScangoCREATE FUNCTION MS_PerfDashboard.fn_ShowplanFormatTableScan(@node_data xml)RETURNS nvarchar(max)asbegin	declare @output nvarchar(max)	select @output = N'Table Scan('	;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)	select @output = @output + MS_PerfDashboard.fn_ShowplanBuildObject(@node_data.query('./sp:TableScan/sp:Object'))	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:TableScan/sp:Predicate') = 1)	begin		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @output = @output + N', WHERE: (' + MS_PerfDashboard.fn_ShowplanBuildScalarExpression(@node_data.query('./sp:TableScan/sp:Predicate/*')) + N')'	end		select @output = @output + N')'	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:TableScan[@Ordered = 1]') = 1)	begin		select @output = @output + N' ORDERED'	end	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:TableScan[@ForcedIndex = 1]') = 1)	begin		select @output = @output + N' FORCEDINDEX'	end	return @output;endgoif OBJECTPROPERTY(object_id('MS_PerfDashboard.fn_ShowplanFormatTop'), 'IsScalarFunction') = 1	drop function MS_PerfDashboard.fn_ShowplanFormatTopgoCREATE FUNCTION MS_PerfDashboard.fn_ShowplanFormatTop(@node_data xml)RETURNS nvarchar(max)asbegin	declare @output nvarchar(max)	select @output = N'Top'	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:Top/sp:TopExpression') = 1)	begin		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @output = @output + N'(TOP EXPRESSION: ' + MS_PerfDashboard.fn_ShowplanBuildScalarExpression(@node_data.query('./sp:Top/sp:TopExpression/*')) + N')'	end	return @output;endgoif OBJECTPROPERTY(object_id('MS_PerfDashboard.fn_ShowplanFormatTVF'), 'IsScalarFunction') = 1	drop function MS_PerfDashboard.fn_ShowplanFormatTVFgoCREATE FUNCTION MS_PerfDashboard.fn_ShowplanFormatTVF(@node_data xml)RETURNS nvarchar(max)asbegin	declare @output nvarchar(max)	select @output = N'Table-valued Function('	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:TableValuedFunction/sp:Object') = 1)	begin		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @output = @output + N'OBJECT: (' + MS_PerfDashboard.fn_ShowplanBuildObject(@node_data.query('./sp:TableValuedFunction/sp:Object')) + N')'	end	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:TableValuedFunction/sp:Predicate') = 1)	begin		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @output = @output + N', WHERE: ( ' + MS_PerfDashboard.fn_ShowplanBuildPredicate(@node_data.query('./sp:TableValuedFunction/sp:Predicate')) + N')'	end	select @output = @output + N')'	return @output;endgoif OBJECTPROPERTY(object_id('MS_PerfDashboard.fn_ShowplanFormatUDX'), 'IsScalarFunction') = 1	drop function MS_PerfDashboard.fn_ShowplanFormatUDXgoCREATE FUNCTION MS_PerfDashboard.fn_ShowplanFormatUDX(@node_data xml)RETURNS nvarchar(max)asbegin	declare @output nvarchar(max)	;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)	select @output = N'UDX(' + @node_data.value('(./sp:Extension/@UDXName)[1]', 'nvarchar(128)') + N')'	return @output;endgoif OBJECTPROPERTY(object_id('MS_PerfDashboard.fn_ShowplanFormatUpdate'), 'IsScalarFunction') = 1	drop function MS_PerfDashboard.fn_ShowplanFormatUpdategoCREATE FUNCTION MS_PerfDashboard.fn_ShowplanFormatUpdate(@node_data xml, @physical_op nvarchar(128))RETURNS nvarchar(max)asbegin	declare @output nvarchar(max)	;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)	select @output = @physical_op + N'(' + MS_PerfDashboard.fn_ShowplanBuildObject(@node_data.query('./sp:Object/*'))	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:SetPredicate') = 1)	begin		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @output = @output + N'SET: ' + MS_PerfDashboard.fn_ShowplanBuildScalarExpression(@node_data.query('./sp:SetPredicate/*'))	end	select @output = @output + N')'	return @output;endgoif OBJECTPROPERTY(object_id('MS_PerfDashboard.fn_ShowplanFormatRIDLookup'), 'IsScalarFunction') = 1	drop function MS_PerfDashboard.fn_ShowplanFormatRIDLookupgoCREATE FUNCTION MS_PerfDashboard.fn_ShowplanFormatRIDLookup(@node_data xml)RETURNS nvarchar(max)asbegin	declare @output nvarchar(max) = '';	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:IndexScan') = 1)	begin		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @output = @output + MS_PerfDashboard.fn_ShowplanFormatIndexScan(@node_data.query('./sp:IndexScan'), 'RID Lookup')		select @output = @output + N')'	end	return @output;endgoif OBJECTPROPERTY(object_id('MS_PerfDashboard.fn_ShowplanFormatGenericUpdate'), 'IsScalarFunction') = 1	drop function MS_PerfDashboard.fn_ShowplanFormatGenericUpdategoCREATE FUNCTION MS_PerfDashboard.fn_ShowplanFormatGenericUpdate(@node_data xml, @physical_op nvarchar(128))RETURNS nvarchar(max)asbegin	declare @output nvarchar(max)	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:SimpleUpdate') = 1)	begin		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @output = MS_PerfDashboard.fn_ShowplanFormatSimpleUpdate(@node_data.query('./sp:SimpleUpdate/*'), @physical_op)	end	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:Update') = 1)	begin		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @output = MS_PerfDashboard.fn_ShowplanFormatUpdate(@node_data.query('./sp:Update/*'), @physical_op)	end	if (@node_data.exist('declare namespace sp="http://schemas.microsoft.com/sqlserver/2004/07/showplan"; ./sp:ScalarInsert') = 1)	begin		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @output = @physical_op + '(' + MS_PerfDashboard.fn_ShowplanBuildScalarExpression(@node_data.query('./sp:ScalarInsert/sp:SetPredicate/*')) + ')'	end	return @output;endgo---- Created last since it depends on all the above functions for building/formatting the showplan--if OBJECTPROPERTY(object_id('MS_PerfDashboard.fn_ShowplanRowDetails'), 'IsTableFunction') = 1	drop function MS_PerfDashboard.fn_ShowplanRowDetailsgoCREATE FUNCTION MS_PerfDashboard.fn_ShowplanRowDetails(@relop_node xml)returns @node TABLE (node_id int, stmt_text nvarchar(max), logical_op nvarchar(128), physical_op nvarchar(128), output_list nvarchar(max), avg_row_size float, est_cpu float, est_io float, est_rows float, est_rewinds float, est_rebinds float, est_subtree_cost float, warnings nvarchar(max))ASbegin	declare @node_id int	declare @output_list nvarchar(max)	declare @stmt_text nvarchar(max)	declare @logical_op nvarchar(128), @physical_op nvarchar(128)	declare @avg_row_size float, @est_cpu float, @est_io float, @est_rows float, @est_rewinds float, @est_rebinds float, @est_subtree_cost float	declare @relop_children xml	;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)	select @logical_op = @relop_node.value('(./sp:RelOp/@LogicalOp)[1]', 'nvarchar(128)'),		@physical_op = @relop_node.value('(./sp:RelOp/@PhysicalOp)[1]', 'nvarchar(128)'),		@relop_children = @relop_node.query('./sp:RelOp/*')	;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)	select @stmt_text =		case 			when @physical_op = N'Assert' then MS_PerfDashboard.fn_ShowplanFormatAssert(@relop_children)			when @physical_op = N'Bitmap' then MS_PerfDashboard.fn_ShowplanFormatBitmap(@relop_children)			when @physical_op in (N'Clustered Index Delete', N'Clustered Index Insert', N'Clustered Index Update', N'Clustered Index Merge', 						N'Index Delete', N'Index Insert', N'Index Update', 						N'Table Delete', N'Table Insert', N'Table Update') then MS_PerfDashboard.fn_ShowplanFormatGenericUpdate(@relop_children, @physical_op)			when @physical_op in (N'Clustered Index Scan', N'Clustered Index Seek', 						N'Index Scan', N'Index Seek') then MS_PerfDashboard.fn_ShowplanFormatIndexScan(@relop_children, @physical_op)--			when @physical_op = N'Clustered Update' then 			when @physical_op = N'Collapse' then N'Collapse'			when @physical_op = N'Compute Scalar' then MS_PerfDashboard.fn_ShowplanFormatComputeScalar(@relop_children.query('./sp:ComputeScalar/*'), @physical_op)			when @physical_op = N'Concatenation' then MS_PerfDashboard.fn_ShowplanFormatConcat(@relop_children)			when @physical_op = N'Constant Scan' then MS_PerfDashboard.fn_ShowplanFormatConstantScan(@relop_children)			when @physical_op = N'Deleted Scan' then MS_PerfDashboard.fn_ShowplanFormatDeletedInsertedScan(@relop_children.query('./sp:DeletedScan/*'), @physical_op)			when @physical_op = N'Filter' then MS_PerfDashboard.fn_ShowplanFormatFilter(@relop_children)--			when @physical_op = N'Generic' then 			when @physical_op = N'Hash Match' then MS_PerfDashboard.fn_ShowplanFormatHashMatch(@relop_children, @logical_op)			when @physical_op = N'Index Spool' then MS_PerfDashboard.fn_ShowplanFormatSpool(@relop_children, @physical_op)			when @physical_op = N'Inserted Scan' then MS_PerfDashboard.fn_ShowplanFormatDeletedInsertedScan(@relop_children.query('./sp:InsertedScan/*'), @physical_op)			when @physical_op = N'Log Row Scan' then N'Log Row Scan'			when @physical_op = N'Merge Interval' then N'Merge Interval'			when @physical_op = N'Merge Join' then MS_PerfDashboard.fn_ShowplanFormatMerge(@relop_children, @logical_op)			when @physical_op = N'Nested Loops' then MS_PerfDashboard.fn_ShowplanFormatNestedLoops(@relop_children, @logical_op)			when @physical_op = N'Online Index Insert' then N'Online Index Insert'			when @physical_op = N'Parallelism' then MS_PerfDashboard.fn_ShowplanFormatParallelism(@relop_children, @logical_op)			when @physical_op = N'Parameter Table Scan' then N'Parameter Table Scan'			when @physical_op = N'Print' then N'Print'			when @physical_op in (N'Remote Delete', N'Remote Insert', N'Remote Update') then MS_PerfDashboard.fn_ShowplanFormatRemoteModify(@relop_children, @logical_op)			when @physical_op = N'Remote Scan' then MS_PerfDashboard.fn_ShowplanFormatRemoteScan(@relop_children)			when @physical_op = N'Remote Query' then MS_PerfDashboard.fn_ShowplanFormatRemoteQuery(@relop_children)			when @physical_op = N'RID Lookup' then MS_PerfDashboard.fn_ShowplanFormatRIDLookup(@relop_children)			when @physical_op = N'Row Count Spool' then MS_PerfDashboard.fn_ShowplanFormatSpool(@relop_children, @physical_op)			when @physical_op = N'Segment' then MS_PerfDashboard.fn_ShowplanFormatSegment(@relop_children)			when @physical_op = N'Sequence' then N'Sequence'			when @physical_op = N'Sequence Project' then MS_PerfDashboard.fn_ShowplanFormatComputeScalar(@relop_children.query('./sp:SequenceProject/*'), @physical_op)			when @physical_op = N'Sort' then MS_PerfDashboard.fn_ShowplanFormatSort(@relop_children, @logical_op)			when @physical_op = N'Split' then MS_PerfDashboard.fn_ShowplanFormatSplit(@relop_children)			when @physical_op = N'Stream Aggregate' then MS_PerfDashboard.fn_ShowplanFormatStreamAggregate(@relop_children)			when @physical_op = N'Switch' then N'Switch'			when @physical_op = N'Table-valued function' then MS_PerfDashboard.fn_ShowplanFormatTVF(@relop_children)			when @physical_op = N'Table Scan' then MS_PerfDashboard.fn_ShowplanFormatTableScan(@relop_children)			when @physical_op = N'Table Spool' then MS_PerfDashboard.fn_ShowplanFormatSpool(@relop_children, @physical_op)			when @physical_op = N'Table Merge' then N'Table Merge'			when @physical_op = N'Top' then MS_PerfDashboard.fn_ShowplanFormatTop(@relop_children)			when @physical_op = N'UDX' then MS_PerfDashboard.fn_ShowplanFormatUDX(@relop_children)			else @physical_op + N'(' + @logical_op + N')'		end		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)	insert @node (		node_id,		stmt_text, 		logical_op, 		physical_op, 		output_list, 		avg_row_size, 		est_cpu, 		est_io, 		est_rows, 		est_rewinds, 		est_rebinds, 		est_subtree_cost,		warnings)	values (		@relop_node.value('(./sp:RelOp/@NodeId)[1]', 'int'),		@stmt_text, 		@logical_op, 		@physical_op, 		MS_PerfDashboard.fn_ShowplanBuildColumnReferenceList(@relop_node.query('./sp:RelOp/sp:OutputList/sp:ColumnReference'), 0x1),		@relop_node.value('(./sp:RelOp/@AvgRowSize)[1]', 'float'),		@relop_node.value('(./sp:RelOp/@EstimateCPU)[1]', 'float'),		@relop_node.value('(./sp:RelOp/@EstimateIO)[1]', 'float'),		@relop_node.value('(./sp:RelOp/@EstimateRows)[1]', 'float'), 		@relop_node.value('(./sp:RelOp/@EstimateRewinds)[1]', 'float'), 		@relop_node.value('(./sp:RelOp/@EstimateRebinds)[1]', 'float'), 		@relop_node.value('(./sp:RelOp/@EstimatedTotalSubtreeCost)[1]', 'float'),		MS_PerfDashboard.fn_ShowplanBuildWarnings(@relop_node)		);	return;endgoif object_id('MS_PerfDashboard.usp_DatabaseOverview', 'P') is not null	drop procedure MS_PerfDashboard.usp_DatabaseOverviewgocreate procedure MS_PerfDashboard.usp_DatabaseOverviewasbegin	select d.name, d.database_id, d.compatibility_level, d.recovery_model_desc,		s.[Data File(s) Size (KB)] / 1024.0 as [Data File(s) Size (MB)], 		s.[Log File(s) Size (KB)] / 1024.0 as [Log File(s) Size (MB)],		s.[Percent Log Used],		d.is_auto_create_stats_on,		d.is_auto_update_stats_on,		d.is_auto_update_stats_async_on,		d.is_parameterization_forced,		d.page_verify_option_desc,		d.log_reuse_wait_desc	from sys.databases d		left join (select * from (select instance_name as database_name, counter_name, cntr_value 				from sys.dm_os_performance_counters 				where object_name like '%:Databases%' and counter_name in ('Data File(s) Size (KB)', 'Log File(s) Size (KB)', 'Percent Log Used')					and instance_name != '_Total') p 					pivot (min(cntr_value) for counter_name in ([Data File(s) Size (KB)], [Log File(s) Size (KB)], [Percent Log Used])) as q) as s 		on d.name = s.database_nameendgoGRANT EXECUTE ON MS_PerfDashboard.usp_DatabaseOverview TO publicgoif object_id('MS_PerfDashboard.usp_LargeIOObjects', 'P') is not null	drop procedure MS_PerfDashboard.usp_LargeIOObjectsgocreate procedure MS_PerfDashboard.usp_LargeIOObjectsasbegin	select db_name(d.database_id) as database_name, 		quotename(object_schema_name(d.object_id, d.database_id)) + N'.' + quotename(object_name(d.object_id, d.database_id)) as object_name,		d.database_id,		d.object_id,		d.page_io_latch_wait_count,		d.page_io_latch_wait_in_ms,		d.range_scans,		d.index_lookups,		case when mid.database_id is null then 'N' else 'Y' end as missing_index_identified	from (select 				database_id,				object_id,				row_number() over (partition by database_id order by sum(page_io_latch_wait_in_ms) desc) as row_number,				sum(page_io_latch_wait_count) as page_io_latch_wait_count,				sum(page_io_latch_wait_in_ms) as page_io_latch_wait_in_ms,				sum(range_scan_count) as range_scans,				sum(singleton_lookup_count) as index_lookups			from sys.dm_db_index_operational_stats(NULL, NULL, NULL, NULL)			where page_io_latch_wait_count > 0			group by database_id, object_id ) as d		left join (select distinct database_id, object_id from sys.dm_db_missing_index_details) as mid 			on mid.database_id = d.database_id and mid.object_id = d.object_id	where d.row_number <= 20endgoGRANT EXECUTE ON MS_PerfDashboard.usp_LargeIOObjects TO publicgoif object_id('MS_PerfDashboard.usp_DBFileIO', 'P') is not null	drop procedure MS_PerfDashboard.usp_DBFileIOgocreate procedure MS_PerfDashboard.usp_DBFileIOasbegin	select		m.database_id,		db_name(m.database_id) as database_name,		m.file_id,		m.name as file_name, 		m.physical_name, 		m.type_desc,		fs.num_of_reads, 		fs.num_of_bytes_read, 		fs.io_stall_read_ms, 		fs.num_of_writes, 		fs.num_of_bytes_written, 		fs.io_stall_write_ms	from sys.dm_io_virtual_file_stats(NULL, NULL) fs		join sys.master_files m on fs.database_id = m.database_id and fs.file_id = m.file_idendgoGRANT EXECUTE ON MS_PerfDashboard.usp_DBFileIO TO publicgoif object_id('MS_PerfDashboard.usp_DmOsWaitStats', 'P') is not null	drop procedure MS_PerfDashboard.usp_DmOsWaitStatsgocreate procedure MS_PerfDashboard.usp_DmOsWaitStatsasbegin	select 	wait_type, 	msdb.MS_PerfDashboard.fn_WaitTypeCategory(wait_type) as wait_category,	waiting_tasks_count as num_waits, 	wait_time_ms as wait_time,	max_wait_time_ms	from sys.dm_os_wait_stats	where waiting_tasks_count > 0endgoGRANT EXECUTE ON MS_PerfDashboard.usp_DmOsWaitStats TO publicgoif object_id('MS_PerfDashboard.usp_MissingIndexes', 'P') is not null	drop procedure MS_PerfDashboard.usp_MissingIndexesgocreate procedure MS_PerfDashboard.usp_MissingIndexes @showplan varchar(max)asbegin	WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)	SELECT 	index_node.value('(../@Impact)[1]', 'float') as index_impact,	index_node.query('concat(				string((./@Database)[1]), 				".",				string((./@Schema)[1]),				".",				string((./@Table)[1])			)') as target_object_name,	replace(convert(nvarchar(max), index_node.query('for $colgroup in ./sp:ColumnGroup,				$col in $colgroup/sp:Column				where $colgroup/@Usage = "EQUALITY"   				return string($col/@Name)')), '] [', '],[') as equality_columns,	replace(convert(nvarchar(max), index_node.query('for $colgroup in ./sp:ColumnGroup,				$col in $colgroup/sp:Column				where $colgroup/@Usage = "INEQUALITY"   				return string($col/@Name)')), '] [', '],[') as inequality_columns,	replace(convert(nvarchar(max), index_node.query('for $colgroup in .//sp:ColumnGroup,				$col in $colgroup/sp:Column				where $colgroup/@Usage = "INCLUDE"   				return string($col/@Name)')), '] [', '],[') as included_columns	from (select convert(xml, @showplan) as xml_showplan) as t		outer apply t.xml_showplan.nodes('//sp:MissingIndexes/sp:MissingIndexGroup/sp:MissingIndex') as missing_indexes(index_node)endgoGRANT EXECUTE ON MS_PerfDashboard.usp_MissingIndexes TO publicgoif object_id('MS_PerfDashboard.usp_QueryText', 'P') is not null	drop procedure MS_PerfDashboard.usp_QueryTextgocreate procedure MS_PerfDashboard.usp_QueryText @sql_handle varchar(8000), @stmt_start_offset int, @stmt_end_offset intasbegin	select * from msdb.MS_PerfDashboard.fn_QueryTextFromHandle(msdb.MS_PerfDashboard.fn_hexstrtovarbin(@sql_handle), @stmt_start_offset, @stmt_end_offset);endgoGRANT EXECUTE ON MS_PerfDashboard.usp_QueryText TO publicgoif object_id('MS_PerfDashboard.usp_MissingIndexStats', 'P') is not null	drop procedure MS_PerfDashboard.usp_MissingIndexStatsgocreate procedure MS_PerfDashboard.usp_MissingIndexStats @DatabaseID int, @ObjectID intasbegin	select d.database_id, d.object_id, d.index_handle, d.equality_columns, d.inequality_columns, d.included_columns, d.statement as fully_qualified_object,	gs.* 	from sys.dm_db_missing_index_groups g		join sys.dm_db_missing_index_group_stats gs on gs.group_handle = g.index_group_handle		join sys.dm_db_missing_index_details d on g.index_handle = d.index_handle	where d.database_id = isnull(@DatabaseID , d.database_id) and d.object_id = isnull(@ObjectID, d.object_id)endgoGRANT EXECUTE ON MS_PerfDashboard.usp_MissingIndexStats TO publicgoif object_id('MS_PerfDashboard.usp_QueryAttributes', 'P') is not null	drop procedure MS_PerfDashboard.usp_QueryAttributesgocreate procedure MS_PerfDashboard.usp_QueryAttributes @sql_handle varchar(8000), @stmt_start_offset int, @stmt_end_offset intasbegin	select 		qt.database_id,		quotename(db_name(qt.database_id)) as database_name,		qt.object_id,		quotename(object_schema_name(qt.object_id, qt.database_id)) + N'.' + quotename(object_name(qt.object_id, qt.database_id)) as qualified_object_name,		qt.encrypted,		qt.query_text	from msdb.MS_PerfDashboard.fn_QueryTextFromHandle(msdb.MS_PerfDashboard.fn_hexstrtovarbin(@sql_handle), @stmt_start_offset, @stmt_end_offset) as qtendgoGRANT EXECUTE ON MS_PerfDashboard.usp_QueryAttributes TO publicgoif object_id('MS_PerfDashboard.usp_ShowplanAttributes', 'P') is not null	drop procedure MS_PerfDashboard.usp_ShowplanAttributesgocreate procedure MS_PerfDashboard.usp_ShowplanAttributes @plan_handle nvarchar(256), @stmt_start_offset int, @stmt_end_offset intasbegin	declare @plan_text nvarchar(max)	declare @plan_xml xml	declare @missing_index_count int	declare @plan_guide_name nvarchar(128)	declare @warnings_exist bit	declare @plan_dbid smallint	declare @plan_dbname nvarchar(128)	begin try		select @plan_dbid = convert(smallint, pa.value) from sys.dm_exec_plan_attributes(msdb.MS_PerfDashboard.fn_hexstrtovarbin(@plan_handle)) as pa where pa.attribute = 'dbid'		select @plan_dbname = quotename(db_name(@plan_dbid))		--plan_handle may now be invalid, or xml could be > 128 levels deep such that conversion fails		select @plan_text = p.query_plan from sys.dm_exec_text_query_plan(msdb.MS_PerfDashboard.fn_hexstrtovarbin(@plan_handle), @stmt_start_offset, @stmt_end_offset) as p		select @plan_xml = convert(xml, @plan_text)		;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)		select @missing_index_count = @plan_xml.value('count(//sp:MissingIndexes/sp:MissingIndexGroup)', 'int'),			@plan_guide_name = @plan_xml.value('(//sp:StmtSimple/@PlanGuideName)[1]', 'nvarchar(128)'),			@warnings_exist = @plan_xml.exist('//sp:Warnings')					-- TODO: warning for optimizer timeout/memory abort: @StatementOptmEarlyAbortReason	end try	begin catch		select @plan_xml = NULL		--something required in catch block, and this does no harm	end catch	select 		@plan_text as query_plan, 		@plan_dbid as plan_database_id, 		@plan_dbname as plan_database_name, 		@missing_index_count as missing_index_count, 		@plan_guide_name as plan_guide_name, 		@warnings_exist as warnings_existendgoGRANT EXECUTE ON MS_PerfDashboard.usp_ShowplanAttributes TO publicgoif object_id('MS_PerfDashboard.usp_PlanParameters', 'P') is not null	drop procedure MS_PerfDashboard.usp_PlanParametersgocreate procedure MS_PerfDashboard.usp_PlanParameters @plan_handle nvarchar(256), @stmt_start_offset int, @stmt_end_offset intasbegin	declare @plan_xml xml	begin try		-- convert may fail due to exceeding 128 depth limit		select @plan_xml = convert(xml, query_plan) from sys.dm_exec_text_query_plan(msdb.MS_PerfDashboard.fn_hexstrtovarbin(@plan_handle), @stmt_start_offset, @stmt_end_offset)	end try	begin catch		select @plan_xml = NULL	end catch	;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS sp)	SELECT 		parameter_list.param_node.value('(./@Column)[1]', 'nvarchar(128)') as param_name,		parameter_list.param_node.value('(./@ParameterCompiledValue)[1]', 'nvarchar(max)') as param_compiled_value	from (select @plan_xml as xml_showplan) as t		outer apply t.xml_showplan.nodes('//sp:ParameterList/sp:ColumnReference') as parameter_list (param_node)endgoGRANT EXECUTE ON MS_PerfDashboard.usp_PlanParameters TO publicgoif object_id('MS_PerfDashboard.usp_QueryStatsTopN', 'P') is not null	drop procedure MS_PerfDashboard.usp_QueryStatsTopNgocreate procedure MS_PerfDashboard.usp_QueryStatsTopN @OrderBy_Criteria nvarchar(128)asbegin	select 		query_rank,		charted_value,		master.dbo.fn_varbintohexstr(sql_handle) as sql_handle,		master.dbo.fn_varbintohexstr(plan_handle) as plan_handle,		statement_start_offset,		statement_end_offset,		creation_time,		last_execution_time,		execution_count,		plan_generation_num,		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_reads,		last_logical_reads,		min_logical_reads,		max_logical_reads,		total_logical_writes,		last_logical_writes,		min_logical_writes,		max_logical_writes,		total_clr_time,		last_clr_time,		min_clr_time,		max_clr_time,		total_elapsed_time,		last_elapsed_time,		min_elapsed_time,		max_elapsed_time,		case when LEN(qt.query_text) < 2048 then qt.query_text else LEFT(qt.query_text, 2048) + N'...' end as query_text	from (select s.*, row_number() over(order by charted_value desc, last_execution_time desc) as query_rank from			 (select *, 					CASE @OrderBy_Criteria						WHEN 'Logical Reads' then total_logical_reads						WHEN 'Physical Reads' then total_physical_reads						WHEN 'Logical Writes' then total_logical_writes						WHEN 'CPU' then total_worker_time / 1000						WHEN 'Duration' then total_elapsed_time / 1000						WHEN 'CLR Time' then total_clr_time / 1000					END as charted_value 				from sys.dm_exec_query_stats) as s where s.charted_value > 0) as qs		cross apply msdb.MS_PerfDashboard.fn_QueryTextFromHandle(sql_handle, statement_start_offset, statement_end_offset) as qt	where qs.query_rank <= 20     -- return only top 20 entriesendgoGRANT EXECUTE ON MS_PerfDashboard.usp_QueryStatsTopN TO publicgoif object_id('MS_PerfDashboard.usp_QueryStatsTopN1', 'P') is not null	drop procedure MS_PerfDashboard.usp_QueryStatsTopN1gocreate procedure MS_PerfDashboard.usp_QueryStatsTopN1 @OrderBy_Criteria nvarchar(128)asbegin	SELECT 	query_text, 	master.dbo.fn_varbintohexstr(query_hash) query_hash, 	master.dbo.fn_varbintohexstr(sql_handle) sql_handle,	statement_start_offset,	statement_end_offset,	querycount, 	queryplanhashcount, 	execution_count,	total_elapsed_time,	min_elapsed_time, 	max_elapsed_time,	average_elapsed_time,	total_CPU_time, 	min_CPU_time, 	max_CPU_time, 	average_CPU_time,	total_logical_reads, 	min_logical_reads, 	max_logical_reads, 	average_logical_reads,	total_physical_reads, 	min_physical_reads, 	max_physical_reads, 	average_physical_reads, 	total_logical_writes, 	min_logical_writes, 	max_logical_writes, 	average_logical_writes,	total_clr_time, 	min_clr_time, 	max_clr_time, 	average_clr_time,	max_plan_generation_num,	earliest_creation_time,	query_rank,	charted_value,	master.dbo.fn_varbintohexstr(plan_handle) as plan_handle	FROM   (SELECT s.*, 				   Row_number() OVER(ORDER BY charted_value DESC) AS query_rank 			FROM   (SELECT CASE @OrderBy_Criteria 							 WHEN 'Logical Reads' THEN SUM(total_logical_reads) 							 WHEN 'Physical Reads' THEN SUM(total_physical_reads) 							 WHEN 'Logical Writes' THEN SUM(total_logical_writes) 							 WHEN 'CPU' THEN SUM(total_worker_time) / 1000 							 WHEN 'Duration' THEN SUM(total_elapsed_time) / 1000 							 WHEN 'CLR Time' THEN SUM(total_clr_time) / 1000 						   END AS charted_value, 					   query_hash, 					   MAX(sql_handle_1)				sql_handle, 					   MAX(statement_start_offset_1)    statement_start_offset, 					   MAX(statement_end_offset_1)      statement_end_offset, 					   COUNT(*)							querycount, 					   COUNT (DISTINCT query_plan_hash) queryplanhashcount, 					   MAX(plan_handle_1)			plan_handle,					   MIN(creation_time)				earliest_creation_time,                 					   SUM(execution_count)             execution_count, 					   SUM(total_elapsed_time)          total_elapsed_time, 					   min(min_elapsed_time)            min_elapsed_time, 					   max(max_elapsed_time)            max_elapsed_time,					   SUM(total_elapsed_time)/SUM(execution_count) average_elapsed_time,                        					   SUM(total_worker_time)           total_CPU_time, 					   min(min_worker_time)             min_CPU_time, 					   max(max_worker_time)            max_CPU_time, 					   SUM(total_worker_time)/SUM(execution_count) average_CPU_time,                        SUM(total_logical_reads)         total_logical_reads,                        min(min_logical_reads)           min_logical_reads,                        max(max_logical_reads)           max_logical_reads,                        SUM(total_logical_reads)/SUM(execution_count) average_logical_reads,                                               SUM(total_physical_reads)        total_physical_reads,                        min(min_physical_reads)         min_physical_reads,                        max(max_physical_reads)          max_physical_reads,                        SUM(total_physical_reads)/SUM(execution_count) average_physical_reads,                                               SUM(total_logical_writes)        total_logical_writes,                                         min(min_logical_writes)          min_logical_writes,                        max(max_logical_writes)          max_logical_writes,                        SUM(total_logical_writes)/SUM(execution_count) average_logical_writes,                                               SUM(total_clr_time)              total_clr_time,                        SUM(total_clr_time)/SUM(execution_count) average_clr_time,                        min(min_clr_time)                min_clr_time,                        max(max_clr_time)                max_clr_time,                                               MAX(plan_generation_num)         max_plan_generation_num                FROM (					-- Implement my own FIRST aggregate to get consistent values for sql_handle, start/end offsets of 					-- an arbitrary first row for a given query_hash                    SELECT 						CASE when t.rownum = 1 THEN plan_handle ELSE NULL END as plan_handle_1,						CASE WHEN t.rownum = 1 THEN sql_handle ELSE NULL END AS sql_handle_1, 						CASE WHEN t.rownum = 1 THEN statement_start_offset ELSE NULL END AS statement_start_offset_1, 						CASE WHEN t.rownum = 1 THEN statement_end_offset ELSE NULL END AS statement_end_offset_1, 						* 					FROM   (SELECT row_number() OVER (PARTITION BY query_hash ORDER BY sql_handle) AS rownum, * 							FROM   sys.dm_exec_query_stats) AS t) AS t2 					GROUP  BY query_hash               ) AS s 			WHERE  s.charted_value > 0        ) AS qs         	CROSS APPLY msdb.MS_PerfDashboard.fn_QueryTextFromHandle(qs.sql_handle, 		qs.statement_start_offset, qs.statement_end_offset) AS qt  	where query_rank <= 20	order by charted_value descendgoGRANT EXECUTE ON MS_PerfDashboard.usp_QueryStatsTopN1 TO publicgoif object_id('MS_PerfDashboard.usp_QueryStatsRecentActivity', 'P') is not null	drop procedure MS_PerfDashboard.usp_QueryStatsRecentActivitygocreate procedure MS_PerfDashboard.usp_QueryStatsRecentActivity @WithActivitySince datetimeasbegin	select 		query_rank,		charted_value,		master.dbo.fn_varbintohexstr(sql_handle) as sql_handle,		master.dbo.fn_varbintohexstr(plan_handle) as plan_handle,		statement_start_offset,		statement_end_offset,		creation_time,		last_execution_time,		execution_count,		plan_generation_num,		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_reads,		last_logical_reads,		min_logical_reads,		max_logical_reads,		total_logical_writes,		last_logical_writes,		min_logical_writes,		max_logical_writes,		total_clr_time,		last_clr_time,		min_clr_time,		max_clr_time,		total_elapsed_time,		last_elapsed_time,		min_elapsed_time,		max_elapsed_time,		case when LEN(qt.query_text) < 2048 then qt.query_text else LEFT(qt.query_text, 2048) + N'...' end as query_text	from (select s.*, row_number() over(order by charted_value desc, last_execution_time desc) as query_rank from			 (select *, total_worker_time as charted_value 				from sys.dm_exec_query_stats 				where total_worker_time > 0 and last_execution_time > isnull(@WithActivitySince, cast('1900-01-01' as datetime))) as s) as qs		outer apply msdb.MS_PerfDashboard.fn_QueryTextFromHandle(sql_handle, statement_start_offset, statement_end_offset) as qt	where qs.query_rank <= 15     -- return only top 15 entriesendgoGRANT EXECUTE ON MS_PerfDashboard.usp_QueryStatsRecentActivity TO publicgoif object_id('MS_PerfDashboard.usp_SessionRequestActivity', 'P') is not null	drop procedure MS_PerfDashboard.usp_SessionRequestActivitygocreate procedure MS_PerfDashboard.usp_SessionRequestActivity @WithActivitySince datetime, @IsUserProcess bitasbegin	select avg_request_cpu_per_ms * request_ms_in_window as request_recent_cpu_est,		avg_session_cpu_per_ms * session_ms_in_window as session_recent_cpu_est,		d.*	from (select s.session_id,		r.request_id,		s.login_time,	--	s.host_name,		s.program_name,		s.login_name,		s.status as session_status,		s.last_request_start_time,		s.last_request_end_time,		s.cpu_time as session_cpu_time,		r.cpu_time as request_cpu_time,	--	s.logical_reads as session_logical_reads,	--	r.logical_reads as request_logical_reads,		r.start_time as request_start_time,		r.status as request_status,		r.command,		master.dbo.fn_varbintohexstr(r.sql_handle) as sql_handle,		master.dbo.fn_varbintohexstr(r.plan_handle) as plan_handle,		r.statement_start_offset,		r.statement_end_offset,		case when r.start_time > getdate() then convert(float, r.cpu_time) / msdb.MS_PerfDashboard.fn_DatediffMilliseconds(r.start_time, getdate()) else convert(float, 1.0) end as avg_request_cpu_per_ms,		isnull(msdb.MS_PerfDashboard.fn_DatediffMilliseconds(case when r.start_time < @WithActivitySince then @WithActivitySince else r.start_time end, getdate()), 0) as request_ms_in_window,		case when s.login_time > getdate() then convert(float, s.cpu_time) / (msdb.MS_PerfDashboard.fn_DatediffMilliseconds(s.login_time, getdate())) else convert(float, 1.0) end as avg_session_cpu_per_ms,		isnull(msdb.MS_PerfDashboard.fn_DatediffMilliseconds(case when s.login_time < @WithActivitySince then @WithActivitySince else s.login_time end, case when r.request_id is null then s.last_request_end_time else getdate() end), 0) as session_ms_in_window	from sys.dm_exec_sessions s		left join sys.dm_exec_requests as r on s.session_id = r.session_id	where (s.last_request_end_time > @WithActivitySince or r.request_id is not null) and (s.is_user_process = @IsUserProcess or s.is_user_process=1)) as d	where (avg_request_cpu_per_ms * request_ms_in_window) + (avg_session_cpu_per_ms * session_ms_in_window) > 1000.0endgoGRANT EXECUTE ON MS_PerfDashboard.usp_SessionRequestActivity TO publicgoif object_id('MS_PerfDashboard.usp_RequestDetails', 'P') is not null	drop procedure MS_PerfDashboard.usp_RequestDetailsgocreate procedure MS_PerfDashboard.usp_RequestDetails @include_system_processes bitasbegin	SELECT master.dbo.fn_varbintohexstr(sql_handle) AS sql_handle,  		master.dbo.fn_varbintohexstr(plan_handle) AS plan_handle, 		case when LEN(qt.query_text) < 2048 then qt.query_text else LEFT(qt.query_text, 2048) + N'...' end as query_text,		r.session_id,		r.request_id,		r.start_time,		r.status,		r.statement_start_offset,		r.statement_end_offset,		r.database_id,		r.blocking_session_id,		r.wait_type,		r.wait_time,		r.wait_resource,		r.last_wait_type,		r.open_transaction_count,		r.open_resultset_count,		r.transaction_id,		r.cpu_time,		r.total_elapsed_time,		r.scheduler_id,		r.reads,		r.writes,		r.logical_reads,		r.transaction_isolation_level,		r.granted_query_memory,		r.executing_managed_code	FROM sys.dm_exec_requests AS r		JOIN sys.dm_exec_sessions s on r.session_id = s.session_id		outer APPLY msdb.MS_PerfDashboard.fn_QueryTextFromHandle(sql_handle, statement_start_offset, statement_end_offset) as qt	WHERE s.is_user_process = CASE when @include_system_processes > 0 THEN s.is_user_process ELSE 1 ENDendgoGRANT EXECUTE ON MS_PerfDashboard.usp_RequestDetails TO publicgoif object_id('MS_PerfDashboard.usp_SessionData', 'P') is not null	drop procedure MS_PerfDashboard.usp_SessionDatagocreate procedure MS_PerfDashboard.usp_SessionData @session_id intasbegin	SELECT session_id, login_time, host_name, program_name, login_name, nt_domain, 						  nt_user_name, status, cpu_time, memory_usage, total_scheduled_time, total_elapsed_time, last_request_start_time, 						  last_request_end_time, reads, writes, logical_reads, is_user_process, text_size, language, date_format, date_first, quoted_identifier, arithabort, 						  ansi_null_dflt_on, ansi_defaults, ansi_warnings, ansi_padding, ansi_nulls, concat_null_yields_null, transaction_isolation_level, lock_timeout, 						  deadlock_priority, row_count, prev_error	FROM sys.dm_exec_sessions	WHERE session_id = @session_idendgoGRANT EXECUTE ON MS_PerfDashboard.usp_SessionData TO publicgoif object_id('MS_PerfDashboard.usp_SessionRequests', 'P') is not null	drop procedure MS_PerfDashboard.usp_SessionRequestsgocreate procedure MS_PerfDashboard.usp_SessionRequests @session_id intasbegin	select request_id, 		master.dbo.fn_varbintohexstr(sql_handle) as sql_handle,		master.dbo.fn_varbintohexstr(plan_handle) as plan_handle,		statement_start_offset, 		statement_end_offset,		qt.query_text,		start_time,		status,		command,		r.database_id,		blocking_session_id,		wait_type,		wait_time,		wait_resource,		cpu_time,		total_elapsed_time,		open_transaction_count,		transaction_id,		logical_reads,		reads,		writes	from sys.dm_exec_requests r		outer apply msdb.MS_PerfDashboard.fn_QueryTextFromHandle(sql_handle, statement_start_offset, statement_end_offset) as qt	where session_id = @session_idendgoGRANT EXECUTE ON MS_PerfDashboard.usp_SessionRequests   TO publicgoif object_id('MS_PerfDashboard.usp_LastBatchForIdleSession', 'P') is not null	drop procedure MS_PerfDashboard.usp_LastBatchForIdleSessiongocreate procedure MS_PerfDashboard.usp_LastBatchForIdleSession @session_id intasbegin	if not exists (select * from sys.dm_exec_requests where session_id = @session_id)	begin		select t.dbid, db_name(t.dbid) as database_name, t.objectid, object_name(t.dbid, t.objectid) as object_name, 		case when t.encrypted = 0 then t.text else N'encrypted' end as last_query 		from sys.dm_exec_connections c			cross apply sys.dm_exec_sql_text(c.most_recent_sql_handle) as t		where c.most_recent_session_id = @session_id	end	else	begin		select cast(NULL as smallint), cast (NULL as sysname), cast(NULL as int), cast(NULL as sysname), cast(NULL as nvarchar(max)) where 0 = 1	endendgoGRANT EXECUTE ON MS_PerfDashboard.usp_LastBatchForIdleSession  TO publicgoif object_id('MS_PerfDashboard.usp_SessionDetails', 'P') is not null	drop procedure MS_PerfDashboard.usp_SessionDetailsgocreate procedure MS_PerfDashboard.usp_SessionDetails @include_system_processes bitasbegin	select session_id,		login_name,		host_name,		program_name,		nt_domain,		nt_user_name,		status,		cpu_time,		memory_usage,		last_request_start_time,		last_request_end_time,		logical_reads,		reads,		writes,		is_user_process	from sys.dm_exec_sessions s	WHERE s.is_user_process = CASE when @include_system_processes > 0 THEN s.is_user_process ELSE 1 ENDendgoGRANT EXECUTE ON MS_PerfDashboard.usp_SessionDetails TO publicgoif object_id('MS_PerfDashboard.usp_TraceEventColumns', 'P') is not null	drop procedure MS_PerfDashboard.usp_TraceEventColumnsgocreate procedure MS_PerfDashboard.usp_TraceEventColumnsasbegin	select trace_id,		status,		case when row_number = 1 then path else NULL end as path,		case when row_number = 1 then max_size else NULL end as max_size,		case when row_number = 1 then start_time else NULL end as start_time,		case when row_number = 1 then stop_time else NULL end as stop_time,		max_files, 		is_rowset, 		is_rollover,		is_shutdown,		is_default,		buffer_count,		buffer_size,		last_event_time,		event_count,		trace_event_id, 		trace_event_name, 		trace_column_id,		trace_column_name,		expensive_event		from 		(SELECT t.id AS trace_id, 			row_number() over (partition by t.id order by te.trace_event_id, tc.trace_column_id) as row_number, 			t.status, 			t.path, 			t.max_size, 			t.start_time,			t.stop_time, 			t.max_files, 			t.is_rowset, 			t.is_rollover,			t.is_shutdown,			t.is_default,			t.buffer_count,			t.buffer_size,			t.last_event_time,			t.event_count,			te.trace_event_id, 			te.name AS trace_event_name, 			tc.trace_column_id,			tc.name AS trace_column_name,			case when te.trace_event_id in (23, 24, 40, 41, 44, 45, 51, 52, 54, 68, 96, 97, 98, 113, 114, 122, 146, 180) then cast(1 as bit) else cast(0 as bit) end as expensive_event		FROM sys.traces t 			CROSS apply ::fn_trace_geteventinfo(t .id) AS e 			JOIN sys.trace_events te ON te.trace_event_id = e.eventid 			JOIN sys.trace_columns tc ON e.columnid = trace_column_id) as xendgoGRANT EXECUTE ON MS_PerfDashboard.usp_TraceEventColumns TO publicgoif object_id('MS_PerfDashboard.usp_Blocking', 'P') is not null	drop procedure MS_PerfDashboard.usp_Blockinggocreate procedure MS_PerfDashboard.usp_Blockingasbegin	with blocking_hierarchy (head_wait_resource, session_id, blocking_session_id, tree_level, request_id, transaction_id, 		status, sql_handle, plan_handle, statement_start_offset, statement_end_offset, wait_type, wait_time, wait_resource, 		program_name, seconds_active_idle, open_transaction_count, transaction_isolation_level) 	as 	(		select 			(select min(wait_resource) from sys.dm_exec_requests where blocking_session_id = s.session_id) as head_wait_resource, 			s.session_id, 			convert(smallint, NULL), 			convert(int, 0), 			r.request_id, 			coalesce(r.transaction_id, st.transaction_id), 			isnull(r.status, 'idle'), 			r.sql_handle, 			r.plan_handle, 			r.statement_start_offset, 			r.statement_end_offset, 			r.wait_type, 			r.wait_time, 			r.wait_resource, 			s.program_name,			case when r.request_id is null then datediff(ss, s.last_request_end_time, getdate()) else datediff(ss, r.start_time, getdate()) end,			convert(int, p.open_tran),			coalesce(r.transaction_isolation_level, s.transaction_isolation_level)		from sys.dm_exec_sessions s			join sys.sysprocesses p on s.session_id = p.spid			left join sys.dm_exec_requests r on s.session_id = r.session_id			left join sys.dm_tran_session_transactions st on s.session_id = st.session_id		where s.session_id in (select blocking_session_id from sys.dm_exec_requests) 			and isnull(r.blocking_session_id, 0) = 0		union all		select b.head_wait_resource, 			r.session_id, 			r.blocking_session_id, 			tree_level + 1, 			r.request_id, 			r.transaction_id, 			r.status, 			r.sql_handle, 			r.plan_handle, 			r.statement_start_offset, 			r.statement_end_offset, 			r.wait_type, 			r.wait_time, 			r.wait_resource, 			NULL,			NULL,			r.open_transaction_count,			r.transaction_isolation_level		from sys.dm_exec_requests r			join blocking_hierarchy b on r.blocking_session_id = b.session_id	)	select b.head_wait_resource,		b.session_id, 		b.request_id, 		b.blocking_session_id, 		b.program_name, 		b.tree_level, 		case when LEN(qt.query_text) < 2048 then qt.query_text else LEFT(qt.query_text, 2048) + N'...' end as query_text,		master.dbo.fn_varbintohexstr(b.sql_handle) as sql_handle, 		master.dbo.fn_varbintohexstr(b.plan_handle) as plan_handle, 		b.statement_start_offset, 		b.statement_end_offset, 		b.status as session_or_request_status, 		b.wait_type, 		b.wait_time, 		b.wait_resource, 		b.transaction_id, 		b.transaction_isolation_level,		b.open_transaction_count,		b.seconds_active_idle,		t.name as transaction_name, 		t.transaction_begin_time, 		t.transaction_type, 		t.transaction_state, 		t.dtc_state, 		t.dtc_isolation_level,		st.enlist_count, 		st.is_user_transaction, 		st.is_local, 		st.is_enlisted, 		st.is_bound	from blocking_hierarchy b		left join sys.dm_tran_session_transactions st on st.transaction_id = b.transaction_id and st.session_id = b.session_id		left join sys.dm_tran_active_transactions t on t.transaction_id = b.transaction_id		outer apply msdb.MS_PerfDashboard.fn_QueryTextFromHandle(b.sql_handle, b.statement_start_offset, b.statement_end_offset) as qtendgoGRANT EXECUTE ON MS_PerfDashboard.usp_Blocking TO publicgoif object_id('MS_PerfDashboard.usp_RequestIoWaits', 'P') is not null	drop procedure MS_PerfDashboard.usp_RequestIoWaitsgocreate procedure MS_PerfDashboard.usp_RequestIoWaits @wait_type nvarchar(128)asbegin	select 		session_id, 		request_id, 		master.dbo.fn_varbintohexstr(sql_handle) as sql_handle,		master.dbo.fn_varbintohexstr(plan_handle) as plan_handle,		case when LEN(qt.query_text) < 2048 then qt.query_text else LEFT(qt.query_text, 2048) + N'...' end as query_text,		statement_start_offset, 		statement_end_offset, 		wait_type, 		wait_time, 		wait_resource,		blocking_session_id	from sys.dm_exec_requests r		outer apply msdb.MS_PerfDashboard.fn_QueryTextFromHandle(sql_handle, statement_start_offset, statement_end_offset) as qt	where msdb.MS_PerfDashboard.fn_WaitTypeCategory(wait_type) = @wait_type --N'Buffer IO'/N'Buffer Latch'endgoGRANT EXECUTE ON MS_PerfDashboard.usp_RequestIoWaits TO publicgoif object_id('MS_PerfDashboard.usp_LargestIoRequests', 'P') is not null	drop procedure MS_PerfDashboard.usp_LargestIoRequestsgocreate procedure MS_PerfDashboard.usp_LargestIoRequestsasbegin	select top 20 		r.session_id,		r.request_id, 		master.dbo.fn_varbintohexstr(sql_handle) as sql_handle,		master.dbo.fn_varbintohexstr(plan_handle) as plan_handle,		case when LEN(qt.query_text) < 2048 then qt.query_text else LEFT(qt.query_text, 2048) + N'...' end as query_text,		r.statement_start_offset, 		r.statement_end_offset, 		r.logical_reads,		r.reads,		r.writes,		r.wait_type, 		r.wait_time, 		r.wait_resource,		r.blocking_session_id,		case when r.logical_reads > 0 then (r.logical_reads - isnull(r.reads, 0)) / convert(float, r.logical_reads)			else NULL			end as cache_hit_ratio	from sys.dm_exec_requests r		join sys.dm_exec_sessions s on r.session_id = s.session_id		outer apply msdb.MS_PerfDashboard.fn_QueryTextFromHandle(r.sql_handle, r.statement_start_offset, r.statement_end_offset) as qt	where s.is_user_process = 0x1 and (r.reads > 0 or r.writes > 0)	order by (r.reads + r.writes) descendgoGRANT EXECUTE ON MS_PerfDashboard.usp_LargestIoRequests TO publicgoif object_id('MS_PerfDashboard.usp_RequestWaits', 'P') is not null	drop procedure MS_PerfDashboard.usp_RequestWaitsgocreate procedure MS_PerfDashboard.usp_RequestWaitsasbegin	select r.session_id, 		r.request_id, 		master.dbo.fn_varbintohexstr(r.sql_handle) as sql_handle, 		master.dbo.fn_varbintohexstr(r.plan_handle) as plan_handle, 		case when LEN(qt.query_text) < 2048 then qt.query_text else LEFT(qt.query_text, 2048) + N'...' end as query_text,		r.statement_start_offset,		r.statement_end_offset,		r.wait_time, 		r.wait_type, 		r.wait_resource,		msdb.MS_PerfDashboard.fn_WaitTypeCategory(wait_type) as wait_category	from sys.dm_exec_requests r		join sys.dm_exec_sessions s on r.session_id = s.session_id		outer apply msdb.MS_PerfDashboard.fn_QueryTextFromHandle(r.sql_handle, r.statement_start_offset, r.statement_end_offset) as qt	where r.wait_type is not null and s.is_user_process = 0x1endgoGRANT EXECUTE ON MS_PerfDashboard.usp_RequestWaits TO publicgoif object_id('MS_PerfDashboard.usp_LatchStats', 'P') is not null	drop procedure MS_PerfDashboard.usp_LatchStatsgocreate procedure MS_PerfDashboard.usp_LatchStatsasbegin	select 		latch_class,		waiting_requests_count,		wait_time_ms,		max_wait_time_ms	from sys.dm_os_latch_stats	where waiting_requests_count > 0endgoGRANT EXECUTE ON MS_PerfDashboard.usp_LatchStats TO publicgoif object_id('MS_PerfDashboard.usp_RequestsWithLatchWaits', 'P') is not null	drop procedure MS_PerfDashboard.usp_RequestsWithLatchWaitsgocreate procedure MS_PerfDashboard.usp_RequestsWithLatchWaitsasbegin	select 		r.session_id, 		r.request_id, 		master.dbo.fn_varbintohexstr(r.sql_handle) as sql_handle,		master.dbo.fn_varbintohexstr(r.plan_handle) as plan_handle,		case when LEN(qt.query_text) < 2048 then qt.query_text else LEFT(qt.query_text, 2048) + N'...' end as query_text,		r.statement_start_offset, 		r.statement_end_offset, 		r.wait_type, 		r.wait_time, 		r.wait_resource	from sys.dm_exec_requests r		outer apply msdb.MS_PerfDashboard.fn_QueryTextFromHandle(r.sql_handle, r.statement_start_offset, r.statement_end_offset) as qt	where msdb.MS_PerfDashboard.fn_WaitTypeCategory(wait_type) = 'Latch'endgoGRANT EXECUTE ON MS_PerfDashboard.usp_RequestsWithLatchWaits TO publicgoif object_id('MS_PerfDashboard.usp_XEventSessions', 'P') is not null	drop procedure MS_PerfDashboard.usp_XEventSessionsgocreate procedure MS_PerfDashboard.usp_XEventSessionsasbegin	select convert(bigint, address) xeaddress,		case when row_num = 1 then session_name else NULL end as session_name,		case when row_num = 1 then create_time else NULL end as create_time,		case when row_num = 1 then target_name else NULL end as target_name,		case when row_num = 1 then execution_count else NULL end as execution_count,		case when row_num = 1 then execution_duration_ms else NULL end as execution_duration_ms,		case when row_num = 1 then dropped_event_count else NULL end as dropped_event_count,		case when row_num = 1 then buffer_policy_desc else NULL end as buffer_policy_desc,		case when row_num = 1 then total_buffer_size else NULL end as total_buffer_size,		event_name,		action_name			from (		select s.address, ROW_NUMBER() over (partition by s.address order by sea.event_name, sea.action_name ) as row_num,		s.name session_name ,s.create_time, st.target_name, st.execution_count, st.execution_duration_ms, 		sea.action_name, sea.event_name, s.dropped_event_count, s.total_buffer_size, s.buffer_policy_desc		from sys.dm_xe_sessions s 		inner join sys.dm_xe_session_targets st		  on s.address = st.event_session_address		inner join sys.dm_xe_session_event_actions sea		  on s.address = sea.event_session_address ) as inner_tendgoGRANT EXECUTE ON MS_PerfDashboard.usp_XEventSessions TO publicgoif object_id('MS_PerfDashboard.usp_QueryStatsDetails ', 'P') is not null	drop procedure MS_PerfDashboard.usp_QueryStatsDetails gocreate procedure MS_PerfDashboard.usp_QueryStatsDetails @query_hash varchar(64), @OrderBy_Criteria nvarchar(128)asbegin	select TOP 50		db_name(qt.database_id) as database_name,		qt.query_text,		qt.encrypted,		creation_time,		last_execution_time,		execution_count,		plan_generation_num,		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_reads,		last_logical_reads,		min_logical_reads,		max_logical_reads,		total_logical_writes,		last_logical_writes,		min_logical_writes,		max_logical_writes,		total_clr_time,		last_clr_time,		min_clr_time,		max_clr_time,		total_elapsed_time,		last_elapsed_time,		min_elapsed_time,		max_elapsed_time,		master.dbo.fn_varbintohexstr(sql_handle) as sql_handle,		master.dbo.fn_varbintohexstr(plan_handle) as plan_handle,		statement_start_offset,		statement_end_offset,		CASE @OrderBy_Criteria 							 WHEN 'Logical Reads' THEN total_logical_reads							 WHEN 'Physical Reads' THEN total_physical_reads							 WHEN 'Logical Writes' THEN total_logical_writes							 WHEN 'CPU' THEN total_worker_time / 1000 							 WHEN 'Duration' THEN total_elapsed_time / 1000 							 WHEN 'CLR Time' THEN total_clr_time/ 1000 			END as sort_value	from sys.dm_exec_query_stats qs	 cross apply msdb.MS_PerfDashboard.fn_QueryTextFromHandle(sql_handle, statement_start_offset, statement_end_offset) qt	where query_hash = MS_PerfDashboard.fn_hexstrtovarbin(@query_hash)	order by sort_value descendgoGRANT EXECUTE ON MS_PerfDashboard.usp_QueryStatsDetails TO publicgoPRINT 'Script completed!';go
 |