Database SQL插入和存储过程

Database SQL插入和存储过程,database,Database,与使用来自java/JDBC的直接SQL相比,使用存储过程将简单SQL插入表中是否有任何性能提升?在我的例子中,我使用的是sybase,但这可能是一个更一般的问题 谢谢只要您使用参数化查询,而不是通过字符串连接构建查询,就不用了(实际上,您也不需要参数化查询来提高性能,只需要安全性) 存储过程不会在简单的插入操作中提高性能。只要您使用参数化查询而不是通过字符串连接生成查询,就不会(实际上,您也不需要参数化查询来提高性能,只需要安全性) 存储过程不会在简单的插入上提高性能。一方面,使用SPs似乎会

与使用来自java/JDBC的直接SQL相比,使用存储过程将简单SQL插入表中是否有任何性能提升?在我的例子中,我使用的是sybase,但这可能是一个更一般的问题


谢谢

只要您使用参数化查询,而不是通过字符串连接构建查询,就不用了(实际上,您也不需要参数化查询来提高性能,只需要安全性)


存储过程不会在简单的插入操作中提高性能。

只要您使用参数化查询而不是通过字符串连接生成查询,就不会(实际上,您也不需要参数化查询来提高性能,只需要安全性)

存储过程不会在简单的插入上提高性能。

一方面,使用SPs似乎会提高性能。您的insert语句是预编译的

但是,即使您正在使用SPs,也将通过JDBC调用SPs。因此,解析该调用和绑定SP参数列表也需要处理。如果您试图插入的是30列,那么SP中仍然有30个参数,需要在JDBC调用中绑定这些参数

因此,如果它是一个执行插入的简单SP,我认为存储过程不会为您带来显著的收益

一方面,使用SPs的性能似乎会有所提高。您的insert语句是预编译的

但是,即使您正在使用SPs,也将通过JDBC调用SPs。因此,解析该调用和绑定SP参数列表也需要处理。如果您试图插入的是30列,那么SP中仍然有30个参数,需要在JDBC调用中绑定这些参数


因此,如果它是一个执行插入的简单SP,我认为存储过程不会为您带来显著的收益

不完全正确-未参数化的缓存、编译查询不能在参数值更改时重用-当然不是在所有DBMS中(您可以在某些情况下命名为正确的查询,但也有一些情况下不正确)。所以为了性能和安全性,你应该参数化。@David M-True,但他说的是简单的插入。对于这些类型的查询,缓存查询计划不会给您带来太多好处。对于更复杂的查询,我完全同意。对于单个不相关的插入,应该不会有性能提升,但是如果这些简单的插入相互关联,需要一起完成,或者作为一个事务来完成,那么存储过程是否会更有效地避免多次往返?@DyingCactus-可能就是这样,但我猜任何收益都是微乎其微的。如果您的插入件被预编译,并且您使用JDBC事务,我会设想性能将接近于标准。在我看来,与存储过程引入的维护相比,存储过程带来的收益通常是可以忽略的。杰夫·阿特伍德(Jeff Atwood)将其总结得比我以往任何时候都要好得多:不完全正确-当参数值发生变化时,无法重用未参数化的缓存、编译查询-当然不是在所有DBMS中都可以使用(您可以在某些情况下说出正确的名称,但某些情况下肯定不正确)。所以为了性能和安全性,你应该参数化。@David M-True,但他说的是简单的插入。对于这些类型的查询,缓存查询计划不会给您带来太多好处。对于更复杂的查询,我完全同意。对于单个不相关的插入,应该不会有性能提升,但是如果这些简单的插入相互关联,需要一起完成,或者作为一个事务来完成,那么存储过程是否会更有效地避免多次往返?@DyingCactus-可能就是这样,但我猜任何收益都是微乎其微的。如果您的插入件被预编译,并且您使用JDBC事务,我会设想性能将接近于标准。在我看来,与存储过程引入的维护相比,存储过程带来的收益通常是可以忽略的。杰夫·阿特伍德(Jeff Atwood)对这一点的总结比我以往任何时候都要好:我看到了预编译查询是如何提高性能的。它将如何提高插入的性能?数据库引擎执行的每个语句都需要经过一个解析-编译-计划-执行的循环(粗略地说)。预编译在这方面有所帮助。因此,预编译语句可以避免一些步骤。但是,在您使用SP的情况下,insert语法已经过预编译,但是'exec mySP(parm1,parm2)'语句仍然需要经过db引擎的语法验证。我了解预编译查询是如何提高性能的。它将如何提高插入的性能?数据库引擎执行的每个语句都需要经过一个解析-编译-计划-执行的循环(粗略地说)。预编译在这方面有所帮助。因此,预编译语句可以避免一些步骤。但是,在您使用SP的情况下,insert语法已经过预编译,但是'exec mySP(parm1,parm2)'语句仍然需要由db引擎进行语法验证。