回答

收藏

SQL查询执行缓慢(对于某些参数值)

技术问答 技术问答 227 人阅读 | 0 人回复 | 2023-09-12

我有一个带有多个表的SQL Server 2005数据库。时间戳和消息计数器用于存储多个设备,并具有以下功能:
+ H8 {. h% U% H6 J+ Y. FCREATE TABLE [dbo].[Timestamps] ([Id] [uniqueidentifier] NOT NULL,[MessageCounter] [bigint] NULL,[TimeReceived] [bigint] NULL,[DeviceTime] [bigint] NULL,[DeviceId] [int] NULL)Id是唯一的主键(Guid.Comb),并且在DeviceId和MessageCounter都有索引。/ G  o% p1 E9 V8 U" _5 j; a
我想做的就是找到MessageCounter最后插入特定设备的行(最大行)。
7 n+ W. E6 a/ _8 H/ [奇怪的是,对 设备号    的查询     4    (以及除No.除所有其他设备外)几乎立即返回:; z* J9 h& S( n; ~" a% t  R% f7 O; O
select top 1 *    from "Timestamps"   where DeviceId = 4   order by MessageCounter desc但对 设备号的    查询相同 1    总需要完成:- Z, G9 \' o4 E# `" |
select top 1 *    from "Timestamps"   where DeviceId = 1 /* this is the only line changed */   order by MessageCounter desc最奇怪的是设备1的     比设备4的 行少    得多:
: g- h* [+ z' l( d, q0 p; ]select count(*) from "Timestamps" where DeviceId = 4(returns 1,839,210)select count(*) from "Timestamps" where DeviceId = 1(returns 323,276).有人知道我可能做错了什么吗?
/ E+ `- X, h. n, B* C[编辑]) ~/ {; [* c+ _5 Z# q
从这两个查询的执行计划中可以清楚地看出,设备1(下图)在索引扫描中创建了大量的行:
% S0 T+ _5 _8 ~5 `5 g设备4(上)和设备1(下)执行计划http://img295.imageshack.us/img295/5784/execplans.png! _+ L6 c* t1 Z8 u2 s6 K# }" I
区别在于,当我在执行计划图上悬挂索引扫描节点时:, J4 B# i9 |7 O, x4 A! D
Device 4 Actual Number of Rows: 1Device 1 Actual Number of Rows: approx. 6,500,0006、500、000行是一个非常奇怪的数字,因为我的select count(*)设备1返回约300000行!
3 R, V+ S4 @" ?9 _: c  t                                                               
% R8 Y! k2 Y/ u/ k9 {/ D4 N    解决方案:
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则