日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle选择外键列,Oracle外键列上是否需要索引?

發布時間:2023/12/10 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle选择外键列,Oracle外键列上是否需要索引? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

外鍵列上缺少索引會帶來兩個問題,限制并發性、影響性能。而這兩個問題中的任意一個都可能會造成嚴重性能問題。 無論是Or

外鍵列上缺少索引會帶來兩個問題,限制并發性、影響性能。而這兩個問題中的任意一個都可能會造成嚴重性能問題。

無論是Oracle的官方文檔,還是在Tom的書中都說明了兩種情況下可以忽略外鍵上的索引。其實我認為不需要那么麻煩,與增加一個索引所帶來的性能開銷和磁盤空間開銷相比,,確實索引可能引發的問題要嚴重得多。因此,我會選擇在所有的外鍵列上添加索引,雖然可能導致創建了部分多余的索引,但是這樣相除了外鍵約束由于確實索引所帶來的性能問題和并發性問題。

如果外鍵列上缺少索引,從主表關聯子表的查詢就只能對子表選擇全表掃描的查詢,這是顯而易見的問題:

SQL> CREATE TABLE T_P (ID NUMBER, NAME VARCHAR2(30));

表已創建。

SQL> ALTER TABLE T_P ADD PRIMARY KEY (ID);

表已更改。

SQL> CREATE TABLE T_C (ID NUMBER, FID NUMBER, NAME VARCHAR2(30));

表已創建。

SQL> ALTER TABLE T_C ADD CONSTRAINT FK_T_C

2 FOREIGN KEY (FID)

3 REFERENCES T_P (ID);

表已更改。

SQL> INSERT INTO T_P SELECT ROWNUM, TABLE_NAME FROM ALL_TABLES;

已創建884行。

SQL> INSERT INTO T_C SELECT ROWNUM, MOD(ROWNUM, 884) + 1, OBJECT_NAME

2 FROM ALL_OBJECTS;

已創建30339行。

SQL> COMMIT;

提交完成。

SQL> SELECT A.ID, A.NAME, B.NAME

2 FROM T_P A, T_C B

3 WHERE A.ID = B.FID

4 AND A.ID = 880;

ID NAME NAME

---------- ------------------------------ ------------------------------

880 T_COMPRESS /eb2b6b5_Options1

880 T_COMPRESS DATE

880 T_COMPRESS DEF$_SCHEDULE

880 T_COMPRESS GV_$SESSION_EVENT

.

.

.

880 T_COMPRESS sun/io/ByteToCharCp1251

880 T_COMPRESS /5ba3839f_DirStateFactoryResul

880 T_COMPRESS USER_INDEXTYPES

已選擇34行。

執行計劃

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE

1 0 MERGE JOIN

2 1 TABLE ACCESS (BY INDEX ROWID) OF 'T_P'

3 2 INDEX (UNIQUE SCAN) OF 'SYS_C002964' (UNIQUE)

4 1 FILTER

5 4 TABLE ACCESS (FULL) OF 'T_C'

統計信息

----------------------------------------------------------

0 recursive calls

0 db block gets

190 consistent gets

0 physical reads

0 redo size

1829 bytes sent via SQL*Net to client

394 bytes received via SQL*Net from client

4 SQL*Net roundtrips to/from client

0 sorts (memory)

0 sorts (disk)

34 rows processed

由于缺少索引,上面的這個關聯查詢只能采用MERGE JOIN,而如果聯立了外鍵列上的索引:

SQL> CREATE INDEX IND_T_C_FID ON T_C (FID);

索引已創建。

SQL> SELECT A.ID, A.NAME, B.NAME

2 FROM T_P A, T_C B

3 WHERE A.ID = B.FID

4 AND A.ID = 880;

ID NAME NAME

---------- ------------------------------ ------------------------------

880 T_COMPRESS /e1538703_EntryInfoImpl

880 T_COMPRESS /7b832daf_ObjectStreamClassCom

880 T_COMPRESS java/awt/peer/ScrollbarPeer

880 T_COMPRESS /1982bd95_PermissionsEnumerato

.

.

.

880 T_COMPRESS /9ebda46b_GetInterface

880 T_COMPRESS /c71f85e7_DefaultPopupFactory

880 T_COMPRESS /7b549d81_DataFormatException

已選擇34行。

執行計劃

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE

1 0 NESTED LOOPS

2 1 TABLE ACCESS (BY INDEX ROWID) OF 'T_P'

3 2 INDEX (UNIQUE SCAN) OF 'SYS_C002964' (UNIQUE)

4 1 TABLE ACCESS (BY INDEX ROWID) OF 'T_C'

5 4 INDEX (RANGE SCAN) OF 'IND_T_C_FID' (NON-UNIQUE)

統計信息

----------------------------------------------------------

0 recursive calls

0 db block gets

42 consistent gets

1 physical reads

0 redo size

1829 bytes sent via SQL*Net to client

394 bytes received via SQL*Net from client

4 SQL*Net roundtrips to/from client

0 sorts (memory)

0 sorts (disk)

34 rows processed

本文原創發布php中文網,轉載請注明出處,感謝您的尊重!

總結

以上是生活随笔為你收集整理的oracle选择外键列,Oracle外键列上是否需要索引?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。