0

My SQL Queries contain lots of ltrim() , rtrim() , substring() etc conversion functions...They are significantly impacting query performance... Please answer my following queries :

  • How to minimize usage of conversion functions in my queries?
  • What are the possible alternatives instead of conversion functions that could be used in queries ?
  • will the alternatives significantly improve my query performance ?

...please guide me

4

3 に答える 3

1

これらの関数が実行に時間を費やしていることをどのように知っていますか? これらの関数を使わずに実行して、それがより速いことに気付きましたか?

where 句のすべての列にインデックスが付けられていますか?

クエリ プランを見ると、テーブル スキャンを確認できますか?

このテーブルには何行ありますか?

emp_info 列からクリーンアップされたデータを含む新しい列をテーブルに作成できます。すなわち

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

次に、トリガーをテーブルに追加して、常に最新の状態に保つようにします

次に、列にインデックスを追加します。

次に、新しい列を使用するように選択を変更します

パフォーマンスの向上が見られる場合があります。あなたが提供した情報に基づいて言うことは不可能です。

于 2012-11-05T10:54:00.260 に答える
0

ltrim、Rtrim、Substring などのこれらの変換関数を処理して、入力を取得しながらフロントエンドで処理できます。これらのタイプの文字列関数は、フロント エンドでも使用できます。例: Trim(),Substring()

于 2012-11-05T07:19:08.480 に答える
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 万行を処理するのにどのくらいの時間がかかりますか? データに異常はありますか? たとえば、小さな VARCHAR2 の代わりに大きな CLOB を使用していますか? 問題の原因が、別の説明計画を作成する述部ではないことを確認してください。たとえば、Oracle は、関数が実際よりもはるかに少ない数の行を返すと考えているため、ハッシュ結合の代わりにネストされたループを使用しています。

于 2012-11-05T20:07:15.053 に答える