MemSQL 中的动态 SQL

Dynamic SQL in MemSQL

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

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

谢谢。

这是正确的,如常见问题解答中所述,每个新的 WHERE 子句都需要查询编译,除非唯一的区别是参数值。 (这是因为我们根据 where 子句中可用的过滤器编译和优化计划。)因此,如果您添加一个新的过滤器,那将需要另一次编译。在当前版本的 memsql 中,select 查询的编译可能需要 ~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)

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