您好,登錄后才能下訂單哦!
博文目錄
一、索引
二、視圖
三、存儲過程
四、系統存儲過程
五、觸發器
六、事務
七、鎖
索引提供指針以指向存儲在表中指定列的數據值,然后根據指定的次序排列這些指針,再跟隨指針到達包含該值的列。
數據庫中的索引與書籍中的目錄相似。在一本書中,無需閱讀整本書,利用目錄就可以快速的查找到所需的信息。在數據庫中,索引使數據庫程序無須對整個表進行掃描,就可以在其中找到所需的數據。書中的目錄就是一個詞語列表,其中注明了包含各個詞的頁碼。而數據庫中的索引是某個表中一列或若干列值的集合,以及物理表示這些值得數據業的邏輯指針清單。
索引是SQL Server編排數據的內部方法,它為SQL Server提供一種方法來編排查詢數據的路由。
索引頁是數據庫中存儲索引的數據頁。索引頁存放檢索數據行的關鍵字頁以及該數據行的地址指針。通過使用索引,可以大大提高數據庫的檢索速度,改善數據庫性能。
唯一索引不允許兩行具有相同的索引值。
如果現有數據中存在重復的鍵值,則一般情況下大多數數據庫不允許創建唯一索引。當新數據使表中的鍵值重復時,數據庫也拒絕接收此數據。創建了唯一約束,將自動創建唯一索引。盡管唯一索引有助于找到信息,但是為了獲得最佳性能,建議使用主鍵約束。
在數據庫關系圖中為表定義一個主鍵將自動創建主鍵索引,主鍵索引是唯一索引的特殊類型。
主建索引要求主鍵中的每個值都是唯一的。當在查詢使用主鍵索引時,它還允許快速訪問數據。
在聚集索引中,表中各行的物理順序與鍵值的邏輯(索引)順序相同。一個表中只能包含一個聚集索引。
非聚集索引建立在索引頁上,在查詢數據是可以從索引中找到記錄存放的位置。
非聚集索引使表中各行數據存放的物理順序與鍵值的邏輯順序不匹配。聚集索引比非聚集索引有更快的數據訪問速度。在SQL Server中,一個表只能創建一個聚集索引,但可以有多個非聚集索引。設置某列為主鍵,該列就默認為聚集索引。
在創建索引時,并不是只能對其中一列創建索引,與創建主鍵一樣,可以將多個列組合作為索引,這種索引稱為復合索引。
需要注意的是:只有用到復合索引的第一列或整個復合索引列作為條件完成數據查詢時才會用到該索引。
全文索引是一種特殊類型的基于標記的功能性索引,由SQL Server中全文引擎服務創建和維護。
全文索引主要用于在大量文本中搜索字符串,此時使用全文索引的效率將大大高于使用T-SQL的LIKE關鍵字的效率。因為全文索引的創建過程與其他類型的索引有很大的差別。
創建索引的方法有兩種:使用SSMS和T-SQL語句。
使用SSMS創建索引,如下:
select * from products with (index=IX_name) where 名稱='黃瓜';
雖然可以指定SQL Server按哪個索引進行數據查詢,但一般不需要人工指定。SQL Server將會根據所創建的索引,自動優化查詢。
使用索引可加快數據檢索速度,但為每個列都建立索引沒有必要。因為索引本身也是需要維護,并占用一定的資源,可以按照以下標準選擇建立索引的列。
頻繁搜索的列;
經常用于查詢選擇的列;
經常排序、分組的列;
- 經常用于連接的列(主鍵/外鍵);
不要使用下面的列創建索引:
僅包含幾個不同值的列;
- 表中僅包含幾行;
視圖是保存在數據庫中的select查詢。因此,對查詢指定的大多數操作也可以在視圖上進行。使用視圖的原因有兩個,其一是處于安全考慮,用戶不必看到整個數據庫結構,而隱藏部分數據;其二是符合用戶日常業務邏輯,使其對數據更容易理解。
視圖是另一種查看數據庫中一個或多個表中的數據的方法。視圖是一種虛擬表,通常是作為來自一個或多個表的行或列的子集創建的。當然,視圖也可以包含全部的行和列。但是,視圖并不是數據庫中存儲的數據值的集合,它的行和列來自查詢中引用的表。在執行時,視圖直接顯示來自表中的數據。
視圖充當著查詢中指定的表的篩選器。定義視圖的查詢可以基于一個或多個表,也可以基于其他視圖、當前數據庫或其他數據庫。
如下圖所示,以表T和表T1為例,該視圖可以包含這些表中的全部列或選定的部分列。如下圖所示為一個用表T的A列和B列及表T1的B1、C1和D1列創建的視圖:
視圖通常用來進行以下三種操作:
篩選表中的行;
防止未經許可的用戶訪問敏感的信息;
- 將多個物理數據表抽象為一個邏輯數據表;
對最終用戶的好處:
對開發人員的好處:
在SQL Server中,創建視圖的方法有兩種:使用SSMS和使用T-SQL語句。
①展開數據庫test,如圖所示,右擊“視圖”,在彈出的快捷菜單中選擇“新建視圖”命令(自行創建多個表插入數據)
②將A、B、C三張表添加出來
③選擇希望看到列:學員名稱、學員年齡、成績,然后中下方自動生成T-SQL語句,按“crtl+R”快捷鍵執行語句
④選擇T-SQL語句按“crtl+R”快捷鍵執行即可
每個視圖可以使用多個表;
與查詢相似,一個視圖可以嵌套另一個視圖,最好不要超過三層;
- 視圖定義中的select語句不能包含以下內容:
order by子句,除非子啊select語句的選擇列表中也有一個TOP子句;
into關鍵字;
引用臨時表或表變量;
SQL Server使用存儲過程來避免遠程發送并執行SQL代碼帶來的安全隱患。
當今的軟件大多應用于網絡中,而一般應用程序所運用的數據保存在數據庫中。在沒有使用存儲過程的數據庫應用程序中,用戶大多從本地極端及客戶端通過網絡向服務器端發送SQL代碼編寫的請求,服務器端對接收到SQL代碼進行語法編譯后執行,并經指定結果傳送回客戶端,再由客戶端的應用軟件處理后輸出。如果開發者對服務器的安全性考慮不全面,就會為非法者提供盜取數據的機會。如下圖所示:
未經授權的非法者在網絡中截取用戶想服務器發送的SQL代碼,改寫后的惡意SQL代碼提交到服務器編譯并執行,最后非法者就比較容易地獲得他所需的數據。
從圖中,我們可以看到應用程序執行的過程是不安全的,主要在于以下幾個方面:
數據不安全:網絡傳送SQL代碼,容易被未經授權者截取;
每次提交SQL代碼都要經過語法編譯后再執行,影響應用程序的運行性能;
- 網絡流量大。對于反復執行的相同SQL代碼,將會在網絡上多次傳送,增加網絡傳輸流量;
為了解決這些問題,我們可以采用存儲過程把對數據庫操作的SQL代碼預先編譯好并保存在服務器端,用戶只需在本機上輸入要執行的存儲過程名稱和必要的數據就可以直接調用執行存儲過程完成行管的操作。這樣。既減少了網絡傳輸流量,又能保證應用程序的運行性能,同時也防止了未經授權者想截獲SQL代碼的行為。
存儲過程是SQL語句和控制語句的預編譯集合,保存在數據庫中,可由應用程序調用執行,而且允許用戶聲明變量,邏輯控制語句及其他強大的編程功能。
存儲過程可包含邏輯控制語句和數據操作語句,可以接收參數、輸出參數、返回單個或多個結果集及返回值。
存儲過程的優點如下:
模塊化程序設計;
執行速度快、效率高;
減少網絡流量;
- 具有良好的安全性;
SQL Server提供系統存儲過程,它們是一組預編譯的T-SQL語句。系統存儲過程提供了管理數據庫和更新表的機制,并充當從系統表中檢索信息的快捷方式。
通過配置SQL Server,可以生成對象、用戶、權限的信息和定義,這些信息和定義存儲在系統表中。每個數據庫分別有一個包含配置信息的系統表集,用戶數據庫的系統表是在創建數據庫時自動創建的,用戶可以通過系統存儲過程訪問和更新系統表。
SQL Server的系統存儲過程的名稱以“sp-”開頭,并存放在Resource數據庫中。系統管理員擁有這些存儲過程的使用權限。可以在任何數據庫中運行系統存儲過程,但執行的結果會反映在當前數據庫中。
示例如下:
<!--顯示數據庫-->
exec sp_databases;
<!--顯示某個數據庫對象的信息-->
exec sp_help A;
<!--顯示所有數據庫的信息-->
exec sp_helpdb;
<!--更改數據庫名字-->
exec sp_renamedb 'xsh','benet';
<!--顯示products表的約束-->
exec sp_helpconstraint products;
<!--顯示products表的索引-->
exec sp_helpindex products;
上面示例的輸出結果集較多,在此不一一列舉,請自行逐句運行,查看相應的輸出結果。
根據系統存儲過程的不同作用,系統存儲過程可以分為不同類。擴展存儲過程是SQL Server提供的各類系統存儲過程中的一類。
擴展存儲過程允許使用其他編程語言(如 C##語言)創建外部存儲過程,為數據庫用戶提供從SQL Server實例到外部程序的接口,以便進行各種維護活動。它通常以“xp_”開頭,以DLL形式單獨存在。
一個常用的擴展存儲過程為xp_cmdshell,它可以完成DOS命令下的一些操作,如創建文件夾、列出文件夾列表等,其語法如下:
開啟系統cmdshell功能
<!--開啟系統cmdshell功能-->
exec sp_configure 'show advanced options',1
reconfigure
exec sp_configure 'xp_cmdshell',1
reconfigure;
<!--創建目錄-->
exec xp_cmdshell 'mkdir D:\test', no_output;
<!--顯示創建目錄-->
exec xp_cmdshell 'dir d:\';
觸發器是一種特殊類型的存儲過程,當表中的數據發生更新時將自動調用,以響應INSERT、UPDATE或DELETE語句。
觸發器是在對表進行插入、更新或刪除操作時自動執行的存儲過程。觸發器通常用于強制業務規則,是一種高級約束,可以定義比用CHECK約束更為復雜的約束,可以行發雜的SQL語句(如IF/WHILE/CASE),可引用其他表中的列。觸發器主要是通過事件進行觸發而被執行的,而存儲過程可以通過存儲過程名稱而被直接調用。當對某一表進行修改,,如UPDATE、INSERT和DELETE這些操作時,SQL Server會自動執行觸發器所定義的SQL語句,從而確保對數據的處理必須符合由這些SQL語句所定義的規則。由此觸發器可分為以下幾種:
觸發器的主要作用是,實現由主鍵和外鍵所不能保證的復雜的參照完整性和數據的一致性。
使用T-SQL語句創建觸發器的語法如下:
CREATE TRIGGER trigger_name
ON table_name
[WITH ENCRYPTION]
FOR { [DELETE, INSERT, UPDATE] }
AS SQL語句
創建觸發器時需要注意以下問題:
CREATE TRIGGER必須是批處理中的第一條語句,并且只能應用到一個表中;
觸發器只能在當前的數據庫中創建,不過觸發器可以引用當前數據庫的外部對象;
- 在同一條CREATE TRIGGER語句中,可以為多種用戶操作(如INSERT和UPDATE)定義相同的觸發器操作;
事務是一種機制、一個操作序列,包含了一組數據庫操作命令,并且把所有的命令作為一個整體一起向系統提交或撤銷操作請求,即這一組數據庫命令要么都執行,要么都不執行。因此,事務是一個不可分隔的工作邏輯單元,在數據庫系統上執行并發操作時,事務是作為最小的控制單元來使用的,它特別適用于多用戶同時操作的數據庫系統。
事務是作為單個邏輯工作單元執行的一系列操作。一個邏輯工作單元必須有四個屬性,即原子性、一致性、隔離性及持久性,這些特性通常簡稱為ACID。
事務是一個完整的操作。事務的各元素是不可分的(原子的)。事務中的所有元素必須作為一個整體提交或回滾。如果事務中的任何元素失敗、則整個事務將失敗。
當事務完成時,數據必須處于一致狀態。也就是說,在事務開始之前,數據庫中存儲的數據處于一致狀態。在正在進行的事務中,數據可能處于不一致的狀態,如數據可能有部分修改。然而,當事務成功完成時,數據必須再次回到已知的一致狀態。通過事務對數據所做的修改不能損壞數據,或者說事務不能使數據存儲處于不穩定的狀態。
對數據進行修改的所有并發事務使彼此隔離的,這表明事務必須是獨立的,它不應以任何方式依賴于或影響其他事務。修改數據的事務可以在另一個使用相同數據的事務開始之前訪問這些數據,或者在另一個使用相同的數據,則直到該事務成功提交之后,對數據的修改才能生效。
事務的持久性指不管系統是否發生了故障,事務處理的結果都是永久的。
BEGIN TRANSACTION
COMMIT TRANSACTION
ROLLBACK TRANSACTION
BEGIN TRANSACTION語句后面的SQL語句對數據庫的更新操作都將記錄在事務日志中,直至遇到ROLLBACK TRANSACTION語句或COMMIT TRANSACTION語句。如果事務中某一操作失敗且執行ROLLBACK TRANSACTION語句,那么在BEGIN TRANSACTION語句之后所有更新的數據都能回滾到事務開始前的狀態。如果事務中的所有操作都全部正確完成,并且使用COMMIT TRANSACTION語句向數據庫提交更新數據,那么這時候的數據又處在新的一致狀態。
多個用戶能夠同時操縱同一個數據庫中的數據,會發生數據不一致現象。也就是說,如果沒有鎖定且多個用戶同時訪問一個數據庫,則當事務同時使用相同的數據時可能會發生問題。這些問題包括丟失、更新、臟讀、不可重復讀和幻覺讀。數據庫加鎖就是為了解決以上的問題。
共享鎖(S鎖):用于讀取資源所加的鎖;
排他鎖(X鎖):和其他任何鎖都不兼容,包括其他排他鎖,排他鎖用于數據修改;
- 更新鎖(U鎖):U鎖可以看作S鎖和X鎖的結合,用于更新數據,更新數據時首先需要找到被更新的數據,此時可以理解為被查找的數據上了S鎖。當找到需要修改的數據時,需要對被修改的資源上X鎖。SQL Server通過U鎖來避免死鎖問題;
使用sys.dm_tran_locks動態管理視圖;
- 使用profiler來捕捉鎖信息;
死鎖的本質是一種僵持狀態,是由多個主體對資源的爭用而導致的。要理解SQL Server中的死鎖,可以參考如下圖:
發生死鎖需要如下四個必要條件:
互斥條件;
請求和等待條件;
不剝奪條件;
- 環路等待條件;
預防死鎖就是破壞四個必要條件中的某一個和幾個,使其不能形成死鎖,常用方法如下:
破壞互斥條件;
破壞請求和等待條件;
- 破壞不剝奪條件;
———————— 本文至此結束,感謝閱讀 ————————
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。