C# 这里不需要考虑参数。@BoppityBop如果变量是数值的,则更有理由使用绑定变量/参数化查询。如果您试图将它们合并为字符串,它们首先会转换为字符串。然后由SQL Server解析回来。您正在添加相当于ToString()/Parse()的负载,同时也增加
C# 这里不需要考虑参数。@BoppityBop如果变量是数值的,则更有理由使用绑定变量/参数化查询。如果您试图将它们合并为字符串,它们首先会转换为字符串。然后由SQL Server解析回来。您正在添加相当于ToString()/Parse()的负载,同时也增加,c#,.net,oracle,oracle12c,devart,C#,.net,Oracle,Oracle12c,Devart,这里不需要考虑参数。@BoppityBop如果变量是数值的,则更有理由使用绑定变量/参数化查询。如果您试图将它们合并为字符串,它们首先会转换为字符串。然后由SQL Server解析回来。您正在添加相当于ToString()/Parse()的负载,同时也增加了发送到服务器的数据总量(字符串很快会比整数值大)。我认为您在这里测量的东西不对。这里可能只完成了一秒钟的实际数据库工作—为什么应用程序需要一分钟?(应用程序是否为每行创建新连接,并一次一行发送数据?)此外,这看起来像是一个串行测试。我可以想象
这里不需要考虑参数。@BoppityBop如果变量是数值的,则更有理由使用绑定变量/参数化查询。如果您试图将它们合并为字符串,它们首先会转换为字符串。然后由SQL Server解析回来。您正在添加相当于ToString()/Parse()的负载,同时也增加了发送到服务器的数据总量(字符串很快会比整数值大)。我认为您在这里测量的东西不对。这里可能只完成了一秒钟的实际数据库工作—为什么应用程序需要一分钟?(应用程序是否为每行创建新连接,并一次一行发送数据?)此外,这看起来像是一个串行测试。我可以想象,您的应用程序将有用户同时访问数据库。这就是可以获得巨大收益的地方。这是我的小组不久前制作的关于这个主题的视频。。。
update x set a = 0 where id = 100
vs
update x set a = :a where id = :id
-- Create simple table with one record.
create table x(id number, a number);
insert into x values(100, 0);
commit;
-- 10,000 concatenated UPDATES - 5 seconds.
begin
for i in 1 .. 10000 loop
execute immediate 'update x set a = '||i||' where id = 100';
end loop;
end;
/
-- 10,000 bind variable UPDATES - 0.3 seconds.
-- (Execute immediate is used here keep this test similar to above.)
begin
for i in 1 .. 10000 loop
execute immediate 'update x set a = :i where id = 100' using i;
end loop;
end;
/
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);
}