PL SQL插入索引

问题描述 投票:0回答:2

我需要在表中插入500.000条记录,因此这个过程需要一段时间。我读到了关于提高查询速度的索引,但接下来的问题是:我应该在哪个参数上设置索引以使INSERT更快? (身份证?)。谢谢。

编辑

CREATE OR REPLACE PROCEDURE addNewUser(
                            firstName IN VARCHAR2,
                            lastName IN VARCHAR2,
                            email IN VARCHAR2,
                            username IN VARCHAR2,
                            password IN VARCHAR2,
                            job IN VARCHAR2) AS
  v_usersCount NUMBER := 0;
  v_userID NUMBER := 0;

BEGIN 
  SELECT COUNT(*) INTO v_usersCount
  FROM Users;

  v_userID := v_usersCount + 1;

  INSERT INTO Users VALUES(v_userID,firstName,lastName,email,username,password,job);
END addNewUser;

并且数据添加如下:

FOR i IN 1..50000
LOOP
    addNewTask('Task 1', 'Just Starter', 'High', 1, 'This is a description task.', 'Task Comment', '20-08-2015', 1);
END LOOP;
oracle indexing plsql records
2个回答
2
投票

您正在对每个插入执行查询,这会使其变慢。

尝试计算存储之外的ID并将其传递给过程,这样您就不必每次都在程序中查询它。


0
投票

SELECT COUNT(*)...是你在任何节目中可以做的最慢的事情之一。这需要读取表中的每一行 - 所以如果你第一次读取零行(快速)时插入1000行,下一次读取1行(快速),下次读取2行......最后你执行了1000行查询并读取499500行(总和0到999)。

在这种情况下,您应该使用SEQUENCE生成非重复数字。我将你的代码重写为:

CREATE SEQUENCE VALUE_SEQ;  -- just take defaults for all parameters

CREATE OR REPLACE PROCEDURE addNewUser(
                            firstName IN VARCHAR2,
                            lastName IN VARCHAR2,
                            email IN VARCHAR2,
                            username IN VARCHAR2,
                            password IN VARCHAR2,
                            job IN VARCHAR2) AS
BEGIN 
  INSERT INTO Users
    VALUES(VALUE_SEQ.NEXTVAL, firstName,lastName,
           email,username,password,job);
END addNewUser;
© www.soinside.com 2019 - 2024. All rights reserved.