调整插入到 Oracle 数据库中
Posted
技术标签:
【中文标题】调整插入到 Oracle 数据库中【英文标题】:Tuning insert into the Oracle database 【发布时间】:2014-07-01 09:34:44 【问题描述】:关于插入 Oracle 数据库的问题...我有代码示例(如下),此代码将 500 条记录插入 db..但插入 500 条记录需要 3 分钟...到目前为止因为我知道表格有索引,服务器是全新的而且非常快,我对网络速度做了一些测试,一切都很好,所以我怀疑我的“插入代码”不好......有吗一种太像“加速”插入的方式,或者我忽略了其他一些东西......所以任何建议都是好的......谢谢!
这是“插入”代码示例:
myQuery = " INSERT INTO AGR3PL_LINE (IDOC_NUM, SEG_NUM, LINN02, WMLI02, CATN02, LQTY02, IUNT02, TOWT02, WUOM02, DTDR02, ORDL02, LOCN02, DEXP02, DPRO02, NOTS02, " +
" PNUM05, PDES05, PTYP05, PCLS05, IUNT05, SUNT05, PUNT05, ISCF05, SPCF05, SHLU05, SHLF05, CSHL05, BATC05, BARC05, ANAC05, WTSU05, WTBU05, CWIT05, DFSS05) " +
" VALUES (" + Lidoc_num + ",'" +
SEG_NUM_L + "'," +
(!dr_art_line.Table.Columns.Contains("LineNumber") || dr_art_line["LineNumber"].ToString().Length <= 0 ? 0 : dr_art_line["LineNumber"]) + "," +
WMLI02 + ",'" +
(!dr_art_line.Table.Columns.Contains("ItemNumber") || dr_art_line["ItemNumber"].ToString().Length <= 0 ? string.Empty : dr_art_line["ItemNumber"]) + "','" +
QuantityInIssueUnit_value + "','" +
QuantityInIssueUnit_uom + "'," +
QuantityInSecondaryUnit.ToString().Replace(",", ".") + ",'" +
WUOM02 + "','" +
DeliveryDate + "'," +
(!dr_art_line.Table.Columns.Contains("OrderLine") || dr_art_line["OrderLine"].ToString().Length <= 0 ? 0 : dr_art_line["OrderLine"]) + ",'" +
(!dr_art_line.Table.Columns.Contains("LotNumber") || dr_art_line["LotNumber"].ToString().Length <= 0 ? string.Empty : dr_art_line["LotNumber"]) + "','" +
ExpirationDate + "','" +
DateOfProduction + "','" +
(!dr_art_line.Table.Columns.Contains("Notes") || dr_art_line["Notes"].ToString().Length <= 0 ? string.Empty : dr_art_line["Notes"]) + "','" +
(!dr_art_line.Table.Columns.Contains("ItemCode") || dr_art_line["ItemCode"].ToString().Length <= 0 ? string.Empty : dr_art_line["ItemCode"]) + "','" +
(!dr_art_line.Table.Columns.Contains("Description") || dr_art_line["Description"].ToString().Length <= 0 ? string.Empty : dr_art_line["Description"]) + "','" +
(!dr_art_line.Table.Columns.Contains("ItemType") || dr_art_line["ItemType"].ToString().Length <= 0 ? string.Empty : dr_art_line["ItemType"]) + "','" +
(!dr_art_line.Table.Columns.Contains("ItemClass") || dr_art_line["ItemClass"].ToString().Length <= 0 ? string.Empty : dr_art_line["ItemClass"]) + "','" +
(!dr_art_line.Table.Columns.Contains("IssueUnit") || dr_art_line["IssueUnit"].ToString().Length <= 0 ? string.Empty : dr_art_line["IssueUnit"]) + "','" +
(!dr_art_line.Table.Columns.Contains("StockUnit") || dr_art_line["StockUnit"].ToString().Length <= 0 ? string.Empty : dr_art_line["StockUnit"]) + "','" +
(!dr_art_line.Table.Columns.Contains("PurchaseUnit") || dr_art_line["PurchaseUnit"].ToString().Length <= 0 ? string.Empty : dr_art_line["PurchaseUnit"]) + "'," +
IssueToStockConversionFactor.ToString().Replace(",", ".") + "," +
StockToPurchaseConversionFactor.ToString().Replace(",", ".") + ",'" +
(!dr_art_line.Table.Columns.Contains("ShelfLifeUnit") || dr_art_line["ShelfLifeUnit"].ToString().Length <= 0 ? 0 : dr_art_line["ShelfLifeUnit"]) + "'," +
(!dr_art_line.Table.Columns.Contains("ShelfLife") || dr_art_line["ShelfLife"].ToString().Length <= 0 ? 0 : dr_art_line["ShelfLife"]) + "," +
(!dr_art_line.Table.Columns.Contains("CustomerShelfLife") || dr_art_line["CustomerShelfLife"].ToString().Length <= 0 ? 0 : dr_art_line["CustomerShelfLife"]) + "," +
MandatoryLot + ",'" +
(!dr_art_line.Table.Columns.Contains("BarcodeIssueUnit") || dr_art_line["BarcodeIssueUnit"].ToString().Length <= 0 ? string.Empty : dr_art_line["BarcodeIssueUnit"]) + "','" +
(!dr_art_line.Table.Columns.Contains("BarcodeStockUnit") || dr_art_line["BarcodeStockUnit"].ToString().Length <= 0 ? string.Empty : dr_art_line["BarcodeStockUnit"]) + "'," +
WeightIssueUnit.ToString().Replace(",", ".") + "," +
gros_un.ToString().Replace(",", ".") + "," +
cat_item + ",'" +
(!dr_art_line.Table.Columns.Contains("DefaultStockStatus") || dr_art_line["DefaultStockStatus"].ToString().Length <= 0 ? string.Empty : dr_art_line["DefaultStockStatus"]) + "')";
【问题讨论】:
这可能是因为您的代码,尝试在控制台(标准输出)中打印您生成的所有插入。如果 if 会像使用数据库时一样慢,那么您必须优化插入生成 如果类型是 CLOB 会更好吗?我只是问 也许,我从未与 CLOB 合作过。你有例子吗? 【参考方案1】:如果您在等待事件运行时查看了等待事件并且没有什么明显的,那么最好的方法是跟踪会话。你会在那里找到你的答案。有几种跟踪会话的方法。我使用的(假设我不需要登录触发器来立即启用它)是:
1) 查找会话的 spid 从 v$session s、v$process p 中选择 spid,其中 s.paddr = p.addr 和 s.sid = '&sid'; 2) 启用 oradebug 跟踪(作为 sysdba) oradebug setospid &spid oradebug 事件 10046 永远跟踪名称上下文,级别 12 3) 查找跟踪文件(检查 diag 目录。跟踪文件将在文件名中包含 spid) - 在 linux 中,“ls -lrt”通常会将其显示为列表中显示的最后文件之一 4) 如果你想卷起来,你可以在跟踪文件上运行 tkprof。如果您想要原始详细信息,请查看“.trc”文件(它将显示发生的所有事情、时间和发生的顺序) 5) 禁用跟踪(如果会话未注销) oradebug setospid &spid oradebug 事件 10046 跟踪名称上下文关闭
【讨论】:
以上是关于调整插入到 Oracle 数据库中的主要内容,如果未能解决你的问题,请参考以下文章
从java程序中向oracle中插入数据,为啥插入顺序总是不对
如何使用一个插入语句将多行插入到 oracle 数据库中? [复制]