ホームページ データベース mysql チュートリアル 深入理解Oracle索引(18):函数索引的陷阱以及如何避免索引被污染

深入理解Oracle索引(18):函数索引的陷阱以及如何避免索引被污染

Jun 07, 2016 pm 03:46 PM
oracle 関数 どうやって 深く行く 理解する 索引 避ける トラップ

㈠ 函数索引的陷阱 使用函数索引一定要注意在函数代码变更后重建函数索引、否则、Oracle将返回错误结果但不给提示 测试如下: [plain] view plaincopyprint? SPANstyle=BACKGROUND-COLOR:rgb(102,102,102)hr@ORCLdroptabletpurge; Tabledropped. hr@ORCLcrea

     ㈠ 函数索引的陷阱
     
        使用函数索引一定要注意在函数代码变更后重建函数索引、否则、Oracle将返回错误结果但不给提示
     

        测试如下:

[plain] view plaincopyprint?

  1. hr@ORCL> drop table t purge;  
  2.   
  3. Table dropped.  
  4.   
  5. hr@ORCL> create table t (x number,y varchar2(30));  
  6.   
  7. Table created.  
  8.   
  9. hr@ORCL> insert into t select rownum,rownum||'a' from dual connect by rownum
  10.   
  11. 999 rows created.  
  12.   
  13. hr@ORCL> ed  
  14. Wrote file afiedt.buf  
  15.   
  16.   1  create or replace function f_david(p_value varchar2) return varchar2  
  17.   2  deterministic is  
  18.   3  begin  
  19.   4  return p_value;  
  20.   5* end;  
  21.   6    
  22.   7  /  
  23.   
  24. Function created.  
  25.   
  26. hr@ORCL> create index idx_f_david_t on t (f_david(y));  
  27.   
  28. Index created.  
  29.   
  30. hr@ORCL> exec dbms_stats.gather_table_stats(ownname=>'HR',tabname=>'T',estimate_percent=>100,cascade=>TRUE,no_invalidate=>false);  
  31.   
  32. PL/SQL procedure successfully completed.  
  33.   
  34. hr@ORCL> select * from t where f_david(y)='8a';  
  35.   
  36.          X Y  
  37. ---------- ------------------------------  
  38.          8 8a  
  39.   
  40. hr@ORCL> ed         //ed是什么splplus命令?
  41. Wrote file afiedt.buf  
  42.   
  43.   1  create or replace function f_david(p_value varchar2) return varchar2  
  44.   2  deterministic is  
  45.   3  begin  
  46.   4  return p_value||'b';  
  47.   5* end;  
  48. hr@ORCL> /  
  49.   
  50. Function created.  
  51.   
  52. /* 此时的函数 f_david 已经不是我们所认识的那个了、但是查询依然如故!!!*/  
  53. hr@ORCL> select * from t where f_david(y)='8a';  
  54.   
  55.          X Y  
  56. ---------- ------------------------------  
  57.          8 8a  
  58.   
  59.   
  60. /* 索引重建查询没有记录、这才是我们要的正确结果*/  
  61. hr@ORCL> drop index idx_f_david_t;  
  62.   
  63. Index dropped.  
  64.   
  65. hr@ORCL> create index idx_f_david_t on t (f_david(y));  
  66.   
  67. Index created.  
  68.   
  69. hr@ORCL> exec dbms_stats.gather_table_stats(ownname=>'HR',tabname=>'T',estimate_percent=>100,cascade=>TRUE,no_invalidate=>false);  
  70.   
  71. PL/SQL procedure successfully completed.  
  72.   
  73. hr@ORCL> select * from t where f_david(y)='8a';  
  74.   
  75. no rows selected  
<span>hr@ORCL> drop table t purge;

Table dropped.

hr@ORCL> create table t (x number,y varchar2(30));

Table created.

hr@ORCL> insert into t select rownum,rownum||'a' from dual connect by rownum ed
Wrote file afiedt.buf

  1  create or replace function f_david(p_value varchar2) return varchar2
  2  deterministic is
  3  begin
  4  return p_value;
  5* end;
  6  
  7  /

Function created.

hr@ORCL> create index idx_f_david_t on t (f_david(y));

Index created.

hr@ORCL> <span><span><strong>exec dbms_stats.gather_table_stats(ownname=>'HR',tabname=>'T',estimate_percent=>100,cascade=>TRUE,no_invalidate=>false);  //这句话什么意思?</strong>
</span>
</span>PL/SQL procedure successfully completed.

hr@ORCL> select * from t where f_david(y)='8a';

         X Y
---------- ------------------------------
         8 8a

hr@ORCL> ed
Wrote file afiedt.buf

  1  create or replace function f_david(p_value varchar2) return varchar2
  2  deterministic is
  3  begin
  4  return p_value||'b';
  5* end;
hr@ORCL> /

Function created.

/* 此时的函数 f_david 已经不是我们所认识的那个了、但是查询依然如故!!!*/
hr@ORCL> select * from t where f_david(y)='8a';

         X Y
---------- ------------------------------
         8 8a


/* 索引重建查询没有记录、这才是我们要的正确结果*/
hr@ORCL> drop index idx_f_david_t;

Index dropped.

hr@ORCL> create index idx_f_david_t on t (f_david(y));

Index created.

hr@ORCL> exec dbms_stats.gather_table_stats(ownname=>'HR',tabname=>'T',estimate_percent=>100,cascade=>TRUE,no_invalidate=>false);

PL/SQL procedure successfully completed.

hr@ORCL> select * from t where f_david(y)='8a';

