【问题标题】:Dynamic SQL in MemSQLMemSQL 中的动态 SQL
【发布时间】:2015-12-09 20:00:36
【问题描述】:

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

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

谢谢。

【问题讨论】:

    标签: singlestore


    【解决方案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

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

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

    【讨论】:

    • 感谢您的回答。编译后,查询的编译版本会在内存中保留多长时间?是直到下次重新启动,还是在一段时间后使编译的查询无效?
    • 它保留在内存中,直到下次重新启动或 plan_expiration_minutes(系统变量)。之后,它会留在磁盘上并在下次需要时从磁盘重新加载,这仍然非常快(比重新编译快得多)。我们永远不会自动使查询无效,除非您运行触发它的命令(例如从计划缓存中删除)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2014-06-12
    相关资源
    最近更新 更多