gpt4 book ai didi

database - 减少应用程序中的数据库调用并改进数据插入

转载 作者:搜寻专家 更新时间:2023-10-30 23:44:10 25 4
gpt4 key购买 nike

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

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

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

我最初的想法是将一组 StudentId 和一组 StudentBioId 传递到存储过程中,但我无法将 StudentBioId 与学生联系起来,因为学生 A 可能具有 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;

问题

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

-还有更好的选择吗?

最佳答案

你问:

Even if i call the stored procedure for each student would it still be faster?

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

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

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

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

关于database - 减少应用程序中的数据库调用并改进数据插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31087912/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com