以下语句的执行时间几乎为2分钟,而使用相同表和视图且结果相同的select语句的执行时间仅为前者的一半:
SELECT
@NEW_CAREER_NUMBER = MAX(a.[career number])
FROM selecthr20.employee.[career history] a
INNER JOIN selecthr20.Employee.[Current Appointments As At Evaluation Date] b
ON a.[appointment number] = b.[appointment number]
INNER JOIN Employee.[BSK Changes in Selected Period] c
ON a.[career number] = c.[primary key number]
INNER JOIN selecthr20.employee.[career history extra detail] d
ON a.[career number] = d.[career number]
AND c.[primary key number] = d.[career number]
where c.[primary key name] = 'Career Number'
and c.[audit date] < (Select max([audit date]) from Employee.[BSK Changes in Selected Period] where [primary key number] = @LATEST_CAREER_NUMBER)
and b.[person number] = @PERSON_ID‘'BSK in Selected Period c’是一个视图,其余的是表。
发布于 2015-12-23 00:54:56
您在d连接上有一个冗余条件。
试一试
SELECT
@NEW_CAREER_NUMBER = MAX(a.[career number])
FROM selecthr20.employee.[career history] a
JOIN selecthr20.Employee.[Current Appointments As At Evaluation Date] b
ON b.[appointment number] = a.[appointment number]
and b.[person number] = @PERSON_ID
JOIN selecthr20.employee.[career history extra detail] d
ON d.[career number] = a.[career number]
JOIN Employee.[BSK Changes in Selected Period] c
ON c.[primary key number] = a.[career number]
and c.[primary key name] = 'Career Number'
and c.[audit date] < ( Select max([audit date])
from Employee.[BSK Changes in Selected Period]
where [primary key number] = @LATEST_CAREER_NUMBER );自然地将索引放在连接条件上
如果在c连接上有一个循环,那么可以使用一个变量作为审计日期。
我会这么做的--这几乎没有什么坏处
declare @auditdate DateTime = ( Select max([audit date])
from Employee.[BSK Changes in Selected Period]
where [primary key number] = @LATEST_CAREER_NUMBER );
...
and c.[audit date] < @auditdate https://stackoverflow.com/questions/34420143
复制相似问题