1、存儲過程的優點是什么? 存儲過程的優點: 1.提高性能 2.減輕網絡擁塞 3.一致性較好 4.改善安全機制 2、什么是觸發器?觸發器有哪幾種?觸發器有什么優點? 一個觸發器是由T-SQL語句集組成的代碼塊,在響應某些動作時激活該語句集 有insert,delete,update
1、存儲過程的優點是什么? 存儲過程的優點: 1.提高性能 2.減輕網絡擁塞 3.一致性較好 4.改善安全機制
2、什么是觸發器?觸發器有哪幾種?觸發器有什么優點?一個觸發器是由T-SQL語句集組成的代碼塊,在響應某些動作時激活該語句集
有insert,delete,update觸發器
它防止了對數據的不正確、未授權的和不一致的改變
3、常見的幾種約束有哪些?分別代表什么意思?如何使用?
1)實體完整性:主鍵保證了實體完整性,一個表只有一個主鍵,但一個主鍵可有包含多個字段,主鍵字段不能為空
2)參照完整性:外鍵保證了引用完整性,一個表可以有多個外鍵
3)用戶定義完整性:CHECK保證了域完整性, 一個表中可以有多個檢查性約束
4、事務:是一系列的數據庫操作,是數據庫應用的基本邏輯單位。
事務性質:ACID特性
原子性(Atomicity):事務的所有操作在數據庫中要么全部正確的反映出來,要么完全不反映;
一致性(Consistency):執行前后數據保持一致,比如,轉帳系統執行前后,兩者的總錢數保持一致;
隔離性(Isolation):盡管多個事務可能并發執行,但執行的結果與某個串行執行相同,因此,每個事務都感覺不到系統中其他事務在并發執行,隔離性是并發控制的主要任務;
持久性(Durability)一個事務成功執行完成后,它對數據庫的改變必須是永久的,即使出現系統故障,持久性是恢復系統的主要任務
5、內聯接與外聯接
內連接是保證兩個表中所有的行都要滿足連接條件,而外連接則不然。在外連接中,某些不滿條件的列也會顯示出來,也就是說,只限制其中一個表的行,而不限制另一個表的行。分左連接、右連接、全連接三種
6、視圖
視圖是數據庫數據的特定子集。可以禁止所有用戶訪問數據庫表,而要求用戶只能通過視圖操作數據,這種方法可以保護用戶和應用程序不受某些數據庫修改的影響。2.視圖是抽象的,他在使用時,從表里提取出數據,形成虛的表。 視圖沒有自己的數據,當用戶操作視圖時,數據庫才把相應的操作轉化為對應表的操作,視圖僅僅是預先定義好的一些SQL操作,它是在基本表之上建立的表,它的結構(即所定義的列)和內容(即所有數據行)都來自基本表,它依據基本表存在而存在。一個視圖可以對應一個基本表,也可以對應多個基本表。
7、索引:參考文獻
優點:
第一,可以大大加快 數據的檢索速度,這也是創建索引的最主要的原因。
第二,通過創建唯一性索引,可以保證數據庫表中每一行數據的唯一性。
缺點:
第一,創建索引和維護索引要耗費時間,這種時間隨著數據 量的增加而增加。
第二,索引需要占物理空間,除了數據表占數據空間之外,每一個索引還要占一定的物理空間,如果要建立聚簇索引,那么需要的空間就會更大。
第三,當對表中的數據進行增加、刪除和修改的時候,索引也要動態的維護,這樣就降低了數據的維護速度。
索引是建立在數據庫表中的某些列的上面。因此,在創建索引的時候,應該仔細考慮在哪些列上可以創建索引,在哪些列上不能創建索引。一般來說,應該在這些列 上創建索引,例如:
在經常需要搜索的列上,可以加快搜索的速度;
在作為主鍵的列上,強制該列的唯一性和組織表中數據的排列結構;
在經常用在連接的列上,這 些列主要是一些外鍵,可以加快連接的速度;
在經常需要根據范圍進行搜索的列上創建索引,因為索引已經排序,其指定的范圍是連續的;
在經常需要排序的列上創 建索引,因為索引已經排序,這樣查詢可以利用索引的排序,加快排序查詢時間;
在經常使用在WHERE子句中的列上面創建索引,加快條件的判斷速度。
同樣,對于有些列不應該創建索引。一般來說,不應該創建索引的的這些列具有下列特點:
第一,對于那些在查詢中很少使用或者參考的列不應該創建索引。這是因 為,既然這些列很少使用到,因此有索引或者無索引,并不能提高查詢速度。相反,由于增加了索引,反而降低了系統的維護速度和增大了空間需求。
第二,對于那 些只有很少數據值的列也不應該增加索引。這是因為,由于這些列的取值很少,例如人事表的性別列,在查詢的結果中,結果集的數據行占了表中數據行的很大比 例,即需要在表中搜索的數據行的比例很大。增加索引,并不能明顯加快檢索速度。
第三,對于那些定義為text, image和bit數據類型的列不應該增加索引。這是因為,這些列的數據量要么相當大,要么取值很少。
第四,當修改性能遠遠大于檢索性能時,不應該創建索 引。這是因為,修改性能和檢索性能是互相矛盾的。當增加索引時,會提高檢索性能,但是會降低修改性能。當減少索引時,會提高修改性能,降低檢索性能。因 此,當修改性能遠遠大于檢索性能時,不應該創建索引。
索引的幾種方式
1、順序索引(基本不用) 2、B+樹索引(最常用,如mysql的InnoDB) 3、hash索引(用的不多)8、SQL標準定義的四個隔離級別(都是與事務相關的) 參考
通過一些現象,可以反映出隔離級別的效果。這些現象有:
1、更新丟失(lost update):當系統允許兩個事務同時更新同一數據是,發生更新丟失。
2、臟讀(dirty read):當一個事務讀取另一個事務尚未提交的修改時,產生臟讀。3、非重復讀(nonrepeatableread):同一查詢在同一事務中多次進行,由于其他提交事務所做的修改或刪除,每次返回不同的結果集,此時發生非重復讀。
4、幻像(phantom read):同一查詢在同一事務中多次進行,由于其他提交事務所做的插入操作,每次返回不同的結果集,此時發生幻像讀。
下面是隔離級別及其對應的可能出現或不可能出現的現象
Dirty Read |
NonRepeatable Read |
Phantom Read |
|
Read uncommitted |
Possible |
Possible |
Possible |
Read committed |
Not possible |
Possible |
Possible |
Repeatable read |
Not possible |
Not possible |
Possible |
Serializable |
Not possible |
Not possible |
Not possible |
ORACLE的隔離級別 ORACLE提供了SQL92標準中的readcommitted和serializable
mysql的InnoDB存儲引擎默認支持的隔離級別是Repeatable read
在標準SQL規范中,定義了4個事務隔離級別,不同的隔離級別對事務的處理不同:
◆未授權讀取(Read Uncommitted):允許臟讀取,但不允許更新丟失。如果一個事務已經開始寫數據,則另外一個事務則不允許同時進行寫操作,但允許其他事務讀此行數據。該隔離級別可以通過“排他寫鎖”實現。
◆授權讀取(Read Committed):允許不可重復讀取,但不允許臟讀取。這可以通過“瞬間共享讀鎖”和“排他寫鎖”實現。讀取數據的事務允許其他事務繼續訪問該行數據,但是未提交的寫事務將會禁止其他事務訪問該行。
◆可重復讀取(Repeatable Read):禁止不可重復讀取和臟讀取,但是有時可能出現幻影數據。這可以通過“共享讀鎖”和“排他寫鎖”實現。讀取數據的事務將會禁止寫事務(但允許讀事務),寫事務則禁止任何其他事務。
◆序列化(Serializable):提供嚴格的事務隔離。它要求事務序列化執行,事務只能一個接著一個地執行,但不能并發執行。如果僅僅通過“行級鎖”是無法實現事務序列化的,必須通過其他機制保證新插入的數據不會被剛執行查詢操作的事務訪問到。
隔離級別越高,越能保證數據的完整性和一致性,但是對并發性能的影響也越大,通過選用不同的隔離等級就可以在不同程度上避免前面所提及的在事務處理中所面臨的各種問題。所以,數據庫隔離級別的選取就顯得尤為重要,在選取數據庫的隔離級別時,應該注意以下幾個處理的原則:
首先,必須排除“未授權讀取”,因為在多個事務之間使用它將會是非常危險的。事務的回滾操作或失敗將會影響到其他并發事務。第一個事務的回滾將會完全將其他事務的操作清除,甚至使數據庫處在一個不一致的狀態。很可能一個已回滾為結束的事務對數據的修改最后卻修改提交了,因為“未授權讀取”允許其他事務讀取數據,最后整個錯誤狀態在其他事務之間傳播開來。
其次,絕大部分應用都無須使用“序列化”隔離(一般來說,讀取幻影數據并不是一個問題),此隔離級別也難以測量。目前使用序列化隔離的應用中,一般都使用悲觀鎖,這樣強行使所有事務都序列化執行。
剩下的也就是在“授權讀取”和“可重復讀取”之間選擇了。我們先考慮可重復讀取。如果所有的數據訪問都是在統一的原子數據庫事務中,此隔離級別將消除一個事務在另外一個并發事務過程中覆蓋數據的可能性(第二個事務更新丟失問題)。這是一個非常重要的問題,但是使用可重復讀取并不是解決問題的唯一途徑。
9、聚集索引與非聚集索引
聚簇索引是一種對磁盤上實際數據重新組織以按指定的一個或多個列的值排序。由于聚簇索引的索引頁面指針指向數據頁面,所以使用聚簇索引查找數據幾乎總是比使用非聚簇索引快。每張表只能建一個聚簇索引,在聚簇索引下,數據在物理上按順序排在數據頁上,重復值也排在一起,因而在那些包含范圍檢查(between、<、<=、& gt;、>=)或使用groupby或order by的查詢時,一旦找到具有范圍中第一個鍵值的行,具有后續索引值的行保證物理上毗連在一起而不必進一步搜索,避免了大范圍掃描,可以大大提高查詢速度。
<喎?http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+CrnY09pteXNxbLXEy/fS/aOsv8nS1LLOv7zV4sDvoaO52NPaQiYjNDM7yve1xNStwO2/ydLUss6/vNXiwO88L3A+Cgo8cD4xMKGiyNXWvs7EvP4gcmVkbyC6zSB1bmRvtcTX99PDPC9wPgo8cD7U2srCzvFUv6rKvL+qyrzWrsewo6zI1da+1tDQtMjrvMfCvCZsdDtUIHN0YXJ0Jmd0O6Os1rTQ0Ln9s8zW0KOsVNa00NDIzrrOd3JpdGUoWCmy2df3x7DPyNKqz/LI1da+1tDQtMjrysq1sbXE0MK1xLzHwryjrLWxVMzhvbvKsaOsyNXWvtbQ0LTI67zHwrwmbHQ7VCBjb21taXQmZ3Q7o6zX3LXEwLTLtb7NysfPyNC0yNXWvqOsuvO4/NDCvMfCvKGjPC9wPgo8cD48aW1nIHNyYz0="http://www.2cto.com/uploadfile/Collfiles/20140909/20140909091017242.png" alt="">
在這里我們先說恢復的一般方法:
(1)正向掃描日志文件(從頭到尾),找出故障發生前已經提交的事務(存在begin transaction和commit記錄),將其標識記入重做(redo)隊列。同時找出故障發生時未完成的事務(只有begin transaction,沒commit),將其標識記入(undo)隊列
(2)對undo隊列的各事務進行撤銷處理。進行undo的處理方法是,反向掃描日志文件,對每個undo事務的更新操作執行反操作,即將日志記錄中“更新前的值”寫入數據庫。
(3)對重做日志中的各事務進行重做操作。進行redo的處理方法是,正向掃描日志,對每個redo事務重新執行日志文件登記操作。即將日志中“更新后的值”寫入數據庫。
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com