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 はインラインまたはマルチステートメントですか? インラインの場合は、以前に期待していましたが、マルチステートメント (ブラックボックス) に見えるため、フィルターを使用したスト​​リーム演算子と並べ替え演算子は後で使用します。

編集:

定義では、TOP (@limitcount) の後に WHERE が適用されていることがわかります。正確には、WHERE が別の場所でテーブルに適用され (クラスター化されたインデックスのシークなど)、tvf の結果が JOIN によってフィルター処理されます (上記を参照)。

于 2010-05-24T18:52:46.477 に答える