MemSQL中的动态SQL

时间:2015-12-09 20:00:36

标签: memsql

我们正在考虑使用MemSQL来提供针对我们数据的筛选功能。筛选操作可以具有任意数量的标准 - 最有可能使用Oracle或MySQL中的“动态SQL”解决的需求类型。

这种类型的任意筛选会成为MemSQL的问题吗?来自MemSQL的This FAQ表明编译查询需要时间。这是否意味着每次MemSQL看到一个新的WHERE子句时,都必须编译一个新的C ++片段?如果是这样,编译引入的延迟有多长?

感谢。

1 个答案:

答案 0 :(得分:1)

这是正确的,如FAQ中所述,每个新WHERE子句都需要查询编译,除非唯一的区别是参数值。 (这是因为我们根据where子句中可用的过滤器编译和优化计划。)因此,如果添加新过滤器,则需要进行另一次编译。在memsql的当前版本中,根据查询,选择查询的编译可能需要大约1秒或更多。

如果你事先知道所有可能的标准,那么避免这种情况的一种解决方法是编写一个WHERE子句,如:

WHERE (a=1 OR 0) AND (b<5 OR 0) AND (c=3 OR 0)

相当于

WHERE (a=1) AND (b<5) AND (c=3)

当然,这些过滤器可以是任意表达式。通过将OR 0更改为OR 1,您可以忽略该条件,例如得到b <5你写

WHERE (a=1 OR 1) AND (b<5 OR 0) AND (c=3 OR 1)

这不需要额外的编译,因为只有参数在变化。但请注意,它可能无法正常运行,因为编译的查询计划必须在运行时检查每个子句(这就是这种解决方法避免重新编译的方式),并且最佳计划可能会有所不同,具体取决于实际存在的过滤器。