日期:2014-05-16  浏览次数:20531 次

语句优化---高手请指点
求大神指点,下面的语句,是否有优化空间(注:索引已调整到最佳),可否从语句写法方面入手:

SELECT
       u.username,
       u.userid,
       u.province,
       u.dotadmin,
       t.tickets,
       u.viplevel,
       u.regdata,
       u.maintainlevel,
       d.staffname,
       d.staffid
  FROM subsidiaryreportsystem.dbo.distributorstaffmapping d WITH (NOLOCK)
       LEFT JOIN subsidiaryreportsystem.dbo.tbluser u WITH (NOLOCK)
          ON d.userid = u.userid
       LEFT JOIN
       (
SELECT userid, sum (ticketnums) tickets
FROM subsidiaryreportsystem.dbo.ticketmonitor WITH (NOLOCK)
WHERE date > '2014-2-1 0:00:00' AND date < '2014-2-28 23:59:59'
GROUP BY userid
) t
          ON d.userid = t.userid
       LEFT JOIN subsidiaryreportsystem.dbo.tblspecialuser s WITH (NOLOCK)
          ON s.userid = d.userid
 WHERE     s.userid IS NULL
       AND u.admin = 1
       AND d.staffid = 318924
       AND u.province = '江苏'
ORDER BY tickets DESC

我做了如下更改(使用子查询,去掉了s表的连接),执行计划是少了很多,但是效率基本没变:

SELECT TOP 100
u.username,
    u.userid,
    u.province,
    u.dotadmin,
    t.tickets,
    u.viplevel,
    u.regdata,
    u.maintainlevel,
    d.staffname,
    d.staffid
from
(
select 
userid,
staffname,
staffid
FROM 
subsidiaryreportsystem.dbo.distributorstaffmapping WITH (NOLOCK)
where 
staffid = 318924
) d
inner join
(
select
username,
userid,
province,
dotadmin,
viplevel,
regdata,
maintainlevel
from
subsidiaryreportsystem.dbo.tbluser WITH (NOLOCK)
where 
admin = 1
AND province = '江苏'
) u
on d.userid=u.userid
left join
(
SELECT 
userid, 
sum (ticketnums) tickets
FROM 
subsidiaryreportsystem.dbo.ticketmonitor WITH (NOLOCK)
WHERE 
date > '2014-02-01 0:00:00' AND date < '2014-02-28 23:59:59'
GROUP BY userid
) t
ON d.userid = t.userid
order by tickets

------解决方案--------------------
很正常的语句,在语句上应该没有太大的改善空间了,还是考虑下索引,如果允许的话用一些带include的大索引,还有就是