标签: sql-server-profiler

是否可以自动化 SQL Server 2008 探查器?

有一篇关于有用的 SQL 技巧的帖子。在这里我将提到SQL Server Profiler工具,因为它帮助我减少了编写 SQL。我会编写 SQL 来询问、理解或再次猜测数据库业务逻辑。

Profiler 非常有用,尤其是在应用程序代码已嵌入 SQL 并且您想在尽可能短的时间内弄清楚它在做什么的情况下。(此外,您可能不知道应用程序环境中使用的是哪个源代码版本,或者更糟糕的是,在没有可用源代码的情况下!)。

我想知道探查器是否有可以挂钩的 API?

当我们想通过设置环境变量/标志(例如 PROFILER_ON=TRUE)快速检查系统内调用了什么 SQL 时,这将非常有用。然后系统可以启动 SQL 分析器,设置各种跟踪属性,然后写入日志或表 - 支持团队可以查看这些信息。

我想编写一个组件来打开分析器并监视生产环境(在安静的时候),所以不能真正改变代码库(应用程序代码和 SQL 存储过程)。

database sql-server automation sql-server-profiler

4
推荐指数
1
解决办法
4240
查看次数

NHibernate需要很长时间才能运行查询

这是使用Fluent NHibernate完成的

我有一个NHibernate查找,它从一个表中检索数据.如果我使用生成的sql并通过查询分析器运行它,运行需要大约18ms.

使用NHProfiler,我得到的查询持续时间为~1800ms - 比sql长100倍!

Query duration
 - Database only:1800ms
 - Total: 1806ms
Run Code Online (Sandbox Code Playgroud)

正在填充的对象包含一个子类,但是这个子进程是从NHibernate二级缓存加载的

正在返回的数据被分页(每个查询50个),尽管据我所知,这应该没有任何区别

我还有一个计数运行,再次,这在查询分析器中需要大约4ms,根据NHProfiler需要大约1800ms.

NH Profiler是显示查询执行时间还是检索的完整时间,映射类并构造对象图?如果它是前者 - 为什么它比直接运行查询需要更长的时间?

编辑:刚刚发现Ayende关于NH Profiler中给出的查询持续时间值的这篇文章:http://ayende.com/Blog/archive/2009/06/28/nh-prof-query-duration.aspx - 所以它绝对是需要很长时间的数据库查询

nhibernate fluent sql-server-profiler nhprof

4
推荐指数
1
解决办法
2220
查看次数

LINQ + TransactionScope不会更改SQL Server Profiler中的隔离级别

我正在使用以下格式使用linq将更改提交到我的数据库.

Begin Transaction (Scope Serialized, Required)
    Check Business Rule 1...N
    MyDataContext.SubmitChanges()
    Save Changes Done In Previous Query To Log File
End Transaction Scope
Run Code Online (Sandbox Code Playgroud)

但是在SQL Server探查器中,我在Connection:Start中看到以下行.

set transaction isolation level read committed
Run Code Online (Sandbox Code Playgroud)

我经历了这个(http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/93a45026-0425-4d49-a4ac-1b882e90e6d5)并认为我得到了答案;

