【发布时间】:2014-02-26 12:22:44
【问题描述】:
这是带有 CommonTableExpression 的 SQL。请注意,USERS_PROJECTS_CTE 使用了两次。
WITH USERS_PROJECTS_CTE (PRO_ID, SHOW_IAS, USERNAME)
AS
(
SELECT up.PRO_ID, up.SHOW_IAS, ISNULL(u.FIRST_NAME, '') + ' ' + ISNULL(u.SECOND_NAME, '')
FROM SFMIS07_PRO.USERS_PROJECTS up
INNER JOIN SFMIS07_ADM.USERS AS u
ON up.USER_ID = u.ID
WHERE up.IS_RESP_PERSON = 1 AND up.valid_to is null
)
SELECT up.PRO_ID,
up1.USERNAME as RESP_USER1,
up2.USERNAME as RESP_USER2,
up.COUNT_
FROM SFMIS07_PRO.PRO_RESP_USERS_KERNEL_MV AS up
LEFT JOIN USERS_PROJECTS_CTE AS up1 ON up.PRO_ID = up1.PRO_ID AND up1.SHOW_IAS=1
LEFT JOIN USERS_PROJECTS_CTE AS up2 ON up.PRO_ID = up2.PRO_ID AND up2.SHOW_IAS=0
执行计划。请注意,CTE 显示了两次:
问题:
- CTE 不仅显示两次而且处理两次,我说得对吗?
- 是否可以通知QO重用CTE?
- QO 原则上是否有可能检测到“相同的 SQL 片段”并重用结果(我想这是通过处理已经准备好的数据来实现的)?
- 如何优化查询(不使用时态表:)?
【问题讨论】:
标签: sql-server sql-server-2012 query-optimization common-table-expression