我正在构建一个批处理插入4096条记录的MySql查询。实际插入非常快,但瓶颈是生成查询。优化这一点的任何提示?字符串生成目前比查询长约18倍。
let builder = StringBuilder(524288)
Printf.bprintf builder
"
INSERT INTO %s
(`ID`,
`Tag`,
`Port`,
`Excess`,
`Return`,
`StartDate`,
`EndDate`
)
values "
x.evaluationstable
evaluations
|> Seq.iter(fun (e) ->
Printf.bprintf builder
" (%d, '%s', '%s', %A, %A, %A, %A), "
e.ID
e.Tag
e.Port
e.Excess
e.Return
(e.StartDate.ToString(x.datetimeformat))
(e.EndDate.ToString(x.datetimeformat))
)
答案 0 :(得分:10)
尝试使用StringBuilder.AppendFormat
代替Printf.bprintf
。当我在你的问题例子中做出这个改变时,我看到了巨大的性能提升(~80x)。
evaluations
|> Seq.iter (fun (e) ->
builder.AppendFormat(
" ({0}, '{1}', '{2}', {3}, {4}, {5}, {6}), ",
e.ID,
e.Tag,
e.Port,
e.Excess,
e.Return,
(e.StartDate.ToString("MM/dd/yyyy")),
(e.EndDate.ToString("MM/dd/yyyy"))
) |> ignore
)
答案 1 :(得分:3)
我会尽量避免将数据直接嵌入到SQL中。使用一系列带参数的预准备语句,并将这些参数设置为值(不对其进行格式化)。这样更安全,效率更高。
你是否仍然可以在一个批次中而不是在同一个交易中的几个单独的调用中执行此操作,我不确定。