首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编写Profiler查询

编写Profiler查询
EN

Stack Overflow用户
提问于 2014-12-12 13:54:34
回答 2查看 71关注 0票数 0

我正在编写一个模拟Server事件探查器的查询,我的版本是Server 2008 --我没有Server,我需要它,此时我得到了这个查询:

代码语言:javascript
复制
Use master
Go

Alter procedure dbo.NS_sp_profilerQuery
    @dbName sysname='',
    @userName sysname=Null,
    @hostName sysname=Null
As
Begin
    --Step 1. Declaration of variables.
    Declare @idDb Int=DB_ID(@dbName);
    Declare @Query Nvarchar(Max);

    --Step 2. SETTING THE query.
    Select @Query = N'Select '+
    N'idProceso=syp.spid,basedatos=DB_NAME(syp.dbid),usuario=syp.loginame,cpu,hostname,espera=lastwaittype,[bloqueadoPor]=blocked,Query=(Select text from ::fn_get_sql(syp.sql_handle)) '+
    N'From master.dbo.sysprocesses syp '+
    N'Where 1=1 '+
    (case when @idDb is null then '' else 'and syp.dbid='+Ltrim(Rtrim(Str(@idDb))) end)+
    (case when @userName is null then '' else ' and Ltrim(Rtrim(syp.loginame))='+Quotename(Ltrim(Rtrim(@userName)),Char(39)) end)+
    (case when @hostName is null then '' else ' and Ltrim(Rtrim(syp.hostname))='+Quotename(Ltrim(Rtrim(@hostName)),Char(39)) end);

    --Step 3. Query and return data.
    Exec(@Query);
End
Go

这个查询在一个点上捕获了所有的东西,我的问题是:什么是捕捉在很长时间内发生的所有事情的最好方法?,做一个循环?

你有什么建议?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-12 18:22:49

这个查询解决了我的需求,它工作了99%,我拍了快照到dbo.sysprocesses。

代码语言:javascript
复制
Use master
Go

Alter procedure dbo.NS_sp_profilerQuery
    @dbName sysname='',
    @userName sysname=Null,
    @hostName sysname=Null,
    @Seconds int
As
Begin

    Declare @SnapShots Table(
    idProceso int,
    idThread int,
    basedatos sysname, 
    usuario sysname, 
    cpu int, 
    hostname sysname, 
    espera sysname, 
    bloqueadoPor int, 
    Query Nvarchar(Max)
);

Declare @Profiler Table(
    idProceso int,
    idThread int,
    basedatos sysname, 
    usuario sysname, 
    cpu int, 
    hostname sysname, 
    espera sysname, 
    bloqueadoPor int, 
    Query Nvarchar(Max)
);

--Paso 1. Declaración de variables.
Declare @idDb Int=DB_ID(@dbName);
Declare @Query Nvarchar(Max);
Declare @HoraFinal Datetime=DateAdd(Second,@Seconds,Getdate());

While Getdate()<=@HoraFinal
Begin
    --Paso 2. Seteo de consulta.
    Select @Query = N'Select '+
    N'idProceso=syp.spid,idThread=syp.kpid,basedatos=DB_NAME(syp.dbid),usuario=syp.loginame,cpu,hostname,espera=lastwaittype,[bloqueadoPor]=blocked,Query=(Select text from ::fn_get_sql(syp.sql_handle)) '+
    N'From master.dbo.sysprocesses syp '+
    N'Where 1=1 '+
    (case when @idDb is null then '' else 'and syp.dbid='+Ltrim(Rtrim(Str(@idDb))) end)+
    (case when @userName is null then '' else ' and Ltrim(Rtrim(syp.loginame))='+Quotename(Ltrim(Rtrim(@userName)),Char(39)) end)+
    (case when @hostName is null then '' else ' and Ltrim(Rtrim(syp.hostname))='+Quotename(Ltrim(Rtrim(@hostName)),Char(39)) end);

    --Paso 3. Consulta y retorno de datos.
    Insert Into @SnapShots(idProceso,idThread,basedatos,usuario,cpu,hostname,espera,bloqueadoPor,Query)
    Exec(@Query);

    Insert Into @Profiler(idProceso,idThread,basedatos,usuario,cpu,hostname,espera,bloqueadoPor,Query)
    Select 
        sna.idProceso,sna.idThread,sna.basedatos,sna.usuario,sna.cpu,sna.hostname,sna.espera,sna.bloqueadoPor,sna.Query 
    From @SnapShots sna
    Left Join @Profiler pro
        On (sna.idProceso=pro.idProceso and sna.idThread=pro.idThread)
    Where pro.idProceso is null;

    Delete From @SnapShots;
End

Select 
    idProceso,idThread,basedatos,usuario,cpu,hostname,espera,bloqueadoPor,Query
From @Profiler;

End
Go
票数 0
EN

Stack Overflow用户

发布于 2014-12-12 15:25:22

用这样的一个查询来模拟分析器是不可能的。您将只获得当前正在运行的查询的快照。如果您希望看到需要很长时间才能运行的查询,也许这对您来说已经足够好了,但在这种情况下,我建议您查看一下dmv sys.dm_exec_query_stats。这样,您就可以检查哪些查询占用了大量的资源或时间。

示例,包括查询计划:

代码语言:javascript
复制
-- List top 100 queries that has the highest average logical reads
select top (100) *
from sys.dm_exec_query_stats qs
  cross apply sys.dm_exec_query_plan(qs.plan_handle) p
order by cast(qs.total_logical_reads as float) / qs.execution_count desc;

有许多有趣的列要排序。

如果您真的想捕获所有已执行的查询,则应该查看扩展事件。您可以记录您想要的查询,例如稍后可以检查的文件或环形缓冲区。在设置它时需要做一些工作,但是正式的sql server文档中有关于如何设置它的好信息。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27445183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档