日期:2014-05-17  浏览次数:20770 次

求大神优化千万级库的语句
set statistics time on

declare  @userid int =4

declare @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毫秒
 求优化啊  
------最佳解决方案--------------------
set?statistics?time?on
?
declare??@userid?int?=4 , @tmp_Sum numeric(38,1) = 0

select?@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


粗略改了下,具體要看你要怎麼查詢.
------其他解决方案--------------------
首先需要优化SQL语句的,先提出执行计划
简单瞄了一下,WHERE条件中还有不等号,还有参与运算的,基本都不符合SARG,索引优化效果不大,建议调整下语序
------其他解决方案--------------------
UT_PROGRAM.UserID索引,如果TYPE=0的没用而且数量较大,可以在后台更新的时候搬走
------其他解决方案--------------------
UT_PROGRAM 已经增加ProgramID的索引  

------其他解决方案--------------------
得从数据结构着手后才会有精准的答案。。若有优化预算,欢迎联系ME
------其他解决方案--------------------
UT_USER 中UserID为主键 标示.
 UT_PROGRAM 中字段UserID, ProgramID,type,weight
UT_PROGRAM 已经增加ProgramID的索引  

------其他解决方案--------------------
大神啊,快来啊
------其他解决方案--------------------
取消标量子查询
------其他解决方案--------------------
引用:
取消标量子查询

取消后咋写啊??
------其他解决方案--------------------
大神啊,快来啊 
------其他解决方案--------------------
很多系统优化都需要通过冗余字段来消除子查询,比如@count 这个值,完全可以在UT_PROGRAM 增加记录的时候把count值update到 UT_USER表里面新加某字段中.

应用和关系数据库结构可以平衡考虑,别那么死板. 
------其他解决方案--------------------
UT_PROGRAM 有关这张表 一共出现4次且条件都一样 可以考虑提前把这张表先查询出来放到临时表中,或者表变量中,少量使用子查询
------其他解决方案--------------------
語句寫得不好
------其他解决方案--------------------
学习下。。。。。帮顶。。
------其他解决方案--------------------