与此同时对一个表修改和查询,速度比较慢,求合理的设计

同时对一个表修改和查询,速度比较慢,求合理的设计

问题:同时对一个表修改和查询,速度比较慢,求合理的设计
查询: 比较频繁      查找这个表中fTag = 0
修改一:比较频繁   知道主键的情况下单条 对fTag=1 和fUserTime=getdate()进行修改 ;
修改二:每隔30秒  批量修改 [fUseTime] < DATEADD(SECOND, -3, GETDATE()) 的记录;


修改二执行的时候最长可以到5秒钟,CPU几乎爆满,正常情况下修改是特别快的;





--创建一个表
CREATE TABLE [dbo].[tFtpUser](
[floginid] [VARCHAR](50) NOT NULL,
[fpwd] [VARCHAR](50) NOT NULL,
[fTag] [BIT] NOT NULL,
[fUseTime] [DATETIME] NOT NULL,
 CONSTRAINT [PK_tFtpUser] PRIMARY KEY CLUSTERED 
(
[floginid] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'0表示空闲 1表示使用中' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'tFtpUser', @level2type=N'COLUMN',@level2name=N'fTag'
GO

ALTER TABLE [dbo].[tFtpUser] ADD  CONSTRAINT [DF_Table_1_fstate]  DEFAULT ((0)) FOR [fTag]
GO

ALTER TABLE [dbo].[tFtpUser] ADD  CONSTRAINT [DF_tFtpUser_fUseTime]  DEFAULT (((1900)-(1))-(1)) FOR [fUseTime]
GO



------解决思路----------------------
3 秒失效没必要去改fTag啊。
在(fUseTime,fTag)上建索引,保留修改一。
查询条件改为下面这样,不仅利用了索引还缩小了范围。
 WHERE fUseTime >= DATEADD(SECOND, -3, GETDATE()) AND fTag = 0


------解决思路----------------------
还是不要修改二,查询用
WHERE fUseTime < DATEADD(SECOND, -3, GETDATE())
   OR ( fUseTime >= DATEADD(SECOND, -3, GETDATE())
       AND fTag = 0
      )

------解决思路----------------------
这个表一共有5000行记录
修改二执行的时候最长可以到5秒钟,CPU几乎爆满,正常情况下修改是特别快的;

这个极有可能是阻塞引起的,5000条数据,怎么玩都不会出问题
------解决思路----------------------
频繁修改大量数据(虽然才5000条,但是基本属于全表操作了),肯定属于设计不合理。
个人认为:
表里可以不要fTag字段,有动作时,就修改一条记录的fUseTime即可。
你不是就是要一个空闲字段么?做个视图,加个字段:
case when fUseTime>DATEADD(SECOND, -3, GETDATE())  then 1 else 0 end  as fTag。应该就行。