如何提高选择性能

时间:2014-05-11 04:40:53

标签: sql oracle stored-procedures plsql

我编写了一个带有几个输入参数的过程。 我需要验证输入。 如果它们是有效值,则它们必须存在于数据库表中 - attribute_values。 问题是attribute_values表包含百万条记录。 我现在应该改善选择查询的性能。 为了验证1个输入参数,我正在做这样的事情。

SELECT COUNT(1) INTO COUNT_VAR 
  FROM ATTRIBUTE_VALUES A 
 WHERE A.ATTRIBUTE_VALUE = input_paramater1;
IF COUNT_VAR = 1 THEN 
SELECT ATTRIBUTE_VALUE_ID INTO MYVAR1 
  FROM ATTRIBUTE_VALUES A 
 WHERE A.ATTRIBUTE_VALUE =  input_paramater1; 
END IF; 

other_procedure(MYVAR1);

有关提高从包含一百万条记录的表中进行选择的性能的任何建议。 还有计数(*)和计数(1)更好。

3 个答案:

答案 0 :(得分:2)

我建议您按照以下方式修改此逻辑,而不是对SELECT COUNT(*)...执行SELECT ID...,而不是BEGIN SELECT ATTRIBUTE_VALUE_ID INTO MYVAR1 FROM ATTRIBUTE_VALUES A WHERE A.ATTRIBUTE_VALUE = INPUT_PARAMETER1 AND ROWNUM = 1; COUNT_VAR := 1; EXCEPTION WHEN NO_DATA_FOUND THEN COUNT_VAR := 0; MYVAR1 := NULL; END; OTHER_PROCEDURE(MYVAR1); ,我建议您按照以下方式重写此逻辑:

SELECT COUNT...

这有两个方面。首先,根据我的经验{{1}} ,所以我尽量避免使用它。其次,这不仅可以保存第二个查询,还可以利用PL / SQL内置的标准异常处理。

分享并享受。

编辑:给出了OP的启示(在上面的问题的评论中),ATTRIBUTE_VALUES.ATTRIBUTE_VALUE不是唯一的我已经更新了上面的代码,这样如果多于一行就不会失败被退回。

答案 1 :(得分:1)

对于这些查询,我建议索引:

create index attribute_values_attribute_value on attribute_values(attribute_value);

这应该足以满足您的目的。

答案 2 :(得分:0)

3步骤:

1)如果可能,请对表格进行分区。

2)按如下方式创建索引

CREATE INDEX idx1_attribute_values ON attribute_values(attribute_value, attribute_value_id);

3)使用以下编码样式以获得更好的结果

BEGIN
    SELECT attribute_value_id
      INTO myvar1
      FROM attribute_values a
     WHERE a.attribute_value = input_parameter1;
EXCEPTION
WHEN others THEN
    myvar1 := 0;    -- Handle the error codes accordingly
END;

如果仍然无效,请发布查询计划。

相关问题