我希望能够一次查询多个句柄,其中表具有相同的格式,如下所示:
手柄: 8000,8001,8003 表: 福
想要执行以下操作:
x:hopen `8000`8001`8003
x select from foo col1,col2
所以我从每个句柄上的每个 foo 表中获取行。
有没有办法实现这一目标?
谢谢
使用"each"打开每个手柄
q)h:hopen each 8000 8001 8002
q)h
476 480 484i
使用"应用每个左侧"将相同的查询发送到每个服务器
q)r:h@:"select col1,col2 from foo"
q)r
+`col1`col2!(1 2;2 3)
+`col1`col2!(1 2;2 3)
+`col1`col2!(1 2;2 3)
然后,您必须将结果夷为平地:
q)show res:raze r
col1 col2
---------
1 2
2 3
1 2
2 3
1 2
2 3
如果您不打算重复使用句柄,您可以这样做
q)raze`::8000`::8001`::8003@:"select from foo col1,col2"
与其他答案相同,但使用set(neg h(而不是get(h(更复杂
说明书/负载平衡在此示例中也有帮助。
q)h:hopen each 8000 8001 8002
q)h
476 480 484i
q)r:(0#0i)!() /dictionary of handles and results
设置服务器响应的回调
q).z.ps:{@[`r;.z.w;:;x]}
向每个句柄发送"set"查询
q)(neg h)@:({(neg .z.w)value"select col1,col2 from foo"};`)
等到所有消息都有响应
q)h .:()
最后,将结果放在一起
q)raze r h
唯一的优势是并发性。
正如@AlexanderBelopolsky指出的,不要忘记
q)hclose each h