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 吗?的主要内容,如果未能解决你的问题,请参考以下文章

Python 操作Redis

python爬虫入门----- 阿里巴巴供应商爬虫

Python词典设置默认值小技巧

《python学习手册(第4版)》pdf

Django settings.py 的media路径设置

Python中的赋值,浅拷贝和深拷贝的区别