我们的一个生产系统在将单个插入语句从我们的用户数据库插入临时表时出现了问题。当我注释掉插入/选择时,有问题的存储过程会及时运行,因此我对隔离问题充满信心。
当我取消注释有问题的插入/选择时,调用的一系列存储过程基本上会停止。我在 tempdb 或我们的任何用户数据库中按年龄排列的 Top Transactions 中看不到任何内容。当数据库处于“静止”状态时,我在 Activity Monitor 中没有看到任何与 Activity Monitor 的信息有偏差的东西,除了 CPU 处于约 20% 的水平。
行为如下:当我设置然后执行复制案例时,到达有问题的插入/选择时,我看到一个 SOS_SCHEDULER_YIELD 并且有一个 ENCRYPTION_SCAN。大约五个小时后,我将看到我们的存储过程的处理恢复并且活动将完成(我在每个不同的操作周围放置了快速而肮脏的日志语句)。
我还用执行时的值替换了插入的选择部分中的变量,并运行了选择查询本身,它在五秒钟内返回。
有问题的用户数据库将 FALSE 作为其启用加密的值,tempdb 也是如此。有问题的操作发生在大约 65k 行数据上,我只用 1k 行尝试过,并且行为仍然存在,尽管花费的时间要少得多。
单用户数据库是此行为的唯一实例。我已经通过该用户数据库的备份在本地复制了它。我们有大约 70 名其他软件用户没有出现此问题。
鉴于上述信息,我的问题是,为什么我们的存储过程的处理停止了?由于期望得到准确答案可能是乐观的,因此调试此问题的正确步骤是什么?也许在 dm_tran_locks、dm_exec_requests、dm_tran_database_transactions、dm_os_schedulers、dm_exec_sessions 之类的 DMV 中有一些东西,虽然它们为我提供了一些信息,但我并没有以指向解决方案的方式解释或理解输出。
以下是有问题的插入/选择:
INSERT INTO #TS_EVENT_DATA
( EVENT_FK,
EVENT_TYPE_CR_FK,
EVENT_ENTITY_CLASS_CR_FK,
userDatabase_ID,
DATA_NAME_FK,
IMPORT_JOB_FK,
PRODUCT_STRUCTURE_FK,
ORG_ENTITY_STRUCTURE_FK,
ENTITY_CLASS_CR_FK,
ENTITY_DATA_NAME_FK,
ENTITY_STRUCTURE_FK,
DATA_SET_FK,
DATA_TYPE_CR_FK,
ORG_IND,
TABLE_NAME,
NET_VALUE1_NEW,
NET_VALUE2_NEW,
NET_VALUE3_NEW,
NET_VALUE4_NEW,
NET_VALUE5_NEW,
NET_VALUE6_NEW,
NET_VALUE1_CUR,
NET_VALUE2_CUR,
NET_VALUE3_CUR,
NET_VALUE4_CUR,
NET_VALUE5_CUR,
NET_VALUE6_CUR,
PERCENT_CHANGE1,
PERCENT_CHANGE2,
PERCENT_CHANGE3,
PERCENT_CHANGE4,
PERCENT_CHANGE5,
PERCENT_CHANGE6,
VALUE_UOM_CODE_FK,
ASSOC_UOM_CODE_FK,
VALUES_SHEET_NAME,
UOM_CONVERSION_FACTOR, …
Run Code Online (Sandbox Code Playgroud)