【发布时间】:2017-01-16 08:45:29
【问题描述】:
所以今天我必须调整一个旧程序。然后我进入这个查询(所有列,表名已更改):
--Get max date
DECLARE
l_col1 varchar2(20) := '11111';
l_col6 number := 20160131;
BEGIN
INSERT INTO temp_table (col1, col2, col3, col4, col5, col6)
SELECT col1, col2, col3, col4, col5, MAX(col6)
FROM data_table
WHERE (l_col1 = ' ' OR col1 = l_col1)
AND col6 <= l_col6
GROUP BY col1, col2, col3, col4, col5;
END;
这个运行 0.25 秒_太慢了。
但是当我更改为 IF - ELSE 语句时,新的查询仅运行 0.047 秒。
当我更改为 IN 语句时:~0.25 秒。
data_table 有索引(col1, col2, col3, col4, col5, col6)
Data_table 现在有 150 万行,并且会增加。插入的记录有数千行(在本例中为 5k 行)。
谁能解释并建议我应该如何重写原始查询?使用 IF-ELSE(重复代码)还是其他方式?谢谢。
DECLARE
l_col1 varchar2(20) := '11111';
l_col6 number := 20160131;
BEGIN
IF l_col1 = ' '
THEN
INSERT INTO temp_table (col1, col2, col3, col4, col5, col6)
SELECT col1, col2, col3, col4, col5, MAX(col6)
FROM data_table
WHERE col6 <= l_col6
GROUP BY col1, col2, col3, col4, col5;
ELSE
INSERT INTO temp_table (col1, col2, col3, col4, col5, col6)
SELECT col1, col2, col3, col4, col5, MAX(col6)
FROM data_table
WHERE col1 = l_col1
AND col6 <= l_col6
GROUP BY col1, col2, col3, col4, col5;
END IF;
END;
查询计划(针对带有修复代码的单个查询,不声明WHERE ('11111' = ' ' OR col1 = '11111')):
OR 语句:
IF 语句:
ELSE 语句:
【问题讨论】:
-
如果 l_col1='11111' 为什么首先要检查 ' '?
-
@Rene Sr 我无法为
WHERE (l_col1 = ' ' OR col1 = l_col1)生成查询计划,因此我必须为此进行硬编码。l_col1是传递给过程的参数。 -
使用空值有区别吗?其中(l_col1 为 null 或 l_col1 = col1)。
-
@Rene
(l_col1 IS NULL OR col1 = l_col1)运行最短时间 = 0.2 秒,通常约为 0.21 秒 -
我们说的是多少条插入记录?