我们正在使用 SQL Server 2012 运行 Dynamics AX 2012 安装。我知道不应再使用游标,但 AX 正在使用它,我们无法更改此行为,因此我们必须使用它。
今天我发现了一个非常糟糕的查询,读取次数超过 5300 万次,执行时间超过 20 分钟。
我通过我们的监控工具 SentryOne 捕获了这个查询。
declare @p1 int
set @p1=1073773227
declare @p2 int
set @p2=180158805
declare @p5 int
set @p5=16
declare @p6 int
set @p6=1
declare @p7 int
set @p7=2
exec sp_cursorprepexec @p1 output,@p2 output,N'@P1 bigint,@P2 nvarchar(5),@P3 bigint,@P4 nvarchar(8),@P5 bigint,@P6 bigint,@P7 bigint,@P8 bigint,@P9 bigint,@P10 bigint,@P11 bigint,@P12 bigint,@P13 bigint,@P14 bigint,@P15 bigint,@P16 bigint,@P17 bigint,@P18 bigint,@P19 nvarchar(5),@P20 bigint,@P21 bigint,@P22 bigint,@P23 bigint,@P24 bigint',N'SELECT T1.PRODUCT,T1.EXTERNALVENDPARTY,T1.LIFECYCLESTATUS,T1.RECID,T2.ECORESPRODUCT,T2.ECORESDISTINCTPRODUCTVARIANT,T2.SGE,T2.ECORESREFORDERNUM,T2.ORDERNUM,T2.RECID,T3.ECORESREFORDERNUM,T3.NAME1,T3.NAME2,T3.NAME3,T3.RECID,T4.ECORESPRODUCT,T4.EXTERNALITEMID,T4.ECORESDISTINCTPRODUCTVARIANT,T4.RECID,T5.RECID,T5.PERSON,T6.RECID,T6.NAME,T6.INSTANCERELATIONTYPE,T7.RECID,T7.NAME,T7.INSTANCERELATIONTYPE,T8.PARTY,T8.ACCOUNTNUM,T8.RECID,T9.RECID,T9.DISPLAYPRODUCTNUMBER,T9.INSTANCERELATIONTYPE,T10.PRODUCT,T10.CATEGORY,T10.RECID,T11.RECID,T11.CODE,T11.NAME,T11.INSTANCERELATIONTYPE FROM INVENTTABLE T1 CROSS JOIN ECORESPRODUCTORDERNUM …Run Code Online (Sandbox Code Playgroud) performance sql-server cursors sql-server-2012 microsoft-dynamics performance-tuning
我们在 VMWare 主机中有一个 SQL Server 2012 SP 2 CU 8 实例。操作系统为 Windows Server 2012 R2。
Windows 任务管理器说我们有两个套接字和 8 个虚拟内核。此数字对应于来宾下方的实际硬件。
在任务管理器中,我也无法将视图更改为 NUMA 节点。
在 SQL Server 中仍然只能看到一个 NUMA 节点

来自 Glen Berrys 诊断查询的这个片段也给了我这个信息
EXEC sys.xp_readerrorlog 0, 1, N'detected', N'socket';
Run Code Online (Sandbox Code Playgroud)
SQL Server 检测到 2 个插槽,每个插槽 4 个内核,每个插槽 4 个逻辑处理器,总共 8 个逻辑处理器;使用基于 SQL Server 许可的 8 个逻辑处理器。这是一条情报信息; 无需用户操作。
根据所有这些信息,我可以怀疑我们仅在一个 NUMA 节点上运行,但跨两个套接字运行。
我的问题:
我认为有很多关于 NUMA 节点的错误信息。如果有人可以回答我的问题或指出详细解释这个概念的有用资源,那将不胜感激。