0

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

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

谢谢。

4

1 回答 1

1

这是正确的,如常见问题解答中所述,每个新的 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)

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

于 2015-12-09T20:27:24.453 回答