sql语句优化,select top 1 表1 where 某字段='*' order by 更新时间 DESC

Mr_yang_da 2012-02-18 04:55:05
sql 表GB有id(唯一标识)、姓名、分数、评分日期 四个字段。如果要select 姓名字段是小王的所有行中最后一个评分日期的分数。
select top 1 GB where 姓名='小王' order by 评分日期 DESC。
这样的运算顺序应该是 在表GB中 先找出所有'小王'来,然后按 评分日期 降序排列 在选出排序后的top1来。 请问这样是不是必须要检索表的所有行,如果这个表有上百万行,是不是就会很慢?有没有好的优化方法?
...全文
400 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Mr_yang_da 2012-02-22
  • 打赏
  • 举报
回复
我想可能就是查询语句的问题,点击查看的时候经常会出现以下提示(即使能正确查出结果也很慢):

而且网站访问高峰期 我的数据库服务器 sqlservre.exe 占用内存高达1.6G,cpu 也一直在(90%——100%),甚至有一直100%不动,在早上访问量少的时候也就10% 偶尔高过50%。请各位帮忙把把脉吧。


“/”应用程序中的服务器错误。
--------------------------------------------------------------------------------

超时时间已到。在操作完成之前超时时间已过或服务器未响应。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.Data.SqlClient.SqlException: 超时时间已到。在操作完成之前超时时间已过或服务器未响应。

源错误:

执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。

堆栈跟踪:


[SqlException: 超时时间已到。在操作完成之前超时时间已过或服务器未响应。]
System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream) +742
System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior) +45
System.Data.SqlClient.SqlCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior) +5
System.Data.Common.DbDataAdapter.FillFromCommand(Object data, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) +304
System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) +77
System.Data.Common.DbDataAdapter.Fill(DataSet dataSet) +38
MCC.CMPServices.SqlPersistenceContainer.AssignReturnValueToDataSet(CommandMapping cmdMap, SqlCommand currentCmd, PersistableObject& persistObjectSet)
MCC.CMPServices.SqlPersistenceContainer.Select(PersistableObject selectObject)
PersonOperation.DataAccess.SelectSentResume(SendResume sr) in E:\job2005\PersonOperation\DataAccess.cs:492
JobAdmin.Company.resume_reciveList.Page_Load(Object sender, EventArgs e)
System.Web.UI.Control.OnLoad(EventArgs e) +67
System.Web.UI.Control.LoadRecursive() +35
System.Web.UI.Page.ProcessRequestMain() +739


[Quote=引用 1 楼 acherat 的回复:]
你可以在姓名和日期上加索引,确定名称查询效率还好,模糊查询效率不是很高,必要时要考虑全文索引。
[/Quote]
Mr_yang_da 2012-02-22
  • 打赏
  • 举报
回复
我想可能就是查询语句的问题,点击查看的时候经常会出现以下提示(即使能正确查出结果也很慢):

而且网站访问高峰期 我的数据库服务器 sqlservre.exe 占用内存高达1.6G,cpu 也一直在(90%——100%),甚至有一直100%不动,在早上访问量少的时候也就10% 偶尔高过50%。请各位帮忙把把脉吧。


“/”应用程序中的服务器错误。
--------------------------------------------------------------------------------

超时时间已到。在操作完成之前超时时间已过或服务器未响应。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.Data.SqlClient.SqlException: 超时时间已到。在操作完成之前超时时间已过或服务器未响应。

源错误:

执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。

堆栈跟踪:


[SqlException: 超时时间已到。在操作完成之前超时时间已过或服务器未响应。]
System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream) +742
System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior) +45
System.Data.SqlClient.SqlCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior) +5
System.Data.Common.DbDataAdapter.FillFromCommand(Object data, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) +304
System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) +77
System.Data.Common.DbDataAdapter.Fill(DataSet dataSet) +38
MCC.CMPServices.SqlPersistenceContainer.AssignReturnValueToDataSet(CommandMapping cmdMap, SqlCommand currentCmd, PersistableObject& persistObjectSet)
MCC.CMPServices.SqlPersistenceContainer.Select(PersistableObject selectObject)
PersonOperation.DataAccess.SelectSentResume(SendResume sr) in E:\job2005\PersonOperation\DataAccess.cs:492
JobAdmin.Company.resume_reciveList.Page_Load(Object sender, EventArgs e)
System.Web.UI.Control.OnLoad(EventArgs e) +67
System.Web.UI.Control.LoadRecursive() +35
System.Web.UI.Page.ProcessRequestMain() +739
SQL77 2012-02-19
  • 打赏
  • 举报
回复
那也要看你的返回结果集.如果你表1000条,990条小王,那样就不如全表扫描了,

如果需要建立 IX 性名包含(分数,时间),再测试看计划如何
叶子 2012-02-19
  • 打赏
  • 举报
回复
给性别字段加上索引,查询的时候能快一些。
AcHerat 元老 2012-02-18
  • 打赏
  • 举报
回复
你可以在姓名和日期上加索引,确定名称查询效率还好,模糊查询效率不是很高,必要时要考虑全文索引。

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