oracle學習筆記零碎(五)--基礎知識複習(2)

eBusinessMan發表於2015-03-16

20. 一下情況中不能使用序列.nextvalcurrval,會報錯的:

         1.     group by , having order by select 語句;

         2.     selectdeleteupdate語句的子查詢裡面;

21.   在以下情況中,序列的值會出現不連續:

         1.發生回滾 ;2.系統崩潰 ; 3. 被其他物件呼叫過。

22.   建立序列時,如果我們使用了nocache,那麼還可以通過user_sequenceslast_number欄位來檢視序列的下一個值;可是如果快取了序列值的話,last_number就不一定準確了。

索引:

23.   索引的建立主要有兩種方式:  1.自動建立(當為表定義了主鍵或者某個欄位加上了unique約束),會自動建立唯一索引;         2.手動建立:我們可以在多列上手動建立非唯一索引來加快檢索速度。(注意:一個列不能建立多個index)

24.   什麼時候需要建立索引?

1. 當表的某列包含的資料值在很大範圍

2. 某列包含了大量的null值

3. 表很大,有很多行,可是返回的資料行數很少(少於2%~4%

4. 某列經常用於where子句中作為查詢條件,或者join的連線條件

 

什麼時候不建議建立索引?

1.      上面的情況的相反;

2.      表經常被DML

3.      Where子句中這個列無可避免的合成表示式後才作為查詢條件

25. 常常通過連線user_indexesuser_ind_columns檢視來徹底瞭解一個索引;

26.   基於函式的索引的建立:其實就是指基於表示式建立的索引

                  Creat index index_name on table_name(upper(id));

         要注意 的是:只有當查詢條件中出現upper(id)時,才會使用此列上的索引。否則只會全表掃描。原因是這個索引的“指標,值”中的“值”是upper(id)計算後的值。

27.   只有索引的所有者或者具有drop any index許可權的使用者才能刪除這個索引。

同義詞:

28.   建立同義詞如果指定了public ,那麼這個同義詞(公有同義詞)就預設可以供所有使用者使用;否則(私有同義詞)就只能OWNER或擁有許可權的人使用。

注意:刪除公有同義詞是要帶上public,否則報:不存在,因為沒有public的話就認為它是私有的。

 

角色:

29.   值得注意的是,我們還可以將對一個表的列的操作許可權賦予給使用者(角色),可是僅僅限於updatereference。例如,grant references (id,name) on department to luozhixiao;可是在回收這個許可權的時候,就只有revoke references on department from luozhixiao;就是:只不能回收表中部分列的許可權。

30.  

USER_TAB_PRIVS_MADE    Object privileges granted on the user’s objects

                                                     檢視指定物件可以給別人操作的許可權

USER_TAB_PRIVS_RECD                 Object privileges granted to the user

USER_COL_PRIVS_MADE       Object privileges granted on the columns of the user’s objects

                                                     檢視錶的指定列可以給別人操作的許可權

USER_COL_PRIVS_RECD                 Object privileges granted to the user on specific columns

31.   一個重大的盲點:A將某物件許可權賦予給B(with grant options),後來B又將此許可權賦予C,那麼當AB收回此許可權時,C的許可權也被級聯回收!!

32.   使用alter table 來修改table時,要注意:alter table t_name drop column (c_name);(而 add , modify 就沒有column關鍵字了)。

         其次,當我們modify某欄位的資料型別和size時,如果之前的資料有不符合修改後的資料型別和size的,修改將會失敗!

         還有當我們modify某欄位的資料型別,size,預設值,是否空時,我們只需要將此欄位的修改的屬性寫在altert table語句中即可

         為什麼要設定欄位為unused呢?又如何將欄位重使用呢?

Alter table t_name set unused (c_name_1, c_name_2……);

Desc t_name;//會發現unused的欄位沒有了----是隱藏了還是刪除了??

 

資料字典:

33.資料字典,無非就是一些基表和一些檢視(all_,dba_ ,user_和v$)的組合體,用來記錄整個資料庫使用者,物件,和執行狀態。所以可以通過資料字典來檢視絕大部分資料庫的資訊。

       基表:基表中儲存著資料庫的資訊,只有oracle可以讀寫(SYS也不行),使用者很少能夠直接的訪問這些基表,因為這些基表中的資訊是難以看懂的,並且通常情況下都被加密儲存。

檢視:基表主要是供oracle資料庫自己用的,檢視把其中的一些資訊抽取解析出來供使用者使用,部分檢視是可以被所有資料庫使用者訪問的,部分只供管理員使用。

 

       一個很特別的資料字典檢視:dictionary,這個檢視包含了對所有資料字典表和檢視的描述。普通使用者也可以通過它來查詢自己可以訪問的資料字典檢視(例如user_tables)的描述,可是對於無權訪問的資料字典檢視就無法查到。

       一個技巧:當我們有時候只記得某個檢視的一部分名字時,可以通過對dictionary模糊查詢來找到它!!

      

       user_objects : 我們可以通過此檢視來查詢我們建立的某個物件的“何時建立”“上一次修改時間”“目前狀態”等資訊。不過我感覺很奇怪的是,拿table做例子,為什麼不在user_tables就可以查詢到“何時建立”“上一次修改時間”“目前狀態”等資訊呢?為何要將這些資訊另放在user_objects中?

      

       user_tab_columns :檢視錶的列的詳細資訊

       user_constraints : 可以檢視到約束的詳細,可是不知是哪個列的

user_cons_columns : 可以檢視到約束的列。所以經常兩者連線查詢。

USER_INDEXES : 可以檢視到INDEX的詳細,可是不知是哪個列的

USER_IND_COLUMNS : 可以檢視到INDEX的列。所以經常兩者連線查詢。

 

我們使用者建立的所有表和檢視,都會在user_tab_comments 和 user_col_comments 檢視中有一個記錄,可是comments欄位沒有內容,除非自己新增進去。

為表/檢視和列新增註釋:

Comment on t_name is  ‘888888’;

要刪除註釋,可將該註釋設定為之間沒有空格的兩個單引號:

Comment on table BIRTHDAY is ''; 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29900383/viewspace-1461726/,如需轉載,請註明出處,否則將追究法律責任。

相關文章