2012-11-05 31 views
0

我的SQL查詢中含有大量的LTRIM(),RTRIM(),子()等轉換函數......他們顯著影響了查詢性能?請回答我以下查詢:如何最小化SQL查詢中轉換函數的使用?

  • 如何最大限度地減少使用轉換函數在我的查詢?
  • 什麼是可能的替代方案,而不是可用於查詢的轉換函數?
  • 這些替代方案是否會顯着改善我的查詢性能?

...請指導我

+0

你知道這些功能爲什麼會影響性能嗎?花在執行這些功能上的時間,還是它們對執行計劃的負面影響?通常,花費在操作字符串上的CPU時間與讀取和寫入數據所花費的IO時間無關。 –

+0

您可以處理這些轉換函數,如ltrim,Rtrim,可以在獲取輸入的同時在前端處理Substring。 –

+0

@ jon earles: - 這些函數耗費時間執行 – user1466466

回答

0

您可以處理類似LTRIM,RTRIM這些轉換功能,子串可以在前端,而讓輸入處理。這些類型的字符串函數也可用於前端。例如:修剪(),子串()

+0

修改前端或數據庫超出範圍,因爲它由外部實體處理...我的應用程序從數據庫中提取數據,處理它並給出輸出。所以請建議可以使用什麼來代替轉換功能。 – user1466466

+0

可以請你分享你想優化的sql代碼 –

+0

select LABEL,ltrim(rtrim(substr(emp_record,9,16)))as to_char(emp_date,'MM/DD/YYYY HH24:MI:SS'))as VALUE; (rtrim(substr(emp_info,1,9)))='TM 0'且a.emp_no = b.emp_no和emp_source = 2且emp_date> ADD_MONTHS(SYSDATE, -6); order by emp_date; – user1466466

1

你怎麼知道這些函數是consuning執行時間?你有沒有這些功能運行它,並注意到它更快?

where子句中的所有列都被索引了嗎?

如果你看看查詢計劃,你可以看到表掃描?

此表中有多少行?

您可以在表中創建一個新列,其中包含emp_info列中已清理的數據。即

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

然後觸發添加到您的表,以確保其始終保持最新

然後添加索引的列。

然後改變你的選擇要使用的新列

您可能會看到一些性能改進。根據你提供的信息來說是不可能的。

+0

是的,我嘗試執行我的SQL查詢而不使用轉換函數,並且執行時間有顯着差異。 where子句中的列沒有編入索引。該表中有超過200萬行。你所建議的需要改變數據庫結構。我的理解是否正確? – user1466466

0

您可以通過trim(

例更換ltrim(rtrim(節省點時間量:

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'; 

但是,這是一個非常小的時間,以節省處理一個百萬行。

系統處理200萬行需要多長時間?你的數據有什麼不尋常的嗎?例如,您是使用大型CLOB而不是小型VARCHAR2?你確定問題不是由創建一個不同的解釋計劃的謂詞引起的?例如,Oracle可能會認爲這些函數返回的行數比實際少得多,因此使用嵌套循環 而不是散列連接。