План выполнения запроса - Когда выполняется условие Где? - PullRequest
2 голосов
/ 24 мая 2010

У меня есть такой запрос (созданный 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 голосов
/ 24 мая 2010

ГДЕ применяется как часть «Вложенных циклов (внутреннего объединения)», я подозреваю,

Является ли tvf встроенным или мульти-оператором? Если он встроен, я ожидал бы этого раньше, но он выглядит как мульти-оператор (это черный ящик), следовательно, операторы потока и сортировки с фильтром позже.

Edit:

С определением я вижу, что WHERE применяется после TOP (@limitcount). Чтобы быть точным, WHERE применяется к таблице в другом месте (поиск кластерного индекса, скорее всего), а результаты tvf фильтруются с помощью JOIN (см. Выше)

...