我需要有关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秒的结果...
还有其他方法可以更快地获得结果......
我将非常感谢你能给我一个解决方案......
非常感谢...
这里代码为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
答案 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-将查询写入查询编辑器,然后单击“显示估计执行计划”按钮..
2- SQL Server为您提供有关应在表上创建的“执行计划窗口”中的索引的提示和查询
3-右键单击“执行计划”窗口,然后选择“缺少索引详细信息”
4-在Opend Query页面中将索引名称([]重命名为您想要的其他内容并运行查询
5-并运行您自己的查询,这在我的问题中提到的很慢...在这些步骤之后我的查询在4秒内运行而不是38