T-SQL较差的CTE连接性能

T-SQL较差的CTE连接性能,sql,sql-server,common-table-expression,Sql,Sql Server,Common Table Expression,长话短说。我有两个非常相似的SQL查询,它们输出短名称和长名称的值对。输入参数用于第一个查询:短名称,第二个查询为长名称。构造的查询输出包含输入参数的所有行,但这不完全匹配(例如,如果我将标记名设置为ST2,则此查询输出包含ST2的所有对象以及名称开头包含ST2的所有其他对象) 所有查询都在同一数据库中执行。在下面的查询中,输入参数设置为”,这意味着查询输出所有对象的短名称和长名称的键值对 declare @tagName as varchar(50) = '' set @tagName = @

长话短说。我有两个非常相似的SQL查询,它们输出短名称和长名称的值对。输入参数用于第一个查询:短名称,第二个查询为长名称。构造的查询输出包含输入参数的所有行,但这不完全匹配(例如,如果我将标记名设置为ST2,则此查询输出包含ST2的所有对象以及名称开头包含ST2的所有其他对象)

所有查询都在同一数据库中执行。在下面的查询中,输入参数设置为
,这意味着查询输出所有对象的短名称和长名称的键值对

declare @tagName as varchar(50) = ''
set @tagName = @tagName + '.'

-- this one query outputs ~700 rows
;with AnalogTag as
(
Select *
from [Runtime].[dbo].[AnalogTag] 
where (substring(TagName, 0, charindex('.',@tagName))) in (substring(@tagName,0, len(@tagName))) 
and (substring(TagName, charindex('.',TagName), 2)) not in ('.#')
),

-- this one query outputs ~7000 rows
HierarchicalName as
(
Select * 
from [proba7].[dbo].[internal_list_objects_view]
where substring(tag_name, 0,len(@tagName)) = substring(@tagName,0, len(@tagName))
)
select HierarchicalName.tag_name as TagName
,HierarchicalName.hierarchical_name ilo_view_HierarchicalName


from AnalogTag
inner join HierarchicalName
on substring(AnalogTag.TagName, 0, CHARINDEX('.',AnalogTag.TagName)) = HierarchicalName.tag_name
上面的整个查询运行大约3秒,并输出大约450行

我在同一个数据库上创建了一个类似的查询:

declare @hierarchicalName as varchar(200) = ''
declare @Length as int
set @Length = LEN(@hierarchicalName)+1

 -- this query outputs approx 700 rows and if runs separately it runs 
 --almost instantly
;with AnalogTag as
(
Select TagName 
from [Runtime].[dbo].[AnalogTag] 
where (substring(TagName, 0, CHARINDEX('.',TagName))) in 
    (
    Select tag_name from [proba7].[dbo].[internal_list_objects_view]
    where substring(hierarchical_name, 0, @Length) = @hierarchicalName
    )
and (substring(TagName, CHARINDEX('.',TagName), 2)) not in ('.#')
),
 -- this query outputs approx 7000 rows and if runs separately it runs 
 --almost instantly
HierarchicalName as
(
    Select hierarchical_name, tag_name from [proba7].[dbo].[internal_list_objects_view]
    where substring(hierarchical_name, 0, @Length) = @hierarchicalName
)
select HierarchicalName.tag_name as ilo_view_TagName
,HierarchicalName.hierarchical_name ilo_view_HierarchicalName

from AnalogTag
inner join HierarchicalName
on substring(AnalogTag.TagName, 0, CHARINDEX('.',AnalogTag.TagName)) = HierarchicalName.tag_name
这次查询在28秒内运行。输出的行数与第一次查询的行数相似(因为在这两次查询中,ouptut必须相似)。我注意到,如果我将“内部联接”更改为例如“完全联接”,查询将立即运行

