查询执行计划 - 何时执行Where子句?
问题描述:
我有这样的查询(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]
谢谢。
答
的WHERE应用为一部分“嵌套循环(内部连接)”我怀疑
是对TVF在线或多语句?如果内联我希望它更早,但它看起来多语句(这是一个黑匣子),因此后面的过滤器和排序操作符与过滤器。
编辑:
随着定义,我看到,TOP(@limitcount)之后被施加在何处。确切地说,WHERE被应用到不同地方的表(聚集索引搜索,可能)和通过JOIN过滤的tvf结果(参见上文)
+0
我已添加TVF来源。不确定内联和多语句之间的区别是什么。如果可能的话,我试图让TVF查看较窄的数据集,而不是整个表。 – Alex 2010-05-24 18:55:13
您的TVF是内联的。什么版本的SQL Server? SQL2005和SQL2008之间的行为发生了很大变化。 SQL2008在这个链接中被很好地覆盖了http://technet.microsoft.com/en-us/library/cc721269.aspx#_Toc202506240 – 2010-05-24 19:02:38
SQL 2008.因此,TVF只查看缩小的数据集(缩小[CreatorId] = 1)还是在整个数据手册表? – Alex 2010-05-24 19:03:42
啊。我刚刚意识到我想我正在回答一个与你实际询问不同的问题! – 2010-05-24 19:15:54