1

假设以下代码:

public void ExecuteSomeSql(string sql, SqlConnection sqlConnection)
{
  etc etc
}

并假设allSql= sql1+ sql2+ sql3

性能或其他方面是否有任何差异:

方案 1

ExecuteSomeSql(allSql, sqlConnection);

方案 2

ExecuteSomeSql(sql1, sqlConnection);
ExecuteSomeSql(sql2, sqlConnection);
ExecuteSomeSql(sql3, sqlConnection);

我不太确定通过同一连接多次执行 SQL 时会发生什么。大概没有复杂的握手,因为我们已经有一个活动的连接。

有什么强有力的理由让我更喜欢场景 1 而不是场景 2?

(对于上下文,我的问题实际上是我是否可以在 C# 中实现一些我更愿意执行的业务规则,或者(性能很重要)我是否应该尝试在单个 SQL 命令中执行所有内容。)

4

1 回答 1

0

我想说这在很大程度上取决于您正在执行的操作。如果您要插入 1 条记录,那么您所做的事情不会有很大的不同(但您应该使用参数化查询以确保安全并允许缓存 exec 计划)。如果您要插入 10 条记录,您可以通过发送一个包含 10 个用分号分隔的语句的 sql 字符串来做到这一点,但您将无法使用参数(或者如果您这样做了,您需要 10x 个参数,其中 x 是字段数你正在插入),所以你最好进行参数化查询。如果你有 100 次插入,你真的应该使用参数化查询。如果要进行 1000 次插入,则可能应该使用 SqlBulkCopy 类

总而言之,没有任何理由不使用参数化语句。即使是反对使用它们的人“因为 sql 是动态的”——你当然可以构建一个参数化的 SQL 字符串并在循环中填充参数集合,就像你可以将字符串连接在一起一样。

如果您正在寻找一种提高 SQL 性能的方法,您需要在示例中发布更多关于 SQL 内容的信息。如果将单个字符插入单个列一百万次,那么毫无疑问使用一个参数化查询,您在其中编写 SQL,添加参数,执行查询,然后(更改参数值并重新执行)进一步 999999 次无疑比将 SqlCommandText 设置一百万次并在每次执行时再次将文本发送到服务器要快。你可能永远不会让服务器接受一个 30 多兆字节的字符串,其中包含一百万个串联的“插入 a(a) 值('a');” 与原始问题的字符串 concat sql1 + sql2 ... + sql1000000极其等价的语句

要解决所查询的问题(而不是回答所提出的问题),请使用参数化查询,构建查询和参数集合一次,更改参数值但需要 N 次.. 或者.. 如果您的操作确实是批量操作,使用为此优化的类(例如 SqlBulkCopy)

如果你的sql1、2、3都是不同类型的操作,准备3条语句,在客户端根据需要改变执行次数。您真正希望每个 SqlCommandText 使用多个语句的唯一时间是用于诸如“INSERT INTO ... SELECT SCOPE_IDENTITY()”之类的内容来检索计算值,例如自动编号

于 2013-03-07T11:24:44.457 回答