查询执行计划 - 何时执行Where子句?

时间:2010-05-24 18:48:22

标签: c# sql linq linq-to-sql sql-execution-plan

我有这样的查询(由LINQ创建):

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]

谢谢。

1 个答案:

答案 0 :(得分:0)

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

tvf是内联还是多语句?如果内联我会更早地期待它,但它看起来是多语句(它是一个黑盒子),因此流和排序操作符稍后使用过滤器。

编辑:

根据定义,我看到WHERE正在TOP(@limitcount)之后应用。确切地说,WHERE应用于不同位置的表(可能是聚簇索引查找)和JOIN过滤的tvf结果(见上文)