我的SQL查询包含许多ltrim(),rtrim(),substring()等转换函数......它们会严重影响查询性能...请回答我的以下查询:
...请指导我
答案 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可能认为函数返回的行数比它们实际上少得多,因此使用嵌套循环 而不是散列连接。