我有一个包含大约400,000条记录的表,并在内联网网站的主页上调用。在高峰时段,我们可以拥有300-400个并发用户。 SQL事件探查器工具提供以下输出。
我已将'where'子句中涉及的字段编入索引。有没有办法改善响应时间?
需要做些什么来减少磁盘读取?
服务器配置: Windows 2003 64位,SQL Server 2005 64位SP2,.NET 2.0。
在下面添加了查询和表定义。为了简单起见,我还没有添加40多个字段。那些主要是varchar的字段不在where子句中使用。它们就在那里显示在页面上。有一些字段(5-6)目前没有使用,但我已将它们留在查询中,因为稍后将需要它们。我现在应该把它们拿走吗?会改善响应时间吗?
查询
SELECT
u.[PeopleKey],
u.[EnterpriseId],
u.[PersonnelNbr],
u.LastName,
u.FirstName,
u.MiddleName,
cc.WorkForceCd AS CareerCounselorWorkForceCd,
cc.WorkForceDesc AS CareerCounselorWorkForceDesc,
cc.WorkGroupCd AS CareerCounselorWorkGroupCd,
cc.WorkGroupDesc AS CareerCounselorWorkGroupDesc,
cc.CareerLevelCd As CareerCounselorCareerLevelCd,
cc.CareerLevelDesc AS CareerCounselorCareerLevel,
CL.NextLevelCD as nextCareerLevelCd
FROM
[User] u
LEFT JOIN [User] cc ON
u.[CareerCounselorPeopleKey] = cc.PersonnelNbr
Left JOIN [CareerLevel] CLON
u.WorkForceCd= CL.WorkForceCd AND
u.CareerLevelCd = CL.LevelCd
WHERE
u.PeopleKey = <integer>
[CareerLevel]
ID int 4 [Primary Key - clustered index]
Description varchar 150
WorkforceCd varchar 4
LevelCD varchar 10
NextLevelCD varchar 10
[用户]
PeopleKey int 4 [Primary Key - clustered index]
EnterpriseId varchar 50 [non clustered index]
PersonnelNbr varchar 8 [non clustered index]
FirstName varchar 40
LastName varchar 40
MiddleName varchar 40
CareerCounselorPeopleKey int 4
CareerCounselorPersonnelNbr varchar 8
CareerCounselorName varchar 50
CapabilityCd varchar 5
CapabilityDesc varchar 25
WorkforceCd varchar 4
WorkForceDesc varchar 40
WorkGroupCd varchar 4
WorkGroupDesc varchar 50
CareerLevelCd varchar 10
CareerLevelDesc varchar 50
答案 0 :(得分:1)
您可以发布表架构和索引定义吗?你的疑问是什么样的?
Reads的数量会暗示大量的I / O操作 - 所以可能是由于你的表和索引设置和/或你查询的方式,即使你有索引,它们也没有被使用。
您是否定期在数据库上运行维护计划?例如。当索引碎片过高时,您的索引是否会重组和/或重建?
您总是可以使用SQL的数据库调优顾问来尝试获取有关如何优化某些查询的提示 - 或者更好的是,使用SQL跟踪收集一些实际使用情况数据并分析这些数据以进行潜在的调整步骤。
马克
答案 1 :(得分:0)
你的数据库有多大,你在那个盒子上有多少RAM?
您在'where'子句中涉及的字段中提及了索引...您的索引列的设置顺序与where子句列相同吗?
如果您在sql management studio中运行查询执行计划,您会看到任何表扫描(您想要搜索)。如果您看到扫描,则可能缺少索引。
您的主键/聚集索引是什么?您可以切换查找以使用聚集索引吗?这始终是您获取数据的最快途径。
希望有所帮助!
答案 2 :(得分:0)
看看SQL Server Performance Dashboard。如果你有明显的问题,他们会出现在那里。
此外,您不应该只是在不分析查询执行计划的情况下添加索引(并查看它正在查找的内容)。
答案 3 :(得分:0)
加入左边 - 所有这些列: ON u。[CareerCounselorPeopleKey] = cc.PersonnelNbr 左JOIN [CareerLevel] CL ON u。 WorkForceCd = CL。 WorkForceCd 和你。 CareerLevelCd = CL。 LevelCd
与WHERE子句一样,ON子句用于明显的关键关系!
所以脂肪标记的列也必须编入索引...