首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为SQLHANDLE检测到无限重编译的可能性。

为SQLHANDLE检测到无限重编译的可能性。
EN

Database Administration用户
提问于 2015-09-07 11:50:08
回答 2查看 10.7K关注 0票数 13

我一直在sql错误日志中找到奇怪的错误消息:

Bocss:同样的僵局每小时都会发生-需要调查

此外,其他SPID的错误日志中也列出了许多重新编译的内容,如下所示:

09/04/2015 14:30:10,未知,检测到SQLHANDLE 0x0200000059631A288882589E0C54B76404CAE1B97E08D3680000000000000000000000000000000000000000 PlanHandle 0x0600040059631A2860A62B654100000001000000000000000000000000000000000000000000000000000000启动偏移量1038结束偏移量2600可能无限重编译。最后一次重新编译的原因是2.09/04/2015 14:30:10,未知的spid150,对SQLHANDLE 0x02000000EF886F018C4E0B163812B8B20150FE8FC7E6A06A0000000000000000000000000000000000000000 PlanHandle 0x06000400EF886F01901A816E0600000001000000000000000000000000000000000000000000000000000000启动偏移量998结束偏移量2520检测到无限重编译。最后一次重新编译的原因是2.09/04/2015 14:30:09,未知的spid67,对SQLHANDLE 0x0200000057C4C632D9052275CFF2B683B80F29501EE91D730000000000000000000000000000000000000000 PlanHandle 0x0600040057C4C63200EAC2BE3000000001000000000000000000000000000000000000000000000000000000启动偏移量1064结束偏移量2652检测到无限重编译。最后一次重新编译的原因是2.09/04/2015 14:30:09,未知的spid163,对SQLHANDLE 0x02000000E7C7BF0E5D70DE55759C7842860272AD474D69AB0000000000000000000000000000000000000000 PlanHandle 0x06000400E7C7BF0EF0EB68A52C00000001000000000000000000000000000000000000000000000000000000启动偏移量1028结束偏移量2580检测到无限重编译。最后一次重新编译的原因是2。

是什么导致了这一切?

看来我已经没有计划了。

遵循这篇文章的建议,http://www.sqlservercentral.com/Forums/Topic1479420-146-1.aspx

然后,作为安全措施禁用全文目录,这并没有什么不同,所以我完全回滚更改(删除新对象等)。这也没有什么区别,最后唯一似乎停止的是重新启动SQL实例,这立即解决了这个问题。

这也解决了我的问题,然而,我还是要找出到底是什么导致了这场混乱?

EN

回答 2

Database Administration用户

回答已采纳

发布于 2015-09-07 16:59:51

根据&上的错误日志中的无限重编译消息,当批处理中的语句在一行中重新编译100次时,将触发此消息。

此消息不一定意味着存在问题;它的存在是为了帮助排除那些可能经常重新编译的语句(例如,由于统计数据的快速变化),以及真正的无限编译循环(在极端情况下是罕见的)。

您应该首先从所提供的信息中标识触发语句,并在数字代码上下文中对其进行评估,给出重新编译的原因。在联机丛书中的几个地方都有这些代码及其含义的表格,包括在SP:重新编译事件类下面。

在Server 2012中计划缓存和重新编译中有更多的信息可用。

票数 14
EN

Database Administration用户

发布于 2021-04-10 10:12:46

在遇到这个剧本之前,我也找不到该计划,它找到了引发该警告的确切的sql语句:

代码语言:javascript
复制
Declare @ErrorLog Table (LogID int identity(1, 1) not null primary key,
        LogDate datetime null, 
        ProcessInfo nvarchar(100) null,
        LogText nvarchar(4000) null);

Insert Into @ErrorLog (LogDate, ProcessInfo, LogText)
Exec master..xp_readerrorlog;

With Recompiles
As (Select LogID, LogDate,
        SPID = Replace(ProcessInfo, 'spid', ''),
        SQLHandle = Convert(varbinary(64),
                SUBSTRING(LogText, CHARINDEX('SQLHANDLE', LogText) + 10,
                    CharIndex(',', LogText) - CHARINDEX('SQLHANDLE', LogText) - 10), 1),
        PlanHandle = Convert(varbinary(64),
                SUBSTRING(LogText, CHARINDEX('PLANHANDLE', LogText) + 11,
                    CharIndex(',', LogText, CHARINDEX('PLANHANDLE', LogText)) -
                    CHARINDEX('PLANHANDLE', LogText) - 11), 1),
        StartingOffset = Convert(int,
                SUBSTRING(LogText, CHARINDEX('starting offset', LogText) + 16,
                    CharIndex(',', LogText, CHARINDEX('starting offset', LogText)) -
                    CHARINDEX('starting offset', LogText) - 16)),
        EndingOffset = Convert(int,
                SUBSTRING(LogText, CHARINDEX('ending offset', LogText) + 14,
                    CharIndex('.', LogText, CHARINDEX('ending offset', LogText)) -
                    CHARINDEX('ending offset', LogText) - 14)),
        LastRecompileReason = SUBSTRING(LogText, CHARINDEX('last recompile reason was', LogText) + 26,
                CharIndex('.', LogText, CHARINDEX('last recompile reason was', LogText)) -
                CHARINDEX('last recompile reason was', LogText) - 26)
    From @ErrorLog
    Where CharIndex('A possible infinite recompile was detected for SQLHANDLE', LogText) > 0)
Select R.SPID, R.LogDate,
    LastRecompileReason = Case R.LastRecompileReason When 1 Then 'Schema changed'
            When 2 Then 'Statistics changed (' + R.LastRecompileReason + ')'
            When 3 Then 'Deferred compile (' + R.LastRecompileReason + ')'
            When 4 Then 'Set option changed (' + R.LastRecompileReason + ')'
            When 5 Then 'Temp table changed (' + R.LastRecompileReason + ')'
            When 6 Then 'Remote rowset changed (' + R.LastRecompileReason + ')'
            When 7 Then 'For Browse permissions changed (' + R.LastRecompileReason + ')'
            When 8 Then 'Query notification environment changed (' + R.LastRecompileReason + ')'
            When 9 Then 'Partition view changed (' + R.LastRecompileReason + ')'
            When 10 Then 'Cursor options changed (' + R.LastRecompileReason + ')'
            When 11 Then 'Option (recompile) requested (' + R.LastRecompileReason + ')'
            Else 'Unknown (' + R.LastRecompileReason + ')'
        End,
    DBName = DB_NAME(ST.dbid),
    ObjectName = IsNull(OBJECT_SCHEMA_NAME(ST.objectid, ST.dbid) + N'.', '') +
        IsNull(OBJECT_NAME(ST.objectid, ST.dbid), N'ad hoc or prepared'),
    Command = SUBSTRING(ST.TEXT,
            R.StartingOffset / 2 + 1,
            ((Case R.EndingOffset When -1 THEN DATALENGTH(ST.text)
                Else R.EndingOffset
            End) - R.StartingOffset) / 2 + 1),
    QueryPlan = QP.query_plan,
    FullSQLText = ST.text
From Recompiles As R
Outer Apply sys.dm_exec_sql_text(R.SQLHandle) As ST
Outer Apply sys.dm_exec_query_plan(R.PlanHandle) As QP
Order By R.LogID Desc;
票数 2
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/114354

复制
相关文章

相似问题

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