我编写了一个带有几个输入参数的过程。 我需要验证输入。 如果它们是有效值,则它们必须存在于数据库表中 - 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)更好。
答案 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)
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;
如果仍然无效,请发布查询计划。