如何最小化SQL查询中转换函数的使用?

时间:2012-11-05 06:55:56

标签: sql oracle10g

我的SQL查询包含许多ltrim(),rtrim(),substring()等转换函数......它们会严重影响查询性能...请回答我的以下查询:

  • 如何最大限度地减少查询中转换函数的使用?
  • 有哪些替代方案可以替代可用于查询的转换函数?
  • 替代方案会显着提高我的查询效果吗?

...请指导我

3 个答案:

答案 0 :(得分:1)

您如何知道这些功能在执行时是否有所帮助?你没有这些功能就运行它并发现它更快吗?

where子句中的所有列都已编入索引吗?

如果您查看查询计划,您能看到表扫描吗?

此表中有多少行?

您可以在表中创建一个新列,其中包含emp_info列中的已清理数据。即

UPDATE YourTable SET NewColumn = ltrim(rtrim(substr(emp_info, 1, 9)))

然后在表格中添加一个触发器以确保它始终是最新的

然后为列添加索引。

然后更改您的选择以使用新列

您可能会看到一些性能提升。根据您提供的信息,我们无法说出来。

答案 1 :(得分:0)

你可以处理像ltrim,Rtrim这样的转换函数,在获取输入的同时可以在前端处理子串。这些类型的字符串功能也可以在前端使用。例如:Trim(),Substring()

答案 2 :(得分:0)

ltrim(rtrim(替换为trim(

可以节省一些时间

示例:

create table test1(a varchar2(4000));

--Create 1 million rows
--This is hopefully a "large" amount of rows, but small enough to fit
--in memory.  This way we can test the CPU time to process the rows
--instead of the IO time to read the data.
begin
    for i in 1 .. 10 loop
        insert into test1 select '          '||level||'          '
        from dual connect by level <= 100000;
    end loop;
    commit;
end;
/

--Note: You'll want to run the statements several times first to
--"warm up" the database, and get everything in memory.

--0.33 seconds
select count(*)
from test1
where ltrim(rtrim(a)) = '5';

--0.20 seconds
select count(*)
from test1
where trim(a) = '5';

但这可以节省很多时间来处理100万行。

您的系统需要多长时间才能处理200万行?您的数据有什么不寻常之处吗?例如,您使用大型CLOB而不是小型VARCHAR2吗?您确定问题不是由谓词创建不同的解释计划引起的吗?例如,Oracle可能认为函数返回的行数比它们实际上少得多,因此使用嵌套循环 而不是散列连接。