使用一个特定列来“从表中选择*”超时,但是其他列可以正常运行

时间:2019-04-10 02:53:16

标签: sql sql-server

我对一个特定的WHERE列使用Integer限制来进行SELECT * FROM查询,但是它总是超时而不会返回任何结果。但是当我使用其他列时,查询正常运行。我想知道为什么?

我不确定是否是因为特定列是Integer?

SELECT [REQUEST_ID], [SIGNUM], [MATNR], [TIMESTAMP]
FROM [TICKET_INFO]
WHERE [REQUEST_ID] = 0

这不起作用并且总是超时,但是此查询正常工作:

SELECT [REQUEST_ID], [SIGNUM], [MATNR], [TIMESTAMP]
FROM [TICKET_INFO]
WHERE [SIGNUM] = '#'

3 个答案:

答案 0 :(得分:0)

该问题可能与缓存的查询计划有关,对于某些参数版本而言,这是可以的,但对于其他参数版本而言,则不是。 您可以尝试一些步骤来解决此问题。首先重建所有索引,并确保有关非索引的统计信息是最新的。 请尝试以下操作:

exec sp_msforeachtable "DBCC DBREINDEX('?')"
go

exec sp_msforeachtable "UPDATE STATISTICS ? WITH FULLSCAN, COLUMNS"
go

如果这不起作用,请尝试:

  1. 使用optimize for
  2. 使用WITH(RECOMPILE)
  3. 也许尝试使用动态sql(有用的链接here

此处参考:SQL Server Query time out depending on Where Clause

答案 1 :(得分:0)

我怀疑Request_ID将是Character数据类型,并且您正在尝试将其与整数进行比较。因此,它必须为每一行强制转换数据并进行比较。

我建议您以这种方式更新查询。

SELECT [REQUEST_ID], [SIGNUM], [MATNR], [TIMESTAMP]
FROM [TICKET_INFO]
where [REQUEST_ID] = '0'

此外,请阅读此stackoverflow答案Casting integer to Varchar

答案 2 :(得分:0)

在检查它是否被其他人锁定之后,与此服务器的所有连接都处于休眠状态, 这表示所有连接均正常。 然后,我通过配置管理重新启动服务器,它可以正常查询。 所以方法是RESTART SERVER。