SQL Server Express (localdb) 等待操作超时 - 查询随机超时?
SQL Server Express (localdb) The wait operation timed out - query timing out at random?
我有简单的 SELECT
查询返回相对较大的数据集(11k 行),当我的应用 运行 时,它 运行 经常超时。这是在我自己的开发笔记本电脑上使用 localdb 发生的。当它工作时,它几乎立即 returns 数据,其他时候 - Microsoft.Data.SqlClient.SqlException: The wait operation timed out.
。当它使用 SSMS 失败时也感觉迟钝但它总是完成查询。
SQL如下
(@CurrentUserId int)
-- First, select Draft issues created by current user
SELECT [I].[IssueId]
,[I].[IssueGuid]
,[I].[IssueNumber]
,[I].[DateCreated]
,[I].[DateOpened]
,[I].[DateLastModified]
,[I].[DateClosed]
,[I].[Title]
,[I].[Type]
,[I].[Status]
,[I].[CreatedByUserId]
,1 AS [OrderKey]
FROM [cm].[IssuesTbl] [I]
WHERE [I].[Status] = 0 AND [I].[CreatedByUserId] = @CurrentUserId
UNION ALL
-- Last, select Open issues
SELECT [I].[IssueId]
,[I].[IssueGuid]
,[I].[IssueNumber]
,[I].[DateCreated]
,[I].[DateOpened]
,[I].[DateLastModified]
,[I].[DateClosed]
,[I].[Title]
,[I].[Type]
,[I].[Status]
,[I].[CreatedByUserId]
,2 AS [OrderKey]
FROM [cm].[IssuesTbl] [I]
WHERE [I].[Status] = 1
ORDER BY [OrderKey] ASC, [I].[DateOpened] DESC, [I].[DateCreated] DESC
执行计划是here.
我安装了 Blitz 和 运行 sp_BlitzFirst
来给我一些想法,但我不确定要寻找什么以及如何解决问题。请帮忙。
@@version:
Microsoft SQL Server 2016 (SP1) (KB3182545) - 13.0.4001.0 (X64) Oct 28 2016 18:17:30 Copyright (c) Microsoft Corporation Express Edition (64-bit) on Windows 10 Enterprise 6.3 <X64> (Build 17134: )
sp_BlitzFirst:
10 Server Performance Poison Wait Detected: RESOURCE_SEMAPHORE
For 4 seconds over the last 5 seconds, SQL Server was waiting on this particular bottleneck.
200 Wait Stats RESOURCE_SEMAPHORE
For 4 seconds over the last 5 seconds, SQL Server was waiting on this particular bottleneck.
看来你的记忆力有问题。您应该 运行 检查您的状态:
SELECT
((t1.requested_memory_kb)/1024.00) MemoryRequestedMB
, CASE WHEN t1.grant_time IS NULL THEN 'Waiting' ELSE 'Granted' END AS RequestStatus
, t1.timeout_sec SecondsToTerminate
FROM sys.dm_exec_query_memory_grants t1
CROSS APPLY sys.dm_exec_sql_text(t1.sql_handle) t2
您不想等待。同样,你应该 运行
SELECT total_physical_memory_kb, available_physical_memory_kb,
total_page_file_kb, available_page_file_kb,
system_memory_state_desc
FROM sys.dm_os_sys_memory WITH (NOLOCK) OPTION (RECOMPILE);
这里你要的是Available physical memory is high
。如果你不这样做,那就意味着你的记忆力有问题。那么问题是你是否有竞争过程。
您可以尝试的一些事情
- 查询计划在 table 上进行了两次全聚簇索引扫描。鉴于您可能需要至少全部阅读一次(以获取未解决的问题),您最好使用单个 SELECT 而不是 UNION。
- 如果您可以使用索引进行查找并避免完整的 table/clustered 索引扫描,则 UNION 方法非常有效。如果你没有它可以使用的索引,那么你也可以限制你需要读取数据的次数。
- order-by 占用内存(排序占用大量 CPU 和内存)。是否可以通过 ID 而不是 DateOpened 来订购?
- 根据可用的状态和每个状态的行数,您在 [cm].[IssuesTbl].[Status]
上放置了一个 non-clustered 索引
这是我建议的代码。我将顺序更改为以 Status
开头,因为它已经按顺序排列,但我没有将第二个字段更改为 ID - 但如果可以,请执行此操作。
SELECT [I].[IssueId]
,[I].[IssueGuid]
,[I].[IssueNumber]
,[I].[DateCreated]
,[I].[DateOpened]
,[I].[DateLastModified]
,[I].[DateClosed]
,[I].[Title]
,[I].[Type]
,[I].[Status]
,[I].[CreatedByUserId]
,CASE WHEN [I].[Status]=1 THEN 2 ELSE 1 END AS [OrderKey]
FROM [cm].[IssuesTbl] [I]
WHERE ([I].[Status] = 1)
OR ([I].[Status] = 0 AND [I].[CreatedByUserId] = @CurrentUserId)
ORDER BY [I].[Status] ASC, [I].[DateOpened] DESC, [I].[DateCreated] DESC
我有简单的 SELECT
查询返回相对较大的数据集(11k 行),当我的应用 运行 时,它 运行 经常超时。这是在我自己的开发笔记本电脑上使用 localdb 发生的。当它工作时,它几乎立即 returns 数据,其他时候 - Microsoft.Data.SqlClient.SqlException: The wait operation timed out.
。当它使用 SSMS 失败时也感觉迟钝但它总是完成查询。
SQL如下
(@CurrentUserId int)
-- First, select Draft issues created by current user
SELECT [I].[IssueId]
,[I].[IssueGuid]
,[I].[IssueNumber]
,[I].[DateCreated]
,[I].[DateOpened]
,[I].[DateLastModified]
,[I].[DateClosed]
,[I].[Title]
,[I].[Type]
,[I].[Status]
,[I].[CreatedByUserId]
,1 AS [OrderKey]
FROM [cm].[IssuesTbl] [I]
WHERE [I].[Status] = 0 AND [I].[CreatedByUserId] = @CurrentUserId
UNION ALL
-- Last, select Open issues
SELECT [I].[IssueId]
,[I].[IssueGuid]
,[I].[IssueNumber]
,[I].[DateCreated]
,[I].[DateOpened]
,[I].[DateLastModified]
,[I].[DateClosed]
,[I].[Title]
,[I].[Type]
,[I].[Status]
,[I].[CreatedByUserId]
,2 AS [OrderKey]
FROM [cm].[IssuesTbl] [I]
WHERE [I].[Status] = 1
ORDER BY [OrderKey] ASC, [I].[DateOpened] DESC, [I].[DateCreated] DESC
执行计划是here.
我安装了 Blitz 和 运行 sp_BlitzFirst
来给我一些想法,但我不确定要寻找什么以及如何解决问题。请帮忙。
@@version:
Microsoft SQL Server 2016 (SP1) (KB3182545) - 13.0.4001.0 (X64) Oct 28 2016 18:17:30 Copyright (c) Microsoft Corporation Express Edition (64-bit) on Windows 10 Enterprise 6.3 <X64> (Build 17134: )
sp_BlitzFirst:
10 Server Performance Poison Wait Detected: RESOURCE_SEMAPHORE
For 4 seconds over the last 5 seconds, SQL Server was waiting on this particular bottleneck.
200 Wait Stats RESOURCE_SEMAPHORE
For 4 seconds over the last 5 seconds, SQL Server was waiting on this particular bottleneck.
看来你的记忆力有问题。您应该 运行 检查您的状态:
SELECT
((t1.requested_memory_kb)/1024.00) MemoryRequestedMB
, CASE WHEN t1.grant_time IS NULL THEN 'Waiting' ELSE 'Granted' END AS RequestStatus
, t1.timeout_sec SecondsToTerminate
FROM sys.dm_exec_query_memory_grants t1
CROSS APPLY sys.dm_exec_sql_text(t1.sql_handle) t2
您不想等待。同样,你应该 运行
SELECT total_physical_memory_kb, available_physical_memory_kb,
total_page_file_kb, available_page_file_kb,
system_memory_state_desc
FROM sys.dm_os_sys_memory WITH (NOLOCK) OPTION (RECOMPILE);
这里你要的是Available physical memory is high
。如果你不这样做,那就意味着你的记忆力有问题。那么问题是你是否有竞争过程。
您可以尝试的一些事情
- 查询计划在 table 上进行了两次全聚簇索引扫描。鉴于您可能需要至少全部阅读一次(以获取未解决的问题),您最好使用单个 SELECT 而不是 UNION。
- 如果您可以使用索引进行查找并避免完整的 table/clustered 索引扫描,则 UNION 方法非常有效。如果你没有它可以使用的索引,那么你也可以限制你需要读取数据的次数。
- order-by 占用内存(排序占用大量 CPU 和内存)。是否可以通过 ID 而不是 DateOpened 来订购?
- 根据可用的状态和每个状态的行数,您在 [cm].[IssuesTbl].[Status] 上放置了一个 non-clustered 索引
这是我建议的代码。我将顺序更改为以 Status
开头,因为它已经按顺序排列,但我没有将第二个字段更改为 ID - 但如果可以,请执行此操作。
SELECT [I].[IssueId]
,[I].[IssueGuid]
,[I].[IssueNumber]
,[I].[DateCreated]
,[I].[DateOpened]
,[I].[DateLastModified]
,[I].[DateClosed]
,[I].[Title]
,[I].[Type]
,[I].[Status]
,[I].[CreatedByUserId]
,CASE WHEN [I].[Status]=1 THEN 2 ELSE 1 END AS [OrderKey]
FROM [cm].[IssuesTbl] [I]
WHERE ([I].[Status] = 1)
OR ([I].[Status] = 0 AND [I].[CreatedByUserId] = @CurrentUserId)
ORDER BY [I].[Status] ASC, [I].[DateOpened] DESC, [I].[DateCreated] DESC