我的SQL查詢中含有大量的LTRIM(),RTRIM(),子()等轉換函數......他們顯著影響了查詢性能?請回答我以下查詢:如何最小化SQL查詢中轉換函數的使用?
- 如何最大限度地減少使用轉換函數在我的查詢?
- 什麼是可能的替代方案,而不是可用於查詢的轉換函數?
- 這些替代方案是否會顯着改善我的查詢性能?
...請指導我
我的SQL查詢中含有大量的LTRIM(),RTRIM(),子()等轉換函數......他們顯著影響了查詢性能?請回答我以下查詢:如何最小化SQL查詢中轉換函數的使用?
...請指導我
您可以處理類似LTRIM,RTRIM這些轉換功能,子串可以在前端,而讓輸入處理。這些類型的字符串函數也可用於前端。例如:修剪(),子串()
修改前端或數據庫超出範圍,因爲它由外部實體處理...我的應用程序從數據庫中提取數據,處理它並給出輸出。所以請建議可以使用什麼來代替轉換功能。 – user1466466
可以請你分享你想優化的sql代碼 –
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
你怎麼知道這些函數是consuning執行時間?你有沒有這些功能運行它,並注意到它更快?
where子句中的所有列都被索引了嗎?
如果你看看查詢計劃,你可以看到表掃描?
此表中有多少行?
您可以在表中創建一個新列,其中包含emp_info列中已清理的數據。即
UPDATE YourTable SET NewColumn = ltrim(rtrim(substr(emp_info, 1, 9)))
然後觸發添加到您的表,以確保其始終保持最新
然後添加索引的列。
然後改變你的選擇要使用的新列
您可能會看到一些性能改進。根據你提供的信息來說是不可能的。
是的,我嘗試執行我的SQL查詢而不使用轉換函數,並且執行時間有顯着差異。 where子句中的列沒有編入索引。該表中有超過200萬行。你所建議的需要改變數據庫結構。我的理解是否正確? – user1466466
您可以通過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可能會認爲這些函數返回的行數比實際少得多,因此使用嵌套循環 而不是散列連接。
你知道這些功能爲什麼會影響性能嗎?花在執行這些功能上的時間,還是它們對執行計劃的負面影響?通常,花費在操作字符串上的CPU時間與讀取和寫入數據所花費的IO時間無關。 –
您可以處理這些轉換函數,如ltrim,Rtrim,可以在獲取輸入的同時在前端處理Substring。 –
@ jon earles: - 這些函數耗費時間執行 – user1466466