OR 运算符太慢_我应该重写为 IF_ELSE 吗?
Posted
技术标签:
【中文标题】OR 运算符太慢_我应该重写为 IF_ELSE 吗?【英文标题】:OR operator too slow_should I rewrite to IF_ELSE? 【发布时间】: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 秒
我们说的是多少条插入记录?
【参考方案1】:
试试这个代码
SELECT col1, col2, col3, col4, col5, MAX(col6)
FROM data_table
WHERE col1 = decode(l_col1, ' ', col1)
AND col6 <= l_col6
GROUP BY col1, col2, col3, col4, col5;
或union all
声明
【讨论】:
谢谢,你的建议解决了我的第二个问题。以上是关于OR 运算符太慢_我应该重写为 IF_ELSE 吗?的主要内容,如果未能解决你的问题,请参考以下文章