【发布时间】:2013-11-06 09:58:56
【问题描述】:
我使用 SQL Server 2008,但如果需要,可以使用更高版本。
我有两张表,其中包含关于某些人的非常相似的数据,但格式不同(这两组人之间没有交集)。
Table 1:
int personID
bit IsOldPerson //this field is indexed
Table 2:
int PersonID
int Age
我想要一个与表1结构相同的组合视图。所以我编写了以下脚本(简化版):
CREATE FUNCTION CombinedView(@date date)
RETURNS TABLE
AS
RETURN
select personID as PID, IsOldPerson as IOP
from Table1
union all
select personID as PID, dbo.CheckIfOld(Age,@date) as IOP
from Table2
GO
函数“CheckIfOld”根据@date 日期的输入年龄返回是/否。
所以我在这里有两个问题:
A.如果我尝试select * from CombinedView(TODAY) where IOP=true,SQL Server 是否会单独执行以下操作: 1) 对于表 1,使用字段 IsOldPerson 的索引并进行“聪明”的基于索引的结果选择; 2) 为表 2 计算所有行的 CheckIfOld 并在计算期间逐行拾取或拒绝行?
B.在这种特殊情况下,如何检查执行计划以了解我对问题 (A) 的猜测是否正确?
非常感谢任何帮助!谢谢!
【问题讨论】:
-
你的猜测在我看来相当准确。假设
Table1(IsOldPerson) INCLUDE (personID)上有一个覆盖索引,我希望该计划显示一个连接运算符,在 table1 上进行索引搜索,在 table2 上进行过滤。见How do I obtain a Query Execution Plan? -
@Martin Smith:非常感谢您的评论!抱歉,我刚刚意识到我必须修改问题的性质并使用表值函数而不是视图。
-
尽管现在您已将其编辑为函数而不是视图,但这取决于它是内联 TVF 还是多语句 TVF。您显示的功能无效,因为它都不是。
-
@Martin Smith:感谢您的评论!我假设是内联 TVF,因为我担心 MSTVF 会花费太多时间将数据插入到中间表中。所以现在我已经把脚本改成了 ITVF。
标签: sql-server sql-server-2008 view indexing calculated-columns