*************************數據字典*******************************
普通的表 是用來存放 應用程序 需要的數據的
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