Gibt es ein Programm oder eine SQL-Abfrage, mit der ich herausfinden kann, welche SQL-Abfragen auf einem SQL Server 2012 ausgeführt werden? Ich glaube, in früheren Versionen von SQL Server gab es ein Tool, mit dem der tatsächliche Abfrageinhalt oder der Name der gespeicherten Prozedur angezeigt wurde?
Antworten
Zu viele Anzeigen?Ich verwende die folgende Abfrage
SELECT SPID = er.session_id
,STATUS = ses.STATUS
,[Login] = ses.login_name
,Host = ses.host_name
,BlkBy = er.blocking_session_id
,DBName = DB_Name(er.database_id)
,CommandType = er.command
,ObjectName = OBJECT_NAME(st.objectid)
,CPUTime = er.cpu_time
,StartTime = er.start_time
,TimeElapsed = CAST(GETDATE() - er.start_time AS TIME)
,SQLStatement = st.text
FROM sys.dm_exec_requests er
OUTER APPLY sys.dm_exec_sql_text(er.sql_handle) st
LEFT JOIN sys.dm_exec_sessions ses
ON ses.session_id = er.session_id
LEFT JOIN sys.dm_exec_connections con
ON con.session_id = ses.session_id
WHERE st.text IS NOT NULL
Je nach Ihren Berechtigungen könnte diese Abfrage funktionieren:
SELECT sqltext.TEXT,
req.session_id,
req.status,
req.command,
req.cpu_time,
req.total_elapsed_time
FROM sys.dm_exec_requests req
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS sqltext
Ref: http://blog.sqlauthority.com/2009/01/07/sql-server-find-currently-running-query-t-sql
Dies ist aus dem Buch "SQL Server DMV's In Action":
Die Ausgabe zeigt die spid (Prozesskennung), die ecid (dies ist vergleichbar mit einem Thread innerhalb derselben spid und nützlich, um parallel laufende Abfragen zu identifizieren), den Benutzer, der das SQL ausführt, den Status (ob das SQL läuft oder wartet), den Wartestatus (warum es wartet), den Hostnamen, den Domänennamen und die Startzeit (nützlich, um festzustellen, wie lange der Batch schon läuft).
Der schöne Teil ist die Abfrage und die übergeordnete Abfrage. Das zeigt zum Beispiel eine gespeicherte Prozedur als übergeordnete und die Abfrage innerhalb der gespeicherten Prozedur, die gerade läuft. Das war für mich sehr praktisch. Ich hoffe, das hilft auch anderen.
USE master
GO
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SELECT
er.session_Id AS [Spid]
, sp.ecid
, er.start_time
, DATEDIFF(SS,er.start_time,GETDATE()) as [Age Seconds]
, sp.nt_username
, er.status
, er.wait_type
, SUBSTRING (qt.text, (er.statement_start_offset/2) + 1,
((CASE WHEN er.statement_end_offset = -1
THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2
ELSE er.statement_end_offset
END - er.statement_start_offset)/2) + 1) AS [Individual Query]
, qt.text AS [Parent Query]
, sp.program_name
, sp.Hostname
, sp.nt_domain
FROM sys.dm_exec_requests er
INNER JOIN sys.sysprocesses sp ON er.session_id = sp.spid
CROSS APPLY sys.dm_exec_sql_text(er.sql_handle)as qt
WHERE session_Id > 50
AND session_Id NOT IN (@@SPID)
ORDER BY session_Id, ecid
Für die Installation des SQL-Profilers benötigen Sie folgende Informationen http://msdn.microsoft.com/en-us/library/bb500441.aspx . Ich würde Ihnen jedoch empfehlen, sich dieses Dokument durchzulesen http://blog.sqlauthority.com/2009/08/03/sql-server-introduction-to-sql-server-2008-profiler-2/ wenn Sie dies in Ihrer Produktionsumgebung tun möchten. Es gibt noch eine andere, bessere Möglichkeit, die Abfragen zu betrachten. Schauen Sie sich diese an und sehen Sie, ob sie hilft http://www.youtube.com/watch?v=vvziPI5OQyE
- See previous answers
- Weitere Antworten anzeigen