创建冗长的查询,我不得不过滤存储在另一个表中的机器号。为了避免必须将另一个(读取:第9个)表联接到查询中,我选择使用子查询将机器代码转换为机器ID:
加入astComponents CAT ON Concat(CAT.Code,'_',CAT.Specification)= AT.Code和CAT.AssetId = (从astAssets中选择前1个ID,其中Code = '2018090125')
总查询执行时间:00:01:25
然后,我决定从此过滤器中创建一个变量,以查看对执行时间的影响。在select
语句之前声明并在join
语句中使用的变量:
声明@Mach int
Set @Mach =(从astAssets中选择前1个ID,其中 代码='2018090125')
-
加入astComponents CAT ON Concat(CAT.Code,'_',CAT.Specification)= AT.Code和CAT.AssetId = @Mach
总查询执行时间:00:00:15
有人可以向我解释执行时间的主要区别吗?提取机器代码的子查询非常快速,但是我认为将子查询作为与变量相对的过滤器会使子查询在每一行执行。
干杯!
答案 0 :(得分:0)
较大查询中的子查询似乎与不相关:
(SELECT TOP 1 Id FROM astAssets WHERE Code = '2018090125')
也就是说,SQL Server可以完全独立于其余查询来评估此子查询。如果是这样,那么拥有它的代价就是运行一次子查询的代价。
尝试缓存子查询结果会加快速度,但是我不希望子查询成为较大查询整体性能的主要因素。
侧面说明:SQL Server足够聪明,可以识别出子查询不会在行与行之间变化。因此,它可能会执行一次,并将结果缓存到某个地方。