直到我在Microsoft Connect上看到这个(https://connect.microsoft.com/VisualStudio/feedback/details/565441/transactionscope-linq-to-sql?wa=wsignin1.0).

有人可以告诉我,我的代码是否实际在序列化隔离级别下执行,或者它是否只是在read committed下运行?

transactions sql-server-profiler isolation-level sql-server-2008 linq-to-sql

4
推荐指数
1
解决办法
3803
查看次数

SQL Server Profiler中的死锁图显示相同群集密钥上的相互锁定

我试图使用SQL Server Profiler确定死锁的原因.这是死锁图: 死锁图 这两个语句都是插入,后面跟着select scope_identity(); 实际上有两个并发进程,它们在一个循环中重复执行insert-select_identity.

我期望插入聚簇索引进行独占锁定,并且select获取非聚集索引的共享锁,然后它们等待彼此释放它们各自的indeces.

我看到的是两个进程都在等待释放相同的资源 - 聚集索引.怎么会这样?特定的追索权应属于一个过程或另一个过程.我在这里想念什么?感谢所有提前.

编辑:是的,隔离级别是Serializible.PS:可能,我对非聚集索引的共享锁的假设是错误的,只要我的select不包含where语句

Edit2:这是xml的一部分:

 <resource-list>
   <keylock hobtid="72057594148028416" dbid="29" objectname="<confidential>" indexname="PK_WP_Inbound_StockTransactionLine" id="lock9641700" mode="RangeS-S" associatedObjectId="72057594148028416">
    <owner-list>
     <owner id="process8e09288" mode="RangeS-S"/>
    </owner-list>
    <waiter-list>
     <waiter id="process991ce08" mode="RangeI-N" requestType="convert"/>
    </waiter-list>
   </keylock>
   <keylock hobtid="72057594148028416" dbid="29" objectname="<confidential>" indexname="PK_WP_Inbound_StockTransactionLine" id="lock9641700" mode="RangeS-S" associatedObjectId="72057594148028416">
    <owner-list>
     <owner id="process991ce08" mode="RangeS-S"/>
    </owner-list>
    <waiter-list>
     <waiter id="process8e09288" mode="RangeI-N" requestType="convert"/>
    </waiter-list>
   </keylock>
  </resource-list>
Run Code Online (Sandbox Code Playgroud)

根据这个,我认为它是由SERIALIZABLE隔离引起的范围扫描(谷歌搜索).但是,我仍然不明白这是怎么发生的,建议的补救措施是什么.

sql-server indexing deadlock sql-server-profiler

4
推荐指数
1
解决办法
1603
查看次数

如何关闭我的SQL Server Profiler上的"报表服务器"中的行?

这是我第一次使用SQL Server Profiler,我想知道如何在我的SQL Server Profiler上关闭应用程序"Report Server"中的事件行?我只想记录某些活动,如LINQPad和Entity Framework中的活动.

谢谢您的帮助!

sql sql-server filter sql-server-profiler

3
推荐指数
1
解决办法
608
查看次数

请参阅SQL Server Profiler中的运行过程

如何在SQL Server Profiler中查看运行过程?

它仅显示执行完成的时间.

我有一些程序需要我注意,如果执行时间太长.完成后了解对我来说毫无用处

谢谢

sql-server sql-server-profiler sql-server-2008

3
推荐指数
1
解决办法
3533
查看次数

实体框架和SQL Server Profiler

在通过Web应用程序运行的EF查询与将Profiler生成的T-SQL直接运行到SQL Query窗口之间,我遇到了一些性能评估问题。

以下是通过Web应用程序执行的我的EF查询:

IEnumerable<application> _entityList = context.applications
                    .Include(context.indb_generalInfo.EntitySet.Name)
                    .Include(context.setup_budget.EntitySet.Name)
                    .Include(context.setup_committee.EntitySet.Name)
                    .Include(context.setup_fund.EntitySet.Name)
                    .Include(context.setup_appStatus.EntitySet.Name)
                    .Include(context.appSancAdvices.EntitySet.Name)
                    .Where(e => e.indb_generalInfo != null);

                if (isIFL != null)
                    _entityList = _entityList.Where(e => e.app_isIFL == isIFL);

                int _entityCount = _entityList.Count(); // hits the database server at this line
Run Code Online (Sandbox Code Playgroud)

在SQL Profiler中跟踪上述EF查询时,发现执行该操作大约需要221'095 ms。(具有30,000+的应用程序表,具有11,000+的indb_generalInfo和具有30,000+记录的appSancAdvices)。

但是,当我从Profiler复制T-SQL并直接从“查询”窗口运行它时,它只需要大约4000毫秒

为什么会这样呢?

c# performance entity-framework sql-server-profiler

3
推荐指数
1
解决办法
4352
查看次数

可以在sql探查器中读取的SQL'注释'

我尝试了几种方法,例如使用双连字符,即--THIS IS A COMMENT,但是当在探查器中读取已执行的sql时,注释将被剥离,仅留下正在执行的原始SQL。

我想这样做是为了在查看每分钟有8000多个条目的SQL事件探查器输出时快速识别查询及其来源。

--Method signature and an application name
Run Code Online (Sandbox Code Playgroud)

例如

--MyMethod(string username) in MyFunkyAppName.
Run Code Online (Sandbox Code Playgroud)

我正在使用EntityFramework 4.3,它使linq到实体变得更加复杂,而linq到sql的少量散布则带来了很好的效果。

编辑:我知道添加一个狡猾的where子句或使用匿名属性来识别事物的解决方案,例如在SQL Profiler中找到巧妙的LINQ查询的聪明技巧,但我希望可以使用一种更简单的方法,也可以是一种通用的方法。

sql linq-to-entities entity-framework sql-server-profiler linq-to-sql

3
推荐指数
1
解决办法
417
查看次数

SQL Server Profiler:获取存储过程名称

我正在运行SQL Server Profiler(SQL Server 2008).有没有办法查看正在执行的存储过程的名称?我正在剖析SP:StartedSP:Completed.TextData列没有用,因为我的存储过程已加密,因此TextData显示" - 加密文本".

Profiler截图

sql-server stored-procedures sql-server-profiler sql-server-2008

3
推荐指数
1
解决办法
3064
查看次数

参数化SQL和NULL运行缓慢

我正在从.net调用一些参数化的sql.我不确定为什么但是当检查参数是否为NULL时,sql运行速度非常慢,而不包括:

所以这:

exec sp_executesql N'
 SELECT [id]
 FROM [tblAddress] (nolock)
 WHERE 1 = 1
 AND ([id] = @id OR @id  IS NULL)

',N'@id int',
@id=4395
Run Code Online (Sandbox Code Playgroud)

然后运行得更快:

exec sp_executesql N'
 SELECT [id]
 FROM [tblAddress] (nolock)
 WHERE 1 = 1
 AND ([id] = @id)

',N'@id int',
@id=4395
Run Code Online (Sandbox Code Playgroud)

运行SQL事件探查器超过100万行的最高查询的持续时间为175,其读取为3720,但第二个查询的持续时间为1,只有3个读取.

为什么会有这样的差异?如何改进呢?

sql t-sql sql-server sql-server-profiler

2
推荐指数
1
解决办法
1297
查看次数