问题查询使用多个 Intersect。
通过 count() = 6 将其更改为 in ('alpha','beta','gamma','delta','epsilon','phi') 组不是一个选项,因为应用程序支持通配符(例如 alpha%)。但是 count() = 6 查询运行时间不到 1 秒。
使用通配符可以使用多个连接,这就是它过去的结构。在 4 或更少时,Intersect 的性能优于多个连接,但不幸的是没有在 5 或更多时进行测试。
查询在任何 4 个术语上都表现出色 - 不到 1 秒。
从字面上看,任何 4 - 前 4、最后 4 或中间 4。
在 5 或更多然后它死了 - 我在 2 分钟时终止了查询。
让它运行 6 个术语 - 5 分钟返回 795 行。
查询计划将循环与合并连接最多混合使用 4 个术语。
在 5 个或更多术语时,查询计划是所有循环连接。
是否有将查询提示应用于相交的语法?
使用 () () 尝试了两组 3 组,但这并没有改变查询计划。
( -- start term
select [ftsIndexWordOnce].[sID]
from [ftsIndexWordOnce] with (nolock)
where [ftsIndexWordOnce].[wordID] in (
select [id] from [FTSwordDef] with (nolock)
where [word] like 'alpha')
) -- end term
INTERSECT
( -- start term
select [ftsIndexWordOnce].[sID]
from [ftsIndexWordOnce] with (nolock)
where [ftsIndexWordOnce].[wordID] in (
select [id] from [FTSwordDef] with (nolock)
where [word] like 'beta')
) -- end term
INTERSECT
( -- start term
select [ftsIndexWordOnce].[sID]
from [ftsIndexWordOnce] with (nolock)
where [ftsIndexWordOnce].[wordID] in (
select [id] from [FTSwordDef] with (nolock)
where [word] like 'gamma')
) -- end term
INTERSECT
( -- start term
select [ftsIndexWordOnce].[sID]
from [ftsIndexWordOnce] with (nolock)
where [ftsIndexWordOnce].[wordID] in (
select [id] from [FTSwordDef] with (nolock)
where [word] like 'delta')
) -- end term
INTERSECT
( -- start term
select [ftsIndexWordOnce].[sID]
from [ftsIndexWordOnce] with (nolock)
where [ftsIndexWordOnce].[wordID] in (
select [id] from [FTSwordDef] with (nolock)
where [word] like 'epsilon')
) -- end term
INTERSECT
( -- start term
select [ftsIndexWordOnce].[sID]
from [ftsIndexWordOnce] with (nolock)
where [ftsIndexWordOnce].[wordID] in (
select [id] from [FTSwordDef] with (nolock)
where [word] like 'phi')
) -- end term
认为我有一个修复
select distinct [ftsIndexWordOnce].[sID]
from [ftsIndexWordOnce] with (nolock)
Inner Merge Join [FTSwordDef] with (nolock)
On [FTSwordDef].[ID] = [ftsIndexWordOnce].[wordID]
And [FTSwordDef].[word] like 'alpha'
INTERSECT
select distinct [ftsIndexWordOnce].[sID]
from [ftsIndexWordOnce] with (nolock)
Inner Merge Join [FTSwordDef] with (nolock)
On [FTSwordDef].[ID] = [ftsIndexWordOnce].[wordID]
And [FTSwordDef].[word] like 'beta'
查询优化器在 5 或更多时仍然变得愚蠢,但这会强制第一个连接成为合并并保存它。