set statistics time ondeclare  @userid int =4declare @count int 
set @count = (select COUNT(*) from UT_PROGRAM where UserID=@userid and TYPE<>0);
select userid,
(select sum(2 - abs(u1.type-u2.type)) from UT_PROGRAM u1 
join UT_PROGRAM u2 on u1.ProgramID=u2.ProgramID 
where u1.UserID=@userid and u1.TYPE<>0 and u2.UserID=u.userid and u2.TYPE<>0)*1.0/((select COUNT(*)+ @count from UT_PROGRAM where UserID=u.UserID and TYPE<>0) ) as s
from dbo.UT_USER u where u.UserID<>@userid order by UserID牵涉到俩表
 UT_PROGRAM 1000万数据
 UT_USER 100万数据
 
现在运行的时间 大概为 11600毫秒
 求优化啊  

解决方案 »

  1.   

    UT_PROGRAM 已经增加ProgramID的索引  
      

  2.   

    UT_USER 中UserID为主键 标示.
     UT_PROGRAM 中字段UserID, ProgramID,type,weight
    UT_PROGRAM 已经增加ProgramID的索引  
      

  3.   

    首先需要优化SQL语句的,先提出执行计划
    简单瞄了一下,WHERE条件中还有不等号,还有参与运算的,基本都不符合SARG,索引优化效果不大,建议调整下语序
      

  4.   

    UT_PROGRAM.UserID索引,如果TYPE=0的没用而且数量较大,可以在后台更新的时候搬走
      

  5.   

    很多系统优化都需要通过冗余字段来消除子查询,比如@count 这个值,完全可以在UT_PROGRAM 增加记录的时候把count值update到 UT_USER表里面新加某字段中.应用和关系数据库结构可以平衡考虑,别那么死板. 
      

  6.   

    UT_PROGRAM 有关这张表 一共出现4次且条件都一样 可以考虑提前把这张表先查询出来放到临时表中,或者表变量中,少量使用子查询
      

  7.   

    set statistics time on
     
    declare  @userid int =4 , @tmp_Sum numeric(38,1) = 0select @tmp_Sum=sum(2 - abs(u1.type-u2.type)) from UT_PROGRAM u1 
    join UT_PROGRAM u2 on u1.ProgramID=u2.ProgramID 
    where u1.UserID=@userid and u1.TYPE<>0 and u2.UserID=u.userid and u2.TYPE<>0

     
    declare @count int 
    set @count = (select COUNT(1) from UT_PROGRAM where UserID=@userid and TYPE<>0);
    select userid,
    @tmp_Sum/((select COUNT(1)+ @count from UT_PROGRAM where UserID=u.UserID and TYPE<>0) ) as s
    from dbo.UT_USER u where u.UserID<>@userid order by UserID
    粗略改了下,具體要看你要怎麼查詢.
      

  8.   

    with as 也没太大用处啊这个作用类似 表变量