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用戶執行如下語句
可以看到沒查詢到,說明dual表不是屬于scott用戶的,那么除了scott,我們還有兩個用戶,那么先切換到system用戶再來查詢:point-down::
可以看到也不是system用戶的,那么在切換到sys用戶
然后終于找到了,那么通過一系列的查詢可以發現,dual數據表本身屬于sys用戶的,那么有的就出現一個疑問了
既然dual屬于sys,那么按照之前拿的概念來講,不同的用戶要進行表的互相訪問,前面需要使用模式名,也就是說如果scott用戶要使用dual,則用過使用的是sys.dual才對。那么比如當前是在sys用戶下的,想要查詢emp表這樣是不對的👇:
select * from emp;
而是應該加上模式名👇:
而dual操作就屬于同義詞的定義范疇,也就是說dual是sys.dual的同義詞。如果要想創建同義詞,則可以使用如下的語法完成👇:
?? ??create [public] synonym 同義詞名稱 for 模式.表名稱
2.1 范例1:將scott.emp數據表映射為semp
范例1 將scott.emp數據表映射為semp
create synonym semp for scott.emp;
同義詞創建完成之后就可以直接利用同義詞進行數據查詢(當前的用戶仍然是sys)
但是現在的問題是,此同義詞無法被其他用戶所使用,它只能夠被sys所使用。比如現在切換到system用戶中,再來嘗試查詢👇:
2.2 范例2:切換回sys用戶,重新創建同義詞
范例2 切換回sys用戶,重新創建同義詞
如果要想讓一個同義詞被所有用戶去使用,那么應該創建為公共同義詞。
conn sys/sys as sysdba; drop synonym semp; create public synonym semp for scott.emp;
然后切換回system用戶下驗證一下👇:
此時雖然同義詞可以被其他用戶訪問了,但是對我們開發的意義不大。
同義詞屬于Oracle自己的概念,所以對于實際的開發上幫助不大,最為重要的就是理解dual的使用即可
3、索引
先拋開索引的概念不看,只看索引能夠做什么事情,以及為什么需要有索引。
現在來觀察如下的一段程序代碼。(切換回scott用戶)
select * from emp where sal > 1500;
這是一條非常簡單的查詢語句。于是下面就通過此語句來分析一下數據庫在這之中做了什么?為了可以讓大家觀察方便,下面打開追蹤器。切換到sys用戶
打開之后接著直接在sys用戶中進行性能信息的查詢,此時的查詢除了會返回結果之外,還會返回給用戶一些分析的信息👇:
可以看到執行計劃里邊有個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用戶下查詢)👇:
通過此時的查詢分析器可以發現,此時的查詢不再使用全表掃描。用的是👉:TABLE ACCESS BY INDEX ROWID、INDEX RANGE SCAN
此時進行查詢的時候不是全部數據都進行查詢了,而是查詢了所需要的范圍的內容。
雖然利用索引可以進行查詢的提升,但是需要明確一個問題所在,索引提升查詢的關鍵在于👉:那顆索引樹。那么說現在你的數據表之中,sal字段的內容都在重復改變的時候,那么這顆樹將"殺死你"。
樹的維護操作是需要花費時間的,如果數據小,那么可以在很短的時間內進行樹的生成,但是如果數據量一大呢?時間會花費巨大。(所以如果說現在不想重復地進行樹的維護,那么就必須保證數據的不可更改與唯一性,所以默認情況下會在主鍵約束上自動追加一個索引)。
在現實開發之中又會出現一個問題:
?? ??● 保證用戶的回應速度快,沒有延遲;
?? ??● 能夠承受用戶大量的更新操作。
如果要想查詢速度快,那么必須使用索引;
如果要想保證更新速度,那么又不能使用索引。
所以這個時候最好的做法就是犧牲實時性。等于有兩個數據庫,一個數據庫專門給用戶負責查詢使用,另外一個數據專門給用戶更新操作使用。對于查詢的數據庫,可以在每天凌晨2-3點進行信息的統一保存或者是統一的分析后保存。
下一篇👉Oracle-----用戶管理
本篇博客到這就完啦,非常感謝您的閱讀🙏,如果對您有幫助,可以幫忙點個贊或者來波關注鼓勵一下喔😬 ,嘿嘿👀
總結
以上是生活随笔為你收集整理的Oracle-----同义词索引的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 目睹太多读博惨案之后,清华姚班助理教授写
- 下一篇: JAVA 接口 验证哥特巴赫猜想