2010-05-24 76 views
2

我有这样的查询(LINQ通过创建):查询执行计划 - 何时执行Where子句?

SELECT [t0].[Id], [t0].[CreationDate], [t0].[CreatorId] 
FROM [dbo].[DataFTS]('test', 100) AS [t0] 
WHERE [t0].[CreatorId] = 1 
ORDER BY [t0].[RANK] 

DataFTS是一个全文检索表值函数。查询执行计划看起来像这样:

SELECT (0%) - Sort (23%) - Nested Loops (Inner Join) (1%) - Sort (Top N Sort) (25%) - Stream Aggregate (0%) - Stream Aggregate (0%) - Compute Scalar (0%) - Table Valued Function (FullTextMatch) (13%) 
                  | 
                  | 
                  - Clustered Index Seek (38%) 

这是否意味着WHERE子句([的CreatorID] = 1)全文本搜索之后执行之前到TVF(全文搜索)或? TVF是否在查看缩小的数据集(由WHERE子句缩小)还是整个表格?

的TVF是这样的:

FUNCTION [dbo].[DataFTS] (@searchtext nvarchar(4000), @limitcount int) 
RETURNS TABLE 
AS 
RETURN 
SELECT * FROM Databook 
INNER JOIN CONTAINSTABLE(Databook, *, @searchtext, @limitcount) 
AS KEY_TBL ON Databook.Id = KEY_TBL.[KEY] 

谢谢。

+0

您的TVF是内联的。什么版本的SQL Server? SQL2005和SQL2008之间的行为发生了很大变化。 SQL2008在这个链接中被很好地覆盖了http://technet.microsoft.com/en-us/library/cc721269.aspx#_Toc202506240 – 2010-05-24 19:02:38

+0

SQL 2008.因此,TVF只查看缩小的数据集(缩小[CreatorId] = 1)还是在整个数据手册表? – Alex 2010-05-24 19:03:42

+0

啊。我刚刚意识到我想我正在回答一个与你实际询问不同的问题! – 2010-05-24 19:15:54

回答

0

的WHERE应用为一部分“嵌套循环(内部连接)”我怀疑

是对TVF在线或多语句?如果内联我希望它更早,但它看起来多语句(这是一个黑匣子),因此后面的过滤器和排序操作符与过滤器。

编辑:

随着定义,我看到,TOP(@limitcount)之后被施加在何处。确切地说,WHERE被应用到不同地方的表(聚集索引搜索,可能)和通过JOIN过滤的tvf结果(参见上文)

+0

我已添加TVF来源。不确定内联和多语句之间的区别是什么。如果可能的话,我试图让TVF查看较窄的数据集,而不是整个表。 – Alex 2010-05-24 18:55:13