国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

使用"hint"設置視圖內的SQL查詢方式

2024-07-21 02:41:59
字體:
來源:轉載
供稿:網友
本文主要介紹了Oracle數據庫如何在有視圖的SQL中使用hint(提示)來設置視圖內的SQL查詢方式。

在實際的工作中,很多人經常會用到視圖訪問,且視圖一般都是已經寫好了,但在許多情況下,并不太適宜在視圖內直接加hint。

環境如下:

--創建一個表T1,有兩個字段C1、C2create table T1(  C1 VARCHAR2(30) not null,  C2 NUMBER);--在C2上建有BTree索引(IDX$T1$C2)create index IDX$T1$C2 on T1 (C2);--創建一個表T2,有兩個字段C1、C2create table T2(  C1 VARCHAR2(30) not null,  C2 NUMBER);--建有一個視圖V1create or replace view v1 asselect * from t1union allselect * from t2;--現有一條語句如下:select  *  from V1  where V1.c2>'171'--執行計劃如下所示:PLAN_TABLE_OUTPUT---------------------------------------------------------------------------------------------------------------------------------------| Id  | Operation            |  Name       | Rows  | Bytes | Cost  |--------------------------------------------------------------------|   0 | SELECT STATEMENT     |             | 59428 |  1741K|    21 ||   1 |  VIEW                | V1          | 59428 |  1741K|    21 ||   2 |   UNION-ALL          |             |       |       |       ||*  3 |    TABLE access FULL | T1          | 59424 |   754K|    19 ||*  4 |    TABLE ACCESS FULL | T2          |     4 |   120 |     2 |--------------------------------------------------------------------

根據優化建議,要求T1表使用C2列上的索引IDX$T1$C2會性能更好。

當然,對表和字段進行比較細的統計分析后,可能可以達到效果,但是本次介紹是的使用hint。

經過測試以下的兩種SQL都不能達到預期效果:

select /*+ index(V1,IDX$T1$C2)*/ *  from V1  where V1.c2>'171';select /*+ index(T1,IDX$T1$C2)*/ *  from V1  where V1.c2>'171';正確的寫法如下select /*+ index(V1.T1,IDX$T1$C2)*/ *  from V1  where V1.c2>'171'最后的執行計劃如下:PLAN_TABLE_OUTPUT-------------------------------------------------------------------------------------------------------------------------------------------------------------| Id  | Operation                     |  Name       | Rows  | Bytes | Cost  |-----------------------------------------------------------------------------|   0 | SELECT STATEMENT              |             | 59428 |  1741K|   738 ||   1 |  VIEW                         | V1          | 59428 |  1741K|   738 ||   2 |   UNION-ALL                   |             |       |       |       ||   3 |    TABLE ACCESS BY INDEX ROWID| T1          | 59424 |   754K|   736 ||*  4 |     INDEX RANGE SCAN          | IDX$T1$C2   | 59424 |       |    24 ||*  5 |    TABLE ACCESS FULL          | T2          |     4 |   120 |     2 |-----------------------------------------------------------------------------

其實子查詢中的hint與視圖的一樣,如下例:

select /*+ index(a.T1,IDX$T1$C2)*/*from (select * from T1union all        select * from T2) a where c2 > '171'

經過測試和整理,hint在引用對象時是可以嵌套引用的,如例子中的V1.T1表示V1對象中的T1對象。

注釋:

如果對象有別名,則只能使用別名,如果對象里有相同的別名則只能對第一個對象使用hint。

select /*+ index(a.b,IDX$T1$C2)*/ *from (select * from T2 bunion allselect * from T1 b) a where c2 > '171'

大家可以發現上面的SQL里的hint就沒有效果,這里的a.b其實是指T2表,另外hint在引用對象時是不能加模式名的,加了反而會使hint無效。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 江都市| 郎溪县| 济阳县| 哈巴河县| 裕民县| 长海县| 宝山区| 苍山县| 汉寿县| 青川县| 镇安县| 合川市| 临汾市| 眉山市| 龙陵县| 宝清县| 定襄县| 视频| 西乡县| 三穗县| 凌源市| 桂平市| 资溪县| 共和县| 鄂托克前旗| 合作市| 灵宝市| 平舆县| 嵊州市| 道真| 滦南县| 永清县| 东城区| 涟水县| 香河县| 昭觉县| 佳木斯市| 延长县| 昌宁县| 名山县| 阿图什市|