【问题标题】:SQL procedure takes very long time?SQL过程需要很长时间?
【发布时间】:2015-11-25 16:01:41
【问题描述】:

在sql server程序下如何优化,tblPggg表只有5000条记录,rest表只有50,100,200,10条记录。即使在实时服务器上本地也需要 15/20 秒,

这是在 sql server 2012 上运行的 如果可能还想针对 SQL 下方的注释列进行优化

        select distinct    
    tblppp.Name as Name,
    tblppp.pid as ID,
    tblgpp.FirstName +' '+ tblgpp.LastName as gName,
    tblgpp.GID  as gid,
    tblPggg.prEntryID,
    tblPggg.Start,
    tblPggg.End,
    CONVERT(nvarchar(50),DATEDIFF(MINUTE,tblPggg.Start,tblPggg.End)) +' minutes' as Duration,    
    tblPggg.Status as status
    --,[dbo].funcGetRatingOfPatrolRun(tblppp.pid,tblPggg.prEntryID) as PatrolRating -- commented

    from tblPggg (nolock) as tblPggg  inner join
    tblppp (nolock) as tblppp on tblPggg .pid = tblppp.pid inner join
    tblgpp (nolock) as tblgpp on tblgpp.GID=tblPggg .GID inner join    
    tblsss (nolock) as tblsss on patrolRun.SiteID = tblsss.SiteID inner join
    tblAaaa (nolock) as tblAaaa on tblsss.AreadID =tblAaaa.AreaID inner join
    tblCccc (nolock) as tblCccc on tblsss.ClientID = tblCccc.ClientID 

当我显示查询估计的执行计划时,它显示 49% 的成本用于(哈希匹配内连接)

【问题讨论】:

  • 连接列上是否有任何索引?
  • @shree.part18- 否,索引放置。在哪一列上哪种类型的索引最适合并将在 2/3 秒内产生输出?
  • 看看这个答案开始:stackoverflow.com/questions/107132/…
  • 巡逻队是谁?如果不用于选择列表,为什么要在 tblAaaa 和 tblCccc 上使用 join?
  • 你应该在执行过程中搜刮一下,看看那里发生了什么,然后你可以优化你的查询

标签: sql-server sql-server-2012


【解决方案1】:
  1. 您的查询中至少有 3 个表的列没有发挥任何作用。因此,请使用所需的列和函数显示您的真实查询。

  2. 你为什么使用 distinct?由于哪个表,你得到重复的记录。重复记录是错误的吗?您能否以不使用 distinct 就不会得到重复记录的方式重新编写查询。探测 distinct 始终是个好主意。它通常会导致错误。

  3. 只优化查询后,就可以考虑索引了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-07
    • 1970-01-01
    相关资源
    最近更新 更多