【问题标题】:Reducing Database calls in application and improve data insertions减少应用程序中的数据库调用并改进数据插入
【发布时间】:2015-06-27 10:50:16
【问题描述】:

我正在使用 PL/SQL 开发人员,我使用的数据库是 Oracle 11G R2 数据库和 Visual Studio 2013。我也使用 ODP.net。

目前我使用存储过程为一组学生加载数据,例如 ClassNumber、Ethnicity 等。我加载的数据取决于最终用户的请求。

在我为各个学生加载数据后,我想记录所请求学生的数据。现在我知道如何做到这一点的唯一方法是通过传入单个 StudentBioId 并传入 StudentBioIdentifiers 数组来为每个请求的学生进行数据库调用。 StudentBioIdentifier 是与学生信息相关的标识符,例如 ClassNumber、Ethnicity 等。

我最初的想法是将一组 StudentIds 和一组 StudentBioIds 传递到存储过程中,但我无法将 StudentBioId 与 Student 相关联,因为学生 A 的 Ethnicity 值可能为 XYZ 但学生 B 可能有ABC 种族值。如何在不进行繁重的选择查询的情况下确定哪个 StudentBioId 属于该学生?

我的目标是加快数据插入速度、正确插入数据并可能减少数据库调用。

所以目前我的存储过程中的代码如下所示:

CREATE OR REPLACE TYPE StudentBioIdArray IS VARRAY(100) OF NUMBER(2);

 PROCEDURE InsertDummyStudentAuditData(studentID IN NUMBER, studentBioIds IN    StudentBioIdArray) IS
    BEGIN
      IF studentBioIds IS NOT NULL AND studentBioIds.Count > 0 THEN
         FORALL i IN 1..studentBioIds.COUNT
             INSERT INTO audit_table(Id, Student_id, StudentBioId) 
               VALUES  (-1, studentID, studentBioIds(i));
       END IF;
     END InsertDummyStudentAuditData;

问题

-即使我为每个学生调用存储过程,它仍然会 更快?

-有更好的选择吗?

【问题讨论】:

  • 您想加快插入速度 - 但您真的确定这段代码是瓶颈吗?您是否测量了时间并收集了一些指标?您是否分析了系统在数据插入过程中花费大部分时间的部分? Pheraps 这不是这段代码的问题,而是网络问题,还是别的什么?你要插入多少次,每秒 10 次、每秒 100 次、每秒 1000 次?

标签: database oracle performance plsql insert-into


【解决方案1】:

你问:

即使我为每个学生调用存储过程,它仍然是 更快?

比什么更快?您已经描述了两种方法 - 为所有学生调用一次该过程,并为每个学生调用一次。这个问题似乎暗示有第三个选项你认为更慢,但你不知道说第三个选项是。

您似乎描述了两个存储过程 - 一个用于输入数据,另一个用于记录审计记录。你的意思是第一个过程调用另一个,或者应用程序首先调用一个,然后另一个?如果应用程序直接调用两者,我认为这是一个糟糕的设计——不仅是为了性能,而且从事务一致性的角度来看也是如此。

审计数据应该作为主要插入的副作用记录下来,并随之提交或回滚;否则它不是很可靠。如果您的第一个程序调用第二个程序,我认为应该没问题,并且可能每个学生调用一次是合理的。编写过程的另一种方法是传递嵌套表类型的单个数组,该数组在每一行中都包含一个 StudentID 和一个 StudentBioID;这可以简单地批量插入到审计表中。但是对于我想象你正在做的那种卷,我怀疑在同一个 PL/SQL 调用中为每个学生做一个插入操作会显着拖累性能。

另一种方法是使用触发器自动插入审计表,可能是每次插入 StudentBio 表。这对于审计数据并不少见,但确实意味着每次插入到主表中都要进行一次递归插入,这可能会慢一些。同样,缓慢是否显着取决于您的数量和预期的响应时间。

【讨论】:

  • 我的意思是更快是我猜它更快地对所有实体执行单个操作,即 BULK INSERT 而不是每个学生的单个操作。我只有一个存储过程将写入我的审计表。让我解释一下我目前的逻辑。第一个存储过程将插入学生数据。如果该调用成功,我将尝试调用我的存储过程以记录到审计表。但是我愿意接受建议。您提到了嵌套表方法。您能否为我提供一个关于嵌套表类型的批量插入的工作示例?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-25
  • 2010-11-10
  • 2013-11-28
相关资源
最近更新 更多