oracle數據字典、索引、序列


*************************數據字典*******************************

普通的表 是用來存放 應用程序 需要的數據的

student表 是存放學生信息的

category 表 是存放 商品種類信息的


oracle 也是一個應用程序, oracle這個系統級應用程序本身也需要存放一些數據,這些
數據存到哪張表中呢? 存到一個特殊的表中,這個特殊的表叫做數據字典表,它是為oracle

本身服務的.


演示代碼:

 

--1. 查看當前用戶下有哪些表

select TABLE_NAME from user_tables

--2. 查看當前用戶下有哪些視圖

select VIEW_NAME from user_views

--3. 查看當前用戶下有哪些約束
select CONSTRAINT_NAME from user_constraints


select * from user_constraints where constraint_name='SYS_C0016608'


--4.查詢dept表有哪些字段

select * from user_tab_columns where table_name='DEPT'

 

--5.查詢到底有哪些數據字典表
select TABLE_NAME from dictionary

--6.查詢和用戶相關的數據字典表有哪些
select TABLE_NAME from dictionary where TABLE_NAME like 'USER_%'

 

*********************SQL語句優化最基本的技巧************************

使用字段名 代替 *

因為如果程序員寫 select * from emp

oracle執行的時候 會先去查 user_tab_columns這張字典表 把*轉換成所有的字段名


查詢數據字典需要時間 所以最好使用字段來代替

 

一.什么是索引

用來提高查詢速度的數據庫對象


可以理解為 查字典時 的目錄

 

二.為什么用索引


作用: 提高查詢速度


索引(類似查字典,按拼音查,按部首查) 張642 頁 第5個字


沒有索引時
要查的次數 641頁*10個字 + 5=6415

有了目錄: z 26+3 +5=34

zha

zhan

zhang 642


三.how


創建索引的原則


1. where 條件
group by 條件

order by


在經常查詢的字段上加索引...


2. 連接條件

 

3. 在5m以下的表 查詢返回的結果集在5%左右數據時 使用索引


如果是一個超大的表 product表 即使加了索引 也沒有太大的作用


如果是一張超大的表 最好的優化策略 大表 划分成若干個小表


手機product 筆記本product ...

 

創建索引的語法:


create index 索引名 on 表名(字段)


***也可以建立組合索引,查詢組合的時候效率更高


create index 索引名 on 表名(字段1,字段2)

select * from 表名 where 字段1=... and 字段2= ..


***************************初始化數據**********************************


select * from category

insert into category values(1,'手機','通訊工具')

begin
for i in 1..500000 loop
insert into product values(i,'商品名稱'||i,'商品描述'||i,1);
end loop;

commit;
end;

 

************************執行計划(解釋計划)***********************************

1.沒有加索引的時候 默認是全表掃描

Table Access Full


ROWS 基數 Card 預計返回的結果集個數

Bytes 返回的結果集占用的字節數

Cost 耗費 2(0) 占用cpu的百分比

一般Cost越小表示執行計划越優, 執行速度越快,只是一個參考值 ,不一定

Time SQL語句 預計消耗的時間

 

************************索引的優缺點***********************************

優點: 提高查詢速度

缺點:

1. 如果在一個表中頻繁做 插入或刪除操作 使用索引反而會降低 SQL語句的執行速度
因為插入、刪除數據時 不僅要插入數據 而且要維護索引


2. 索引是占用空間的

 

************************索引的分類***********************************

第一種分法

1. 唯一性索引

主鍵和 unique 約束的字段 系統會自動為這些字段創建唯一性索引

2. 非唯一性索引

用戶手工創建的索引都屬於 非唯一性索引


第二種分法


1. 聚集性索引

物理位置上真正排序了 索引順序和物理順序是一致的


拼音


2. 非聚集性索引


物理位置上並沒有排序 只是建立了一個指針...


部首

 

********************************oracle中的索引*******************

1. B樹索引

適合高基數字段的查詢(字段值重復比較少或沒有重復)


2. 降序索引

是一種特殊的B樹索引

select ename,hiredate from emp

where hiredate between to_date('1981-01-01','yyyy-mm-dd') and to_date('1981-12-31','yyyy-mm-dd')

order by hiredate desc


3. 函數索引


需求: 查詢員工名稱為SMITH的員工信息


create index index_emp_ename on emp(lower(ename))

select * from emp where lower(ename)='smith'、


降序索引和函數索引都屬於B樹索引

 

4. 位圖索引


在查詢 低基數 字段 上 使用位圖索引 可以提高查詢性能


低基數(字段值重復比較多) 例如 emp表的 deptno字段


需求: 查詢部門編號為10 的員工的信息


部門編號這個字段 重復比較多


只有3個基數 deptno=10、deptno=20、deptno=30


銀彈 1987 xxx 發表了篇軟件工程的論文

軟件工程中沒有銀彈的概念 10年內沒有一種方法或技術 能提高軟件產品的生產力提高10倍以上


同樣 索引也不是提高性能的百分百絕對的方法...提高性能的最好的方式是提升硬件

 

 

一. 什么是序列

oracle 用來產生主鍵的一種方式


第一次值是1,每次自增1...依次類推

 

二.how

每一張表都應該有一個序列,該序列專門為這張表創建主鍵


create sequence seq_表名


例如

create sequence seq_article;

如何使用

insert into article values(seq_article.nextval,'標題1','標題2')

insert into article values(seq_article.nextval,'標題2','標題2')


查詢序列當前值

select article.currval from dual;


**************************解決oracle序列從2開始的問題*************************


create sequence seq_article minvalue 0 start with 0 increment by 1

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM