是否有比此查询更具可扩展性的子选择替代方案?

Posted

技术标签:

【中文标题】是否有比此查询更具可扩展性的子选择替代方案?【英文标题】:Is there a more scalable sub-select alternative to this query? 【发布时间】:2017-12-06 10:09:37 【问题描述】:

我有一个大表,其中包含 date 类型的 datetime 字段。作为将datetime 的两个列表作为输入的函数的一部分,即afromsatos 的列表,我想为这些afrom,ato 对中的每一个计算日期为的大表的所有行他们之间。

我想出了一种不太有效的方法来做到这一点,即它有一个严重的可扩展性缺陷:

/ t1 contains my afrom,ato pairs 
q)t1:([] afrom:`datetime$(2017.10.01T10:00:00.000 2017.10.02T10:00:00.000);ato:`datetime$(2017.10.01T12:00:00.000 2017.10.02T12:00:00.000));
q)t1
afrom                   ato                    
-----------------------------------------------
2017.10.01T10:00:00.000 2017.10.01T12:00:00.000
2017.10.02T10:00:00.000 2017.10.02T12:00:00.000

/ t2 contains my very very large dataset  
q)t2:([] date:`datetime$(2017.10.01T10:01:00.000 2017.10.01T10:02:00.000 2017.10.01T10:03:00.000 2017.10.02T10:01:00.000 2017.10.02T10:02:00.000 2017.10.02T10:03:00.000); ccypair:(3#`EURUSD),(3#`USDCHF); mid:6?1.05);
q)t2
date                    ccypair mid                 
----------------------------------------------------
2017.10.01T10:01:00.000 EURUSD  0.24256133290473372 
2017.10.01T10:02:00.000 EURUSD  0.091602176288142809
2017.10.01T10:03:00.000 EURUSD  0.10756538207642735 
2017.10.02T10:01:00.000 USDCHF  0.91046513157198206 
2017.10.02T10:02:00.000 USDCHF  0.76424539103172717 
2017.10.02T10:03:00.000 USDCHF  0.17090452200500295

然后我可以像这样使用cross

select from (t1 cross t2) where afrom<date,date<ato

这会产生正确的结果:

afrom                   ato                     date                    ccypa..
-----------------------------------------------------------------------------..
2017.10.01T10:00:00.000 2017.10.01T12:00:00.000 2017.10.01T10:01:00.000 EURUS..
2017.10.01T10:00:00.000 2017.10.01T12:00:00.000 2017.10.01T10:02:00.000 EURUS..
2017.10.01T10:00:00.000 2017.10.01T12:00:00.000 2017.10.01T10:03:00.000 EURUS..
2017.10.02T10:00:00.000 2017.10.02T12:00:00.000 2017.10.02T10:01:00.000 USDCH..
2017.10.02T10:00:00.000 2017.10.02T12:00:00.000 2017.10.02T10:02:00.000 USDCH..
2017.10.02T10:00:00.000 2017.10.02T12:00:00.000 2017.10.02T10:03:00.000 USDCH..

但是,当我有大量 afromsatos 列表时,cross 将“不必要地”扩展潜在的大表 t2 倍于 t1 的大小,并且不能很好地扩展。

有没有更好的方法来做到这一点?例如我试过这样的事情:

select from t2 where (exec afrom from t1)<date,date<(exec ato from t1)
error: `length

我猜我需要做一个循环,但不知道怎么做。子问题..是否可以有一个区间元组列表,即intervals(afrom;ato),而不是分开afromsatos

【问题讨论】:

【参考方案1】:

如果我理解正确,那么一种方法是使用t1 的每一行,并在每个时间范围内找到任何行落在within 的位置:

select from t2 where any date within/:value each t1
date                    ccypair mid
-----------------------------------------
2017.10.01T10:01:00.000 EURUSD  0.41239
2017.10.01T10:02:00.000 EURUSD  0.5429457
...

这与上面的 yoru 示例输出相同,但没有 afromato 列。在此示例中,选择范围内的所有值,any 和 each-right /: 允许您使用多个范围。如果这对您来说不能很好地扩展,那么您可以单独处理t1 的每一行:

raze[x;y]select from x where date within value y[t2]'[t1]

如果窗口不重叠,这应该可以工作。

如果您需要独占,或者您可以尝试稍微修改窗口时间以确保它们被排除:

q)select from t2 where any date within/:value each @[t1;`afrom`ato;+;1 -1*00:00:00.001]
date                    ccypair mid
-----------------------------------------
2017.10.01T10:01:00.000 EURUSD  0.41239
2017.10.01T10:02:00.000 EURUSD  0.5429457
...

要将afromato 列添加到输出中,您可以将它们与选定的行交叉:

raze[x;y]flip[1#'y]cross select from x where date within value[y]+1 -1*00:00:00.001[t2]'[t1]
afrom                   ato                     date                    ccypair mid
-----------------------------------------------------------------------------------------
2017.10.01T10:00:00.000 2017.10.01T12:00:00.000 2017.10.01T10:01:00.000 EURUSD  0.41239
2017.10.01T10:00:00.000 2017.10.01T12:00:00.000 2017.10.01T10:02:00.000 EURUSD  0.5429457
...

【讨论】:

感谢您的回答!请注意,我需要 exclusive,所以很遗憾 within 对我不起作用。 在实践中,这是否意味着如果一个值落入 2 个窗口,它将被排除,还是意味着边界时间被排除? 您好 Thomas,感谢您与我们联系。边界时间被排除,因此不能使用within。当afrom,ato 没有匹配项时,它不会给出任何行。 在我的编辑中包含的示例中,我通过最小时间增量修改了边界时间,这应该允许您使用 within,因为实际边界时间现在将从查询中排除。 我还需要 afromato 作为输出列的一部分...您将如何将其集成到您的解决方案中?

以上是关于是否有比此查询更具可扩展性的子选择替代方案?的主要内容,如果未能解决你的问题,请参考以下文章

与 ListView.builder 一起使用的扩展小部件的任何替代方案

处理 Firefox 扩展中的文本选择事件(防止用户选择文本)

分片技术(Sharding):如何使区块链更具可扩展性?

是啥让 Node.js 比 Apache 更具可扩展性?

规划可扩展 Web 应用程序的开发

有人听说过概念扩展服务的替代品吗? [关闭]