PL/SQL开发五年工作经验精典实例
minus指令是運用在兩個SQL語句上。它先找出第一個SQL語句所產生的結果,然后看這些結果有沒有在第二個SQL語句的結果中,如果有的話,那這一筆資料就被去除,而不會在最后的結果中出現;?
如果第二個SQL語句所產生的結果并沒有存在于第一個SQL語句所產生的結果內,那這筆資料就被拋棄。?
intersect指令是運用在兩個SQL語句上,如果兩個SQL語句的記錄完全相同則顯示相應記錄,否則將不在結果中出現。
-------------------------------------------------------------------------------------------
2. 表空間(tablespace)、段(segment)、區段(extent)、塊(block)的關系
1)表空間:是Oracle中的一個邏輯存儲容器,位于存儲層次體系的頂層,包含一個或多個數據文件。
2)段:占用存儲空間的數據為對象,如表、索引、回滾段等;段由一個或多個區段組成。
3)區段:是文件中一個邏輯上連續分配的空間;區段由塊組成。?
4)塊:是Oracle中最小的空間分配單位;數據行、索引條目或臨時排序結果就存儲在塊中;Oracle中常見的塊大小:2K、4K、8K、16K(最大不能超過32K)。
5)它們之間的關系:數據庫由一個或多個表空間組成,表空間由一個或多個數據文件組成,表空間包含段,段由一個或多個區段組成,區段則由連續的塊組成。
-------------------------------------------------------------------------------------------
3. 數據庫分析技術語句
分析表:??analyze table UNIT_PRE_CLAIM compute statistics;
分析索引:analyze index PK_UNIT_PRE_CLAIM_RELA_ID compute statistics;
分析列:??analyze table zl_yhjbqk compute statistics for columns hbs_bh;
分析索引列:analyze table zl_yhjbqk compute statistics for all indexed columns;
-------------------------------------------------------------------------------------------
4. ORACLE的優化器共有3種:
a. RULE (基于規則的優化器)?
。總是使用索引?
。總是從驅動表開始(from子句最右邊的表)?
。只有在不可避免的情況下,才使用全表掃描?
b. COST (基于成本的優化器)?
。需要表、索引的統計資料?
??Analyze table customer compute statistics;?
??Analyze table customer estimate statistics sample 5000 rows;?
。表中設置并行度、表分區?
c. CHOOSE (選擇性)
設置缺省的優化器,可以通過對init.ora文件中OPTIMIZER_MODE參數的各種聲明,如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS. 你當然也在SQL句級或是會話(session)級對其進行覆蓋.
為了使用基于成本的優化器(CBO, Cost-Based Optimizer), 你必須經常運行analyze命令,以增加數據庫中的對象統計信息(object statistics)的準確性.如果數據庫的優化器模式設置為選擇性(CHOOSE),那么實際的優化器模式將和是否運行過analyze命令有關,如果table已經被analyze過, 優化器模式將自動成為CBO, 反之,數據庫將采用RULE形式的優化器. 缺省情況下,ORACLE采用CHOOSE優化器, 為了避免那些不必要的全表掃描(full table scan), 你必須盡量避免使用CHOOSE優化器,而直接采用基于規則或者基于成本的優化器.注意: 在排序合并連接中不使用索引,如果查詢返回兩個表中大部分的數據快,那么CBO會認為全表掃描比索引掃描執行更快。?
-------------------------------------------------------------------------------------------
5. Hint的常用用法(注意/*和+之間不能有空格)
1)/*+ALL_ROWS*/ 表明對語句塊選擇基于開銷的優化方法,并獲得最佳吞吐量,使資源消耗最小化.
2)/*+FIRST_ROWS*/ 表明對語句塊選擇基于開銷的優化方法,并獲得最佳響應時間,使資源消耗最小化.
3)/*+CHOOSE*/ 表明如果數據字典中有訪問表的統計信息,將基于開銷的優化方法,并獲得最佳的吞吐量;
如果數據字典中沒有訪問表的統計信息,將基于規則開銷的優化方法;
4)/*+ RULE*/ 表明對語句塊選擇基于規則的優化方法.
5)/*+ROWID(TABLE)*/ 提示明確表明對指定表根據ROWID進行訪問.
例如: SELECT /*+ROWID(BSEMPMS)*/ * FROM BSEMPMS WHERE ROWID>='AAAAAAAAAAAAAA'
6)/*+INDEX(TABLE INDEX_NAME)*/ 表明對表選擇索引的掃描方法.
7)/*+INDEX_JOIN(TABLE INDEX_NAME)*/ 提示明確命令優化器使用索引作為訪問路徑.
8)/*+APPEND*/ 直接插入到表的最后,可以提高速度.
例如: insert /*+append*/ into test1 select * from test4;
如用hint指定使用某個索引
select /*+ index(表名) */ col1 from 表名;
select /*+ index(表名 索引名) */ col1 from 表名;
select /*+ index(a 索引名) */ col1 from 表名 a;
其中
TABLE_NAME是必須要寫的,且如果在查詢中使用了表的別名,在hint也要用表的別名來代替表名;
INDEX_NAME可以不必寫,Oracle會根據統計值選一個索引;
-------------------------------------------------------------------------------------------
6. 位圖索引
位圖索引儲存主要用來節省空間,減少ORACLE對數據塊的訪問,它采用位圖偏移方式來與表的行ID號對應,采用位圖索引一般是重復值太多的表字段。位圖索引在實際密集型OLTP(數據事務處理)中用得比較少,因為OLTP會對表進行大量的刪除、修改、新建操作,ORACLE每次進行操作都會對要操作的數據塊加鎖,所以多人操作很容易產生數據塊鎖等待甚至死鎖現象。在OLAP(數據分析處理)中應用位圖有優勢,因為OLAP中大部分是對數據庫的查詢操作,而且一般采用數據倉庫技術,所以大量數據采用位圖索引節省空間比較明顯。?
-------------------------------------------------------------------------------------------
7.?應該盡量避免出現left outer join, right outer join ,尤其是大表,大表更應該盡量避它作為外連接的驅動表
-------------------------------------------------------------------------------------------
8. 如獲得完整的時間格式
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from??dual;
select to_char(to_date('2008-06-24','yyyy-mm-dd'),'day') from dual; --可以轉換成中文星期幾
-------------------------------------------------------------------------------------------
9. 隨機抽取前N條記錄的問題
select * from (select * from tablename order by sys_guid()) where rownum < N;
抽取從N行到M行的記錄,如從20行到30行的記錄
select * from (select rownum id,t.* from table where ……
and rownum <= 30) where id > 20;
-------------------------------------------------------------------------------------------
10. 怎么樣在ORACLE中定時運行存儲過程
可以利用dbms_job包來定時運行作業,如執行存儲過程,一個簡單的例子,提交一個作業:
VARIABLE jobno number;
BEGIN
??DBMS_JOB.SUBMIT(:jobno, 'ur_procedure;', SYSDATE, 'SYSDATE + 1');
??commit;
END;
之后,就可以用以下語句查詢已經提交的作業 select * from user_jobs;
-------------------------------------------------------------------------------------------
11. 固定列數的行列轉換
student??subject grade
-------- ------- -----
student1??語文? ?80
student1??數學? ?70
student1??英語? ?60
student2??語文? ?90
student2??數學? ?80
student2??英語? ?100
轉換為:?
? ?? ?? ? 語文??數學??英語
student1? ?80? ? 70? ? 60
student2? ?90? ? 80? ? 100
…… …… …… …… ……?
語句如下:
Select Student,
? ?? ? Sum(Decode(Subject, '語文', Grade, Null)) "語文",
? ?? ? Sum(Decode(Subject, '數學', Grade, Null)) "數學",
? ?? ? Sum(Decode(Subject, '英語', Grade, Null)) "英語"
??From Table
Group By Student
-------------------------------------------------------------------------------------------
12. 怎么樣實現分組取前N條記錄 (如獲取每個部門薪水前三名的員工)
Select *
??From (Select Depno, Ename, Sal,
? ?? ?? ?? ?? ?Row_Number() Over(Partition By Depno Order By Sal Desc) Rn
? ?? ?? ? From Emp)
Where Rn <= 3;
本文轉自:http://sakyone.iteye.com/blog/812000
?
轉載于:https://www.cnblogs.com/nizuimeiabc1/p/4254159.html
總結
以上是生活随笔為你收集整理的PL/SQL开发五年工作经验精典实例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在中国Windows Azure服务中创
- 下一篇: javascript中函数作用域和声明提