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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Oracle-----同义词索引

發布時間:2023/12/20 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Oracle-----同义词索引 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

上一篇👉:Oracle-----視圖的創建與使用&視圖的更新操作


總目錄👉震驚!史上最菜的Oracle 11g教程(大佬勿進)

文章目錄

  • 1、目標
  • 2、同義詞
    • 2.1 范例1:將scott.emp數據表映射為semp
    • 2.2 范例2:切換回sys用戶,重新創建同義詞
  • 3、索引
    • 3.1 范例1:為scott.emp表在sal字段上創建索引


🚴大家好!我是近視的腳踏實地,這篇文章主要是來學習Oracle的同義詞和索引
?? ??唯有行動 ?才能解除你所有的不安

1、目標

1、了解同義詞的作用即可
2、分析索引的主要作用以及索引的定義和使

2、同義詞

同義詞本質上來講就屬于近義詞的概念。在之前使用這樣的一種查詢。

select sysdate from dual;


此時程序就是查日期時間的,但是在之前說過,dual屬于一張臨時表,那么這張臨時表到底是屬于誰的呢,首先在當前scott用戶執行如下語句

select * from tab where tname='DUAL';


可以看到沒查詢到,說明dual表不是屬于scott用戶的,那么除了scott,我們還有兩個用戶,那么先切換到system用戶再來查詢:point-down::

conn system/system; select * from tab where tname='DUAL';


可以看到也不是system用戶的,那么在切換到sys用戶

conn sys/sys as sysdba; select * from tab where tname='DUAL';


然后終于找到了,那么通過一系列的查詢可以發現,dual數據表本身屬于sys用戶的,那么有的就出現一個疑問了

既然dual屬于sys,那么按照之前拿的概念來講,不同的用戶要進行表的互相訪問,前面需要使用模式名,也就是說如果scott用戶要使用dual,則用過使用的是sys.dual才對。那么比如當前是在sys用戶下的,想要查詢emp表這樣是不對的👇:

select * from emp;


而是應該加上模式名👇:

select * from scott.emp;


而dual操作就屬于同義詞的定義范疇,也就是說dualsys.dual的同義詞。如果要想創建同義詞,則可以使用如下的語法完成👇:
?? ??create [public] synonym 同義詞名稱 for 模式.表名稱

2.1 范例1:將scott.emp數據表映射為semp

范例1 將scott.emp數據表映射為semp

create synonym semp for scott.emp;


同義詞創建完成之后就可以直接利用同義詞進行數據查詢(當前的用戶仍然是sys)

select * from semp;


但是現在的問題是,此同義詞無法被其他用戶所使用,它只能夠被sys所使用。比如現在切換到system用戶中,再來嘗試查詢👇:

conn system/system; select * from semp;

2.2 范例2:切換回sys用戶,重新創建同義詞

范例2 切換回sys用戶,重新創建同義詞

如果要想讓一個同義詞被所有用戶去使用,那么應該創建為公共同義詞。

conn sys/sys as sysdba; drop synonym semp; create public synonym semp for scott.emp;


然后切換回system用戶下驗證一下👇:

conn system/system; select * from semp;


此時雖然同義詞可以被其他用戶訪問了,但是對我們開發的意義不大。

同義詞屬于Oracle自己的概念,所以對于實際的開發上幫助不大,最為重要的就是理解dual的使用即可

3、索引

先拋開索引的概念不看,只看索引能夠做什么事情,以及為什么需要有索引。

現在來觀察如下的一段程序代碼。(切換回scott用戶)

select * from emp where sal > 1500;


這是一條非常簡單的查詢語句。于是下面就通過此語句來分析一下數據庫在這之中做了什么?為了可以讓大家觀察方便,下面打開追蹤器。切換到sys用戶

conn sys/sys as sysdba; set autotrace on;


打開之后接著直接在sys用戶中進行性能信息的查詢,此時的查詢除了會返回結果之外,還會返回給用戶一些分析的信息👇:

select * from scott.emp;


可以看到執行計劃里邊有個TABLE ACCESS FULL,此時直接描述的是要進行全表掃描,就屬于逐行掃描。而且最為關鍵的問題在于,如果說現在emp表的數據有50W條。可能在第20920條之后就沒有任何雇員記錄可以滿足于此條件(sal>1500),那么這個時候以上的語句會繼續向后查,這就是一種浪費。因為么是默認逐行掃描,都會掃描完,性能就很差。

那么已經知道了問題,那么該如何解決這樣的查詢呢?那么現在第一個想法九是需要知道明確的數據的排序。如果直接使用Order by是排序,但是Order by是整個查詢語句之中最后執行的,也就說此時還沒到Order by 中。所以在這種情況下,數據的最好的排列是根據樹(二叉樹)排列。

樹的排列原則是:選取一個數據作為根節點,比次節點大的數據放在右子樹,比節點小的數據放在左子樹。這樣就可以實現排序。但是現在的問題是,選什么數據?本程序使用的是sal字段,所以就應該利用sal來操作索引。

select sal from scott.emp;



所以這個時候就可以來進行索引的創建以及實現以上的操作結構。在整個的操作過程之中,如果要想創建索引,那么必須要設置一個指定的字段。(當前還是在sys用戶)

3.1 范例1:為scott.emp表在sal字段上創建索引

范例1 為scott.emp表在sal字段上創建索引

create index emp_sal_ind on scott.emp(sal);


一旦索引創建完成之后,保證你的跟蹤器是打開的(set autotrace on;),就可以直接觀察此時的查詢與之前的有什么不同,那么下面重新發出一次查詢的指令(仍然在sys用戶下查詢)👇:

select * from scott.emp where sal > 1500;


通過此時的查詢分析器可以發現,此時的查詢不再使用全表掃描。用的是👉:TABLE ACCESS BY INDEX ROWID、INDEX RANGE SCAN

此時進行查詢的時候不是全部數據都進行查詢了,而是查詢了所需要的范圍的內容。

雖然利用索引可以進行查詢的提升,但是需要明確一個問題所在,索引提升查詢的關鍵在于👉:那顆索引樹。那么說現在你的數據表之中,sal字段的內容都在重復改變的時候,那么這顆樹將"殺死你"。

樹的維護操作是需要花費時間的,如果數據小,那么可以在很短的時間內進行樹的生成,但是如果數據量一大呢?時間會花費巨大。(所以如果說現在不想重復地進行樹的維護,那么就必須保證數據的不可更改與唯一性,所以默認情況下會在主鍵約束上自動追加一個索引)。

在現實開發之中又會出現一個問題:

?? ??● 保證用戶的回應速度快,沒有延遲;
?? ??● 能夠承受用戶大量的更新操作。

如果要想查詢速度快,那么必須使用索引;

如果要想保證更新速度,那么又不能使用索引。

所以這個時候最好的做法就是犧牲實時性。等于有兩個數據庫,一個數據庫專門給用戶負責查詢使用,另外一個數據專門給用戶更新操作使用。對于查詢的數據庫,可以在每天凌晨2-3點進行信息的統一保存或者是統一的分析后保存。


下一篇👉Oracle-----用戶管理

本篇博客到這就完啦,非常感謝您的閱讀🙏,如果對您有幫助,可以幫忙點個贊或者來波關注鼓勵一下喔😬 ,嘿嘿👀

總結

以上是生活随笔為你收集整理的Oracle-----同义词索引的全部內容,希望文章能夠幫你解決所遇到的問題。

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