为什么存储过程的检索时间超过 50 秒?
Why the stored procedure is taking more than 50 seconds to retrive?
我有这个程序,它需要 50 秒来获取记录。
Declare
@Emp int
Set @Emp= 0
SELECT DISTINCT tp.ProjectNo+' | '+tp.ProjectName as ProjectNo,
tp.ProjectID as ID,
ISNULL(sp.ClientID,0) ClientID,
ISNULL(tc.ClientName, '') ClientName
FROM tp
Inner Join sp ON tp.ProjectID = sp.ProjectID
Inner Join TC ON sp.clientid = tc.ClientID
Inner Join tpl ON tpl.ProjectNo = tp.ProjectNo
WHERE tpl.EmployeeNo = case when @Emp = 0 then tpl.EmpNo else @Emp end
只有 tpl
table 有 25000 条记录,否则其他 table 的记录少于 1000 条。
Tpl
碎片为 30%。
如何加快速度?
case语句需要时间。如何改进?
对于 25,000 条记录,SQL 应该不费吹灰之力,即使在 WHERE 子句中使用 CASE 语句也是如此。每个 JOIN 谓词都有索引吗?即:
[tp].[ProjectID]
[tp].[ProjectNo]
[sp].[ProjectID]
[sp].[clientid]
[tc].[ClientID]
[tpl].[ProjectNo]
您可以在输入 select 之前使用 IF
语句计算 @Emp。也许您将需要 运行 2 个查询,但是两者都应该比 1 with case in where 更快地完成。
我有这个程序,它需要 50 秒来获取记录。
Declare
@Emp int
Set @Emp= 0
SELECT DISTINCT tp.ProjectNo+' | '+tp.ProjectName as ProjectNo,
tp.ProjectID as ID,
ISNULL(sp.ClientID,0) ClientID,
ISNULL(tc.ClientName, '') ClientName
FROM tp
Inner Join sp ON tp.ProjectID = sp.ProjectID
Inner Join TC ON sp.clientid = tc.ClientID
Inner Join tpl ON tpl.ProjectNo = tp.ProjectNo
WHERE tpl.EmployeeNo = case when @Emp = 0 then tpl.EmpNo else @Emp end
只有 tpl
table 有 25000 条记录,否则其他 table 的记录少于 1000 条。
Tpl
碎片为 30%。
如何加快速度?
case语句需要时间。如何改进?
对于 25,000 条记录,SQL 应该不费吹灰之力,即使在 WHERE 子句中使用 CASE 语句也是如此。每个 JOIN 谓词都有索引吗?即:
[tp].[ProjectID]
[tp].[ProjectNo]
[sp].[ProjectID]
[sp].[clientid]
[tc].[ClientID]
[tpl].[ProjectNo]
您可以在输入 select 之前使用 IF
语句计算 @Emp。也许您将需要 运行 2 个查询,但是两者都应该比 1 with case in where 更快地完成。