Sql IN子句降低了性能

时间:2013-12-24 17:54:25

标签: sql sql-server performance in-clause

我需要有关sql查询性能的帮助...

我有一个视图,当我以

运行视图时
select * 
from udv_salesAnalyze 
where _month=12 and _year=2012 

我的结果是2秒

但是当我添加另一个过滤器

select * from udv_salesAnalyze 
where _month=12 and _year=2012 
and userRef in (1,2,5,6,9,11,12,13,14
,19,22,25,26,27,31,34,35,37,38,39,41,47,48,49,53,54,57,59,61,62
,65,66,67,68,69,70,74,77,78,79,80,83,86,87,88,90,91,92,94)  

我在1分38秒内得到了结果..

我将查询修改为

select * from udv_salesAnalyze 
where _month=12 and _year=2012 
and userRef in (select * from udf_dependedUsers(2)) 

(这里udf_dependedUsers是表返回函数)我得到了38秒的结果

我加入了表重新调整的函数来查看,但我又得到了38-40秒的结果...

还有其他方法可以更快地获得结果......

我将非常感谢你能给我一个解决方案......

非常感谢...

execution plan :

这里代码为udf_dependedUsers:

ALTER FUNCTION [dbo].[udfn_dependedUsers] (@userId int)
RETURNS @dependedUsers table (userRef int)
AS
BEGIN
DECLARE @ID INT
SET @ID = @userId
;WITH ret AS(SELECT userId FROM users
             WHERE  userId = @ID
             UNION ALL
             SELECT t.userId
             FROM   users t INNER JOIN ret r ON t.Manager = r.userId
             ) 
insert into @dependedUsers (userRef)
select * from ret
order by userId
RETURN 
END

3 个答案:

答案 0 :(得分:1)

尝试使用左连接

select * from udv_salasAnalyze  MainTable
LEFT JOIN
(select * from udf_dependedUsers(2)) SelectiveInTable --Try direct query like that you wrote in user function
ON SelectiveInTable.userRef = MainTable.userRef
where _month=12 and _year=2012 
and SelectiveInTable.userRef != null

答案 1 :(得分:-1)

使用JOIN而不是IN,如下所示:

select 
   data.* 
from udv_salesAnalyze data
join ( values
    (1), (2), (5), (6), (9),(11),(12),(13),(14),(19)
   ,(22),(25),(26),(27),(31),(34),(35),(37),(38),(39)
   ,(41),(47),(48),(49),(53),(54),(57),(59)
   ,(61),(62),(65),(66),(67),(68),(69),(70),(74),(77),(78),(79)
   ,(80),(83),(86),(87),(88),(90),(91),(92),(94)
) V(userRef) on V.userRef = data.userRef
where _month = 12
  and _year  = 2012 

答案 2 :(得分:-2)

问题是保存用户数据的表的指示

这是解决方案;

1-将查询写入查询编辑器,然后单击“显示估计执行计划”按钮..

enter image description here

2- SQL Server为您提供有关应在表上创建的“执行计划窗口”中的索引的提示和查询

enter image description here

3-右键单击“执行计划”窗口,然后选择“缺少索引详细信息”

enter image description here

4-在Opend Query页面中将索引名称([]重命名为您想要的其他内容并运行查询

enter image description here

5-并运行您自己的查询,这在我的问题中提到的很慢...在这些步骤之后我的查询在4秒内运行而不是38