Cassandra CQL 准备好的语句比非准备好的语句慢?

Posted

技术标签:

【中文标题】Cassandra CQL 准备好的语句比非准备好的语句慢?【英文标题】:Cassandra CQL prepared statements slower than non prepared ones? 【发布时间】:2015-03-27 14:08:40 【问题描述】:

最近我们一直在对我们的一些 Cassandra 集群进行压力测试,比较一致性级别、准备/非准备语句和同步/异步执行模式的所有组合的性能,并且在每个配置中,最高性能始终是以下组合(任何/一个)异步运行的非准备语句!

那里有一些有意义的位,任何/一个一致性级别的限制较少,因此应该是最快的。同样异步运行查询,因此利用并行计算应该比顺序运行更快,但是准备好的和非准备好的语句呢?

我们一直阅读和听到(博客、峰会、布道者……)我们应该尽可能支持准备好的声明而不是未准备好的声明,但是这个结果令人困惑……

为了让您了解一些背景知识,我们使用了两种不同的工具(一种是内部构建的,一种是 cassandra-stress),它们都产生了相同的结果。

以前有人遇到过这种情况吗?哪个是解释?我们缺少什么?

问候

编辑:

Results using cassandra-stress tool Results using our own Ruby script

【问题讨论】:

您是在每次查询时都做准备,还是只做一次?如果只做一次,你应该节省一些时间,但我在 Cassandra 的跟踪中看到它可以节省几微秒的时间(因为需要在 cassandra 端准备未准备好的查询)。它应该节省通过线路传输的数据量,因为一旦您准备好查询,双方都知道列定义。 嘿@AndyTolbert 感谢您的评论。是的,我只准备一次声明。此外,准备好的语句应该将语句解析保存在 Cassandra 端,以便后续执行同一语句。据我了解,准备好的语句保存在网络中(语句执行仅提交绑定值)和解析(语句仅由引擎解析一次)。这就是它让这种情况如此奇怪的原因! 一些细节会很有帮助。即:什么语言驱动。示例查询?集群的大小和密钥空间的 RF。如果可以的话,数据模型。 嗨@PatrickMcFadin 感谢您的回复!我刚刚编辑了这篇文章,其中包含我使用 cassandra-stress 工具分享结果的要点。我现在将添加另一个包含我们自己的基准测试 (Ruby) 的结果。 这里的集群是EC2上一个VPC中的3节点集群,每个AZ中1个节点。 DSE 4.6,C* 2.0.12 【参考方案1】:

查看您的数据后,我认为您在此处看到的限制不是您的集群,而是运行测试的服务器。如果您正在测试 3 节点 Cassandra 集群,您可能需要 2-3 倍的客户端服务器产生负载。您可以尝试通过增加线程数来最大化每个客户端的使用量,但您会遇到限制。

一般来说,如果您在 cassandra 压力测试中得到平线结果,请查看被测节点。如果他们大部分时间都很无聊,请增加客户端(或线程)的数量,直到节点受到压力。 :)

【讨论】:

嘿@PatrickMcFadin,非常感谢您的回复,并对延迟回来感到抱歉,我们一直在同时对具有 3 个客户端的集群施加压力,现在结果更有意义。我们看到每个客户的操作较少,但整体较高,而且准备好的语句比未准备好的语句表现稍好(我期待更多的差异)。结论:prepared statements就像关系数据库索引,负载不够没用?结果要点:gist.github.com/calonso/e23dfadda3e9a5cca016 和 gist.github.com/calonso/ea8323e953648fed0541 完全正确。它们旨在减少宝贵的毫秒数。正如 Netflix 所做的一项研究所示,在高负载下,它确实可以发挥作用。 techblog.netflix.com/2013/12/astyanax-update.html

以上是关于Cassandra CQL 准备好的语句比非准备好的语句慢?的主要内容,如果未能解决你的问题,请参考以下文章

MySql“视图”、“准备好的语句”和“准备好的语句需要重新准备”

如何查看准备好的语句的内容?

Golang使用准备好的SQL语句

如何使用 MySQL 准备好的语句缓存?

我啥时候应该使用准备好的语句?

MySQLi:使用一个准备好的语句插入多行