在Server中,我只使用一个JOIN语句将一个时间范围扩展为多个间隔记录。该查询看起来类似于
SELECT
a.UltimateID,
a.SiteID,
ProductID,
b.Date
FROM
ss_UsageTracking a
JOIN SELECTServerSchema.ss_fn_CreateDateTable(@StartDate, @EndDate, 1) b ON b.Date BETWEEN a.StartDate AND a.EndDate这为StartDate和EndDate之间的每个数据提供了一条记录--我们已经想出了一种使用UDF的方法,它返回一个SQL和一个交叉应用爆炸语句。
我看到的问题是,我们正在计算日期范围数百万次,在行集中每一行计算一次。这似乎是非常低效率的,而且确实是处理过程中时间消耗的主要来源。
我已经创建了一种生成上面使用的日期表的方法,并且希望对性能进行实验,但是used不支持语句之间的操作。
这方面应采用什么方法?从文档中还不清楚交叉应用程序是否能够处理这个问题。
我试图在后面的代码中使用一个UDF来返回true或false,如果间隔在两个日期之间,但是这只会导致一个错误-只能在列上,而不能在UDF的列上
发布于 2016-03-23 20:04:45
U不支持BETWEEN (或其他非完全连接)表达式的原因在join的ON子句中解释如下:https://msdn.microsoft.com/en-us/library/azure/mt621310.aspx。简而言之:我们现在只希望在join语法中公开可优化的联接,并使执行成本在其他情况下更加明显。
您可以使用CROSS JOIN执行连接,并将BETWEEN谓词移动到WHERE子句中。
所以而不是
@x = SELECT * FROM t JOIN s ON t.a BETWEEN s.beg AND s.end;你写
@x = SELECT * FROM t CROSS JOIN s WHERE t.a BETWEEN s.beg AND s.end;或者,您可以在联接之前调用select子句中的UDF,然后在等于联接中使用UDF的列。
所以而不是
@x = SELECT * FROM t JOIN s ON f(t.a) == s.b;你会写
@t = SELECT *, f(a) AS fa FROM t;
@x = SELECT * FROM @t JOIN s ON t.fa == s.b; // note this includes fa in result如果您觉得您宁愿让U为您进行重写,而代价是减少对性能影响的理解,请在http://aka.ms/adlfeedback上提交一个请求。
https://stackoverflow.com/questions/36186210
复制相似问题