小编典典

多个查询与存储过程

sql

我有一个应用程序,每小时执行约20000次DATA-OPERATIONS DATA-
OPERATION总共具有30个参数(用于所有10个查询)。有些是文本,有些是数字。某些Text参数最长为10000个字符。

每个DATA-OPERATION都执行以下操作:

  • 单个DATA-OPERATION,可在数据库中插入/更新多个表(约10个)。
  • 对于每一次DATA-OPERATION,我都会建立一个连接,
  • 然后,我对DATA-OPERATION中的每个查询使用新的prepared语句。
  • 每次执行查询时,都会关闭准备语句。
  • 所有10个准备好的语句都重新使用了连接。
  • DATA-OPERATION完成后,连接将关闭。

现在执行此数据操作

  • 10个查询,10个准备好的语句(创建,执行,关闭),1次n / w调用。
  • 1个连接(打开,关闭)。

我个人认为,如果我通过以上10个查询创建存储过程,那将是更好的选择。

如果是SP,则DATA-OPERATION将具有:

  • 1个连接,1个可调用语句,1个n / w命中。

我建议了这个,但被告知

  • 这可能比SQL查询更耗时。
  • 它将给数据库服务器带来额外的负担。

我仍然认为SP是更好的选择。请让我知道您的输入。

基准测试是一种选择。将不得不搜索任何可以帮助实现这一目标的工具。也可以有人针对这种问题建议已经可用的基准。


阅读 166

收藏
2021-04-22

共1个答案

小编典典

任何建议都部分取决于执行查询的脚本所在的位置。如果执行查询的脚本与MySQL实例位于同一服务器上,则不会有太大的区别,但是与1个存储过程相比,执行200k查询的开销仍然很小。

无论哪种方式,我的建议都是将其作为存储过程。您可能需要几个过程。

  1. 该过程将您在每次操作中执行的10条语句组合为一个调用
  2. 可以使用a遍历参数表的过程,以将CURSOR其馈入过程1

您的过程将是

  1. 用参数填充表,该参数将由过程2馈入过程1
  2. 执行步骤2

由于不需要连接到MySQL服务器20000 * 10次,因此这将带来性能优势。尽管每个请求的开销可能很小,但毫秒数加起来。即使每个请求节省了0.1毫秒,也仍然节省了20秒。

另一个选择是修改您的请求以一次执行所有20k数据操作(如果可行),方法是调整您的10个查询以从上述数据库表中提取数据。所有这些的关键是将参数加载到单个批处理插入中,然后在过程中使用MySQL服务器上的语句来处理它们,而无需进一步往返。

2021-04-22