首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >U-SQL -连接

U-SQL -连接
EN

Stack Overflow用户
提问于 2016-03-23 18:39:13
回答 1查看 1.3K关注 0票数 1

在Server中,我只使用一个JOIN语句将一个时间范围扩展为多个间隔记录。该查询看起来类似于

代码语言:javascript
复制
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的列上

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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子句中。

所以而不是

代码语言:javascript
复制
@x = SELECT * FROM t JOIN s ON t.a BETWEEN s.beg AND s.end;

你写

代码语言:javascript
复制
@x = SELECT * FROM t CROSS JOIN s WHERE t.a BETWEEN s.beg AND s.end;

或者,您可以在联接之前调用select子句中的UDF,然后在等于联接中使用UDF的列。

所以而不是

代码语言:javascript
复制
@x = SELECT * FROM t JOIN s ON f(t.a) == s.b;

你会写

代码语言:javascript
复制
@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上提交一个请求。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36186210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档