模拟标签示例输出:

 TagName                               a    b   c   d   e   f   g   h   j   j   k   l   m
    PomFPTemp.PV                     1062   0   10  0   10  0   4   0   0   0   0   0   0
    PomFPWilgWzgl.PV                   1    0   10  0   10  0   4   0   0   0   0   0   0
    SNST3P1BrakFWHMocD3f.PV          1063   0   10  0   10  0   4   0   0   0   0   0   0
    SNST3P1BrakFWHMocP3f.PV           46    0   10  0   10  0   4   0   0   0   0   0   0
    SNST3P1BrakFWHMocQ3f.PV          1063   0   10  0   10  0   4   0   0   0   0   0   0
    SNST3P1BrakFWHMocQ3fIntExp.PV    1063   0   10  0   10  0   4   0   0   0   0   0   0
    SNST3P1BrakFWHMocQ3fIntImp.PV    1063   0   10  0   10  0   4   0   0   0   0   0   0
    SNST3P1BrakFWHMocQn3f.PV         1063   0   10  0   10  0   4   0   0   0   0   0   0
    SNST3P1EnkvarhExp3f.PV           1060   0   10  0   10  0   4   0   0   0   0   0   0
    SNST3P1EnkvarhImp3f.PV           1060   0   10  0   10  0   4   0   0   0   0   0   0
ID tag_name            contained_name               hierarchical_name       a   b   c   d   e   f   g   h   i   j   k   l   m   n   o   p   q   r   s   t   u   v   w   x   y   z   aa  bb  cc  dd  ee  ff  gg  hh
1   $Galaxy                                         $Galaxy                     1   0   0   0   0   1       NULL    NULL    0   0   1   1   1   0   0   0   0   0   1   0   NULL    23  0   0   0   0   0   0   0   0   0   133123  50026   1   NULL
2   proba7                                          Galaxy_001                  0   0   0   0   1   1       NULL    NULL    0   0   848 1   0   1   0   0   0   0   1   0   NULL    23  0   0   0   0   0   0   0   0   0   4098    878020  1   NULL
3   $_AutoImport                                    $_AutoImport               1    0   0   0   0   3       NULL    NULL    0   0   4   2   0   0   0   0   0   0   1   0   NULL    10  0   0   0   0   0   0   0   0   0   131075  3699    1   NULL
4   $_DiCommon                                      $_DiCommon                 1    0   0   0   0   4       NULL    NULL    0   0   5   3   0   0   0   0   0   0   1   0   NULL    10  0   0   0   0   0   0   0   0   0   131075  50023   1   NULL
5   $WinPlatform                                    $WinPlatform               1    0   0   0   0   5       NULL    1   0   0   6   4   1   0   0   0   0   0   0   0   NULL    1   0   0   0   0   0   0   0   0   0   133121  419340  1   1
6   $AppEngine                                      $AppEngine                 1    0   0   0   0   6       NULL    1   0   0   7   5   1   0   0   0   0   0   0   0   NULL    3   0   0   0   0   0   0   0   0   0   133121  419341  1   1
7   $Area                                           $Area                      1    0   0   0   0   7       NULL    1   0   0   8   6   1   0   0   0   0   0   0   0   NULL    13  0   0   0   0   0   0   0   0   0   133121  3452998 1   1
8   $AnalogDevice                                   $AnalogDevice              1    0   0   0   0   8       NULL    2   0   0   9   7   0   0   0   0   0   0   0   0   NULL    10  0   0   0   0   0   0   0   0   0   131073  419343  1   2
9   $DDESuiteLinkClient                          $DDESuiteLinkClient               1    0   0   0   0   9       NULL    3   0   0   10  8   1   0   0   0   0   0   0   0   NULL    11  0   0   0   0   0   0   0   0   0   133121  419344  1   3
10  $DiscreteDevice                              $DiscreteDevice                   1    0   0   0   0   10      NULL    2   0   0   11  9   0   0   0   0   0   0   0   0   NULL    10  0   0   0   0   0   0   0   0   0   131073  419345  1   2
11  $InTouchProxy                                 $InTouchProxy                1    0   0   0   0   11      NULL    3   0   0   12  10  0   0   0   0   0   0   0   0   NULL    11  0   0   0   0   0   0   0   0   0   131073  419346  1   3
分层名称示例输出:

 TagName                               a    b   c   d   e   f   g   h   j   j   k   l   m
    PomFPTemp.PV                     1062   0   10  0   10  0   4   0   0   0   0   0   0
    PomFPWilgWzgl.PV                   1    0   10  0   10  0   4   0   0   0   0   0   0
    SNST3P1BrakFWHMocD3f.PV          1063   0   10  0   10  0   4   0   0   0   0   0   0
    SNST3P1BrakFWHMocP3f.PV           46    0   10  0   10  0   4   0   0   0   0   0   0
    SNST3P1BrakFWHMocQ3f.PV          1063   0   10  0   10  0   4   0   0   0   0   0   0
    SNST3P1BrakFWHMocQ3fIntExp.PV    1063   0   10  0   10  0   4   0   0   0   0   0   0
    SNST3P1BrakFWHMocQ3fIntImp.PV    1063   0   10  0   10  0   4   0   0   0   0   0   0
    SNST3P1BrakFWHMocQn3f.PV         1063   0   10  0   10  0   4   0   0   0   0   0   0
    SNST3P1EnkvarhExp3f.PV           1060   0   10  0   10  0   4   0   0   0   0   0   0
    SNST3P1EnkvarhImp3f.PV           1060   0   10  0   10  0   4   0   0   0   0   0   0
