2

我有这样的查询(由 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]

谢谢你。

4

1 回答 1

0

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

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

编辑:

通过定义,我看到在 TOP (@limitcount) 之后应用了 WHERE。准确地说,WHERE 应用于不同位置的表(可能是聚集索引搜索),并且 JOIN 过滤了 tvf 结果(见上文)

于 2010-05-24T18:52:46.477 回答