当前位置: 首页 > 面试题库 >

多个查询与存储过程

夏建木
2023-03-14
问题内容

我有一个应用程序,每小时执行约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是更好的选择。请让我知道您的输入。

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


问题答案:

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

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

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

您的过程将是

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

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

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



 类似资料:
  • 问题内容: 存储过程的执行情况如何?是否值得使用它们而不是在PHP / MySQL调用中实现复杂的查询? 问题答案: 存储过程将为您带来一点性能提升,但是大多数情况下,它们是用于执行用简单查询很难或不可能完成的任务。存储过程非常适合简化许多不同类型的客户端对数据的访问。数据库管理员之所以喜欢它们,是因为他们控制数据库的使用方式,而不是将这些细节留给开发人员。 寻找索引和适当的表设计以获得更好的性能

  • 问题内容: JOIN查询比几个查询快吗?(您运行主查询,然后根据主查询的结果运行许多其他的SELECT) 我问是因为加入它们会使我的应用程序设计复杂化 如果速度更快,谁能大致估算出多少?如果是1.5倍,我不在乎,但是如果是10倍,我想我是。 问题答案: 这太模糊了,无法为您提供与您的具体情况相关的答案。这取决于很多事情。Jeff Atwood(该网站的创始人)实际上撰写了有关此内容的文章。但是,在

  • 我想设计一个动态存储过程,在其中我将传递列名、表名和where子句。以便使用存储过程在具有不同参数的不同表上运行select。 我不确定这是否可能。如果是,任何人都可以帮助我的例子。 例如。

  • 问题内容: 如何在同一例程中使用两个游标?如果我删除了第二个游标声明并获取了循环,一切都将正常工作。该例程用于在我的webapp中添加朋友。它使用当前用户的ID和我们要添加的朋友的电子邮件作为朋友,然后检查电子邮件是否具有相应的用户ID,如果不存在朋友关系,它将创建一个。除此以外的任何其他常规解决方案也都很好。 问题答案: 我终于写了一个执行相同功能的不同函数: 我希望这是一个更好的解决方案,无论

  • 有没有特别好的方法可以做到这一点?我使用Panache/Hibernate ORM扩展PanacheEntity来为新表的模式创建映射。使用Repository方法,所有工作都按预期进行,并且我有反映GET、PUTs等的正确endpoint。我当前的问题是,我试图使用一个完全不同的endpoint,它只在Postgresql函数/存储过程上执行GET,并在访问该endpoint时返回数据。这是终点

  • 在我的AppMapper.xml中,我有一个查询,如: 假设它将返回姓名,地址,年龄,职业,这些都是字符串。我用这个对吗? *我正在询问是使用resultType=String还是使用resultMap“PersonProfileObj” 我的理解正确吗?