no rows selected</span>
ログイン後にコピー


     ㈡ 避免索引被污染
     
        这里给出 2 条意见、
       
        ① 不要在字段前增加函数
          
           如:
           to_char(start_time,'yyyy.mm.dd') between '2013.06.06' and '2013.06.10'
           和
           start_time between to_date('2013.06.06','yyyy.mm.dd') and to_date('2013.06.10','yyyy.mm.dd')
          
           任何时候都应该是第二种!!!
          
        ② 不要把字段嵌入到表达式中
          
           如:
           start_time + 7            和
           start_time
     
     
                                                                 By David Lin 
                                                                 2013-06-06 
                                                                 Good Luck 

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Oracleの表空間サイズを確認する方法 Oracleの表空間サイズを確認する方法 Apr 11, 2025 pm 08:15 PM

Oracle Tablespaceサイズを照会するには、次の手順に従ってください。クエリを実行して、TableSpace名を決定します。DBA_TABLESPACesからTableSpace_Nameを選択します。クエリを実行してテーブルスペースのサイズをクエリします:sum(bytes)をtotal_size、sum(bytes_free)asavail_space、sum(bytes) - sum(bytes_free)as sum(bytes_free)as dba_data_files from tablespace_

Oracleビューを暗号化する方法 Oracleビューを暗号化する方法 Apr 11, 2025 pm 08:30 PM

Oracle View暗号化により、ビュー内のデータを暗号化でき、それにより機密情報のセキュリティが強化されます。手順には以下が含まれます。1)マスター暗号化キー(MEK)の作成。 2)暗号化されたビューを作成し、暗号化されるビューとMEKを指定します。 3)暗号化されたビューにアクセスすることをユーザーに許可します。暗号化されたビューがどのように機能するか:ユーザーが暗号化されたビューを求めてクエリをするとき、OracleはMEKを使用してデータを復号化し、認定ユーザーのみが読み取り可能なデータにアクセスできるようにします。

Oracleでテーブルを作成する方法 Oracleでテーブルを作成する方法 Apr 11, 2025 pm 08:00 PM

Oracleテーブルの作成には、次の手順が含まれます。作成テーブルの構文を使用して、テーブル名、列名、データ型、制約、およびデフォルト値を指定します。テーブル名は簡潔で説明的である必要があり、30文字を超えてはなりません。列名は説明的でなければならず、データ型は列に保存されているデータ型を指定します。 NOT NULL制約により、列でnull値が許可されていないことが保証され、デフォルト句は列のデフォルト値を指定します。テーブルの一意の記録を識別する主要なキーの制約。外部キーの制約は、表の列が別のテーブルの主キーを指していることを指定します。主要なキー、一意の制約、デフォルト値を含むサンプルテーブル学生の作成を参照してください。

Oracleデータベースをインポートする方法 Oracleデータベースをインポートする方法 Apr 11, 2025 pm 08:06 PM

データインポート方法:1。SQLLOADERユーティリティを使用します。データファイルを準備し、制御ファイルを作成し、SQLLoaderを実行します。 2。IMP/EXPツールを使用します。データをエクスポートし、データをインポートします。ヒント:1。ビッグデータセットに推奨されるSQL*ローダー。 2。ターゲットテーブルが存在する必要があり、列定義が一致します。 3。インポート後、データの整合性を検証する必要があります。

Oracleのインストールをアンインストールする方法は失敗しました Oracleのインストールをアンインストールする方法は失敗しました Apr 11, 2025 pm 08:24 PM

Oracleインストール障害のためのアンインストールメソッド:Oracleサービスを閉じ、Oracleプログラムファイルとレジストリキーを削除し、Oracle環境変数をアンインストールし、コンピューターを再起動します。アンインストールが失敗した場合、Oracle Universal Uninstallツールを使用して手動でアンインストールできます。

Oracleのインスタンス名を表示する方法 Oracleのインスタンス名を表示する方法 Apr 11, 2025 pm 08:18 PM

Oracleでインスタンス名を表示するには3つの方法があります。「sqlplus」と「v $ instanceからselect instance_name;」を使用します。」コマンドラインのコマンド。 「show instance_name;」を使用しますSQL*Plusのコマンド。オペレーティングシステムのタスクマネージャー、Oracle Enterprise Manager、またはオペレーティングシステムを介して、環境変数(LinuxのOracle_Sid)を確認してください。

オラクルで時間を取得する方法 オラクルで時間を取得する方法 Apr 11, 2025 pm 08:09 PM

Oracleで時間を取得するには、次の方法があります。Current_Timestamp:現在のシステム時間を秒に正確に返します。 systimestamp:current_timestampよりも正確で、ナノ秒。 sysdate:時間部分を除く現在のシステム日付を返します。 to_char(sysdate、 'yyy-mm-dd hh24:mi:ss'):現在のシステムの日付と時刻を特定の形式に変換します。抽出:1年、月、時間など、時間の値から特定の部分を抽出します。

Oracle AWRレポートを読む方法 Oracle AWRレポートを読む方法 Apr 11, 2025 pm 09:45 PM

AWRレポートは、データベースのパフォーマンスとアクティビティスナップショットを表示するレポートです。解釈の手順には、アクティビティスナップショットの日付と時刻の識別が含まれます。アクティビティとリソース消費の概要をご覧ください。セッションのアクティビティを分析して、セッションの種類、リソース消費、待機イベントを見つけます。遅いSQLステートメント、リソース競合、I/Oの問題などの潜在的なパフォーマンスボトルネックを見つけます。待機イベントを表示し、パフォーマンスのためにそれらを特定して解決します。ラッチとメモリの使用パターンを分析して、パフォーマンスの問題を引き起こしているメモリの問題を特定します。

See all articles