【问题标题】:Why the query takes forever when changing the value为什么更改值时查询需要永远
【发布时间】:2026-02-19 19:45:01
【问题描述】:

如果我的表 Mission 具有以下结构:

emp_num              int             P.K
from_date            datetime        P.K
to_date              datetime        P.K
mission_location     varchar(200) 
mission_desc         varchar(200)
req_ser              int             P.K
req_year             int             P.K

CONSTRAINT [pkc_mission] PRIMARY KEY CLUSTERED 
(
    [emp_num] ASC,
    [from_date] ASC,
    [to_date] ASC,
    [ req_ser] ASC,
    [ req_year] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

当我尝试运行此查询时:

select *
from mission where emp_num =5307

它运行得非常快,但是当我尝试使用另一个值运行相同的查询时,它需要很长时间!

select *
from mission where emp_num =4595

【问题讨论】:

  • 检查执行计划可能是参数嗅探。第二个查询可能仍使用旧的执行计划。尝试运行此select * from mission where emp_num =4595 OPTION (RECOMPILE);
  • 可能你运行了第一个查询并且结果存在于缓存中(而新的查询不存在)。
  • 也许员工 4595 在表中有无数行,而员工 5307 只有一个。
  • @AnynameDonotcare 表有多大(行数和大小)?请运行exec sp_spaceused 'dbo.[mission]'
  • 表很小,我们可以保存运行这个ALTER INDEX [pkc_mission] ON [dbo].[Mission] REBUILD - 这应该重建索引和统计信息。之后再次执行您的查询。

标签: sql sql-server database performance sql-server-2012


【解决方案1】:

请试试这个 -

select  *
from    mission with (forceseek)
where   emp_num = 4595

【讨论】:

  • 为什么是with (forceseek)
  • 先看看使用索引有没有提高性能,如果有,我们可以继续调查为什么没有使用索引。
  • 只有当我知道我的统计数据是最新的时,我才会建议with (forceseek)
  • @Prdp,这里没有争议。仅用于调查目的。