sql语句性能优化

时间:2022-05-29 23:54:16
SELECT A.ID, A.TR_EmpID, A.TR_EmpCode, A.TR_EmpName, A.TR_EmpNumber, A.TR_CourseID, A.TR_CourseCode, A.TR_CourseName, A.TR_CourseValidDateStr, A.TR_CourseValidDate,A.TR_ID, TR_Code, A.TR_Name, A.TR_StartDate, A.TR_EndDate, A.TR_Content, A.TR_OrgName, A.TR_Mode, A.TR_Category, A.TR_SumCourseTime, A.TR_Score, A.TR_Result,A.TR_TechersName, A.TR_HasReatTR, A.TR_DepID, A.TR_DepName, A.TR_RecordSource, A.TR_RecordDate, A.TR_RecordStatus, A.TEACHERTYPE, A.isdeleted,B.JOINCOMPANTTIME,B.OUTCOMPANTTIME,B.EMPSTATUS,B.STATUSNAME,TE.ID AS TEID FROM View_TRAINNING_RECORD A  JOIN View_Employee B ON  A.TR_EmpID=B.EMPLOYEEID LEFT JOIN dbo.TRAINNING_EMPS TE ON  A.TR_ID=TE.TR_ID AND A.TR_EmpID=TE.TR_EMPID

这条sql语句,查询总记录数只有3万多条,但是用了整整1分多钟,请问各位老师们,我该怎么改动优化呢?自己试了加索引,但是效果不明显

10 个解决方案

#1


[这个可能时候发到  sql版块。
, 光给这个是没办法优化的, 要知道,测试出你那个关联,占用大量时间,还得知道你目前表的数据量,才能处理, 看下你的执行计划,是否真正用到了索引, 执行计划教会我如何创建索引?, 先加上 With(nolock) 脏读看看是不是数据表写入频繁导致的。
然后就是你要知道select 30000条的数据展示出来也是要时间的,所以你加个Top100看看速度。
最后就是加索引等老一套了,没别的办法。
, 如此简单的一个基本查询语句,有个毛线的优化。。。。。

关键是你为什么要拿30000多条结果????

这么大的结果集,从服务器上拿下来本身就是需要时间的,
因为数据库需要时间组织数据并转成数据流,而接收端也需要时间解析数据流分配空间格式化数据, 首先索引要加在A.TR_EmpID,B.EMPLOYEEID,A.TR_ID,TE.TR_ID,TE.TR_EMPID这些列上

可以这样优化

SELECT ...
FROM
  (SELECT ... 
   FROM View_TRAINNING_RECORD A,View_Employee B
   WHERE  A.TR_EmpID=B.EMPLOYEEID) T
  LEFT JOIN 
  dbo.TRAINNING_EMPS TE ON  T.TR_ID=TE.TR_ID AND T.TR_EmpID=TE.TR_EMPI



, 几个视图和表的数据量都很大,你做全表查询就会很费时
如果没必要查询出全部数据的话,建议使用分页查询。或者加个索引。, 由于需求,不能延迟加载或者分页, 是SQL SERVER 数据库么?建议先用自带的sql server profiler 和 数据库引擎优化顾问 工具 来优化一下。]

#1


[这个可能时候发到  sql版块。
, 光给这个是没办法优化的, 要知道,测试出你那个关联,占用大量时间,还得知道你目前表的数据量,才能处理, 看下你的执行计划,是否真正用到了索引, 执行计划教会我如何创建索引?, 先加上 With(nolock) 脏读看看是不是数据表写入频繁导致的。
然后就是你要知道select 30000条的数据展示出来也是要时间的,所以你加个Top100看看速度。
最后就是加索引等老一套了,没别的办法。
, 如此简单的一个基本查询语句,有个毛线的优化。。。。。

关键是你为什么要拿30000多条结果????

这么大的结果集,从服务器上拿下来本身就是需要时间的,
因为数据库需要时间组织数据并转成数据流,而接收端也需要时间解析数据流分配空间格式化数据, 首先索引要加在A.TR_EmpID,B.EMPLOYEEID,A.TR_ID,TE.TR_ID,TE.TR_EMPID这些列上

可以这样优化

SELECT ...
FROM
  (SELECT ... 
   FROM View_TRAINNING_RECORD A,View_Employee B
   WHERE  A.TR_EmpID=B.EMPLOYEEID) T
  LEFT JOIN 
  dbo.TRAINNING_EMPS TE ON  T.TR_ID=TE.TR_ID AND T.TR_EmpID=TE.TR_EMPI



, 几个视图和表的数据量都很大,你做全表查询就会很费时
如果没必要查询出全部数据的话,建议使用分页查询。或者加个索引。, 由于需求,不能延迟加载或者分页, 是SQL SERVER 数据库么?建议先用自带的sql server profiler 和 数据库引擎优化顾问 工具 来优化一下。]