我正在使用PL / SQL开发人员,我使用的数据库是带有Visual Studio 2013的Oracle 11G R2数据库。我也使用ODP.net。
目前我使用存储过程例如ClassNumber,种族等加载一组学生的数据。我加载的数据取决于最终用户请求的内容。
在我为相应的学生加载数据后,我想记录所请求学生的数据。现在,我知道如何做的唯一方法是通过传入一个StudentBioId并传入StudentBioIdentifier数组,为每个请求的学生进行数据库调用。 StudentBioIdentifier是与学生信息相关的标识符,例如ClassNumber,Ethnicity等。
我最初的想法是将一系列StudentIds和StudentBioIds数组传递给存储过程,但我无法将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;
问题
- 即使我为每个学生调用存储过程,它仍然会 更快?
- 有更好的选择吗?
答案 0 :(得分:1)
你问:
即使我为每个学生调用存储过程,它仍然是 快?
比什么更快?您已经描述了两种方法 - 为所有学生调用一次该程序,并为每个学生调用一次。这个问题似乎意味着你认为第三种选择更慢,但你不知道第三种选择是。
您似乎描述了两个存储过程 - 一个用于输入数据,另一个用于记录审计记录。你的意思是第一个程序调用另一个程序,或者应用程序首先调用一个,然后是另一个程序?如果应用程序直接调用它们,我认为这是糟糕的设计 - 不仅仅是为了性能,而且从事务一致性的角度来看。
审计数据应基本上记录为主插入的副作用,并随之提交或回滚;否则它真的不可靠。如果您的第一个程序调用第二个程序,我认为应该没问题,并且可能每个学生调用一次是合理的。编写该过程的另一种方法是传递一个嵌套表类型的单个数组,该数组在每一行中都包含StudentID和StudentBioID;这可以简单地大量插入审计表中。但是对于我想你正在做的那种卷,我怀疑每个学生一次插入,都在同一个PL / SQL调用中,会对性能产生重大影响。
另一种方法是使用触发器自动插入审计表,可能是每次插入StudentBio表。这对于审计数据来说并不罕见,但确实意味着每个插入到主表中的一个递归插入,这可能会稍慢。同样,缓慢是否显着取决于您的数量和预期的响应时间。