我被Oracle管理员困扰,告诉我,如果我使用绑定变量而不是内联,Oracle可以优化更好的请求。代码为C#,并使用Devart Oracle提供程序Oracle12c +。我了解,如果您运行select-缓存统计信息,则下一个类似的命令会更好。.但是单行插入/更新会有所影响。我不相信。
任何人都可以给出明智的答案吗?
例:
update x set a = 0 where id = 100
vs
update x set a = :a where id = :id
编辑:未绑定的值仅是数字,因此SQL注入不在问题范围内
绝对的答案促使我进行了基准测试。它模仿生产服务器的确切条件。
30000次迭代的结果(相差6.5%):
Inline vars: 00:01:09.7444764
Bound vars: 00:01:05.4454827
static void Main(string[] args)
{
var LEN = 30000;
var cmd = new OracleCommand();
var sql = "update some_table set progress={0} where id=100";
var rnd = new Random((int)DateTime.Now.Ticks);
//
var sw = new Stopwatch();
sw.Start();
for (int i = 0; i < LEN; i++)
{
using(var cnn = new OracleConnection("xxx"))
{
sql = string.Format(sql, rnd.Next());
cmd.CommandText = sql;
cmd.Connection = cnn;
cnn.Open();
cmd.ExecuteNonQuery();
}
}
sw.Stop();
Console.WriteLine("Inline vars: {0}", sw.Elapsed);
//
sw.Restart();
sql = "update tm_fnet set progress=:p where id=:i";
for (int i = 0; i < LEN; i++)
{
using (var cnn = new OracleConnection("xxx"))
{
cmd.CommandText = sql;
cmd.Connection = cnn;
cmd.Parameters.Clear();
cmd.Parameters.AddWithValue("i", 100);
cmd.Parameters.AddWithValue("p", rnd.Next());
cnn.Open();
cmd.ExecuteNonQuery();
}
}
sw.Stop();
Console.WriteLine("Bound vars: {0}", sw.Elapsed);
//
Console.ReadKey(false);
}
结论-除非您必须关心SQL注入,否则它并不那么重要(但这与我的情况无关)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句