ID tag_name            contained_name               hierarchical_name       a   b   c   d   e   f   g   h   i   j   k   l   m   n   o   p   q   r   s   t   u   v   w   x   y   z   aa  bb  cc  dd  ee  ff  gg  hh
1   $Galaxy                                         $Galaxy                     1   0   0   0   0   1       NULL    NULL    0   0   1   1   1   0   0   0   0   0   1   0   NULL    23  0   0   0   0   0   0   0   0   0   133123  50026   1   NULL
2   proba7                                          Galaxy_001                  0   0   0   0   1   1       NULL    NULL    0   0   848 1   0   1   0   0   0   0   1   0   NULL    23  0   0   0   0   0   0   0   0   0   4098    878020  1   NULL
3   $_AutoImport                                    $_AutoImport               1    0   0   0   0   3       NULL    NULL    0   0   4   2   0   0   0   0   0   0   1   0   NULL    10  0   0   0   0   0   0   0   0   0   131075  3699    1   NULL
4   $_DiCommon                                      $_DiCommon                 1    0   0   0   0   4       NULL    NULL    0   0   5   3   0   0   0   0   0   0   1   0   NULL    10  0   0   0   0   0   0   0   0   0   131075  50023   1   NULL
5   $WinPlatform                                    $WinPlatform               1    0   0   0   0   5       NULL    1   0   0   6   4   1   0   0   0   0   0   0   0   NULL    1   0   0   0   0   0   0   0   0   0   133121  419340  1   1
6   $AppEngine                                      $AppEngine                 1    0   0   0   0   6       NULL    1   0   0   7   5   1   0   0   0   0   0   0   0   NULL    3   0   0   0   0   0   0   0   0   0   133121  419341  1   1
7   $Area                                           $Area                      1    0   0   0   0   7       NULL    1   0   0   8   6   1   0   0   0   0   0   0   0   NULL    13  0   0   0   0   0   0   0   0   0   133121  3452998 1   1
8   $AnalogDevice                                   $AnalogDevice              1    0   0   0   0   8       NULL    2   0   0   9   7   0   0   0   0   0   0   0   0   NULL    10  0   0   0   0   0   0   0   0   0   131073  419343  1   2
9   $DDESuiteLinkClient                          $DDESuiteLinkClient               1    0   0   0   0   9       NULL    3   0   0   10  8   1   0   0   0   0   0   0   0   NULL    11  0   0   0   0   0   0   0   0   0   133121  419344  1   3
10  $DiscreteDevice                              $DiscreteDevice                   1    0   0   0   0   10      NULL    2   0   0   11  9   0   0   0   0   0   0   0   0   NULL    10  0   0   0   0   0   0   0   0   0   131073  419345  1   2
11  $InTouchProxy                                 $InTouchProxy                1    0   0   0   0   11      NULL    3   0   0   12  10  0   0   0   0   0   0   0   0   NULL    11  0   0   0   0   0   0   0   0   0   131073  419346  1   3
输出表(示例):


向您致意并提前感谢您的建议。我尽了最大努力使此示例表可读。

这应该是索引问题。在启用查询执行计划的情况下运行两个查询,我相信您会发现每个查询都使用了不同的索引。不过,我建议在SELECT而不是WHERE子句下使用substring()(例如,可以使用子查询)。删除连接条件中的子字符串将使其速度更快。因此,如果可以使数据“漂亮”,这将是对子字符串()的另一种方法部分,如果它是一个固定状态,这意味着它将被反复使用,您可以使用computed column,这将优化您的表和查询。从查询执行计划中,我可以看到大多数成本是以25%的成本在聚集索引扫描中。每种成本为7%的哈希匹配很少。在CTE INST中使用select substring时没有区别在内部联接子句中选择子字符串的ad