博文目錄
1、索引
2、視圖
3、存儲過程
4、系統存儲過程
5、觸發器
6、事務
7、鎖shell
索引提供指針以指向存儲在表中指定列的數據值,而後根據指定的次序排列這些指針,再跟隨指針到達包含該值的列。數據庫
數據庫中的索引與書籍中的目錄類似。在一本書中,無需閱讀整本書,利用目錄就能夠快速的查找到所需的信息。在數據庫中,索引使數據庫程序無須對整個表進行掃描,就能夠在其中找到所需的數據。書中的目錄就是一個詞語列表,其中註明了包含各個詞的頁碼。而數據庫中的索引是某個表中一列或若干列值的集合,以及物理表示這些值得數據業的邏輯指針清單。編程
索引是SQL Server編排數據的內部方法,它爲SQL Server提供一種方法來編排查詢數據的路由。安全
索引頁是數據庫中存儲索引的數據頁。索引頁存放檢索數據行的關鍵字頁以及該數據行的地址指針。經過使用索引,能夠大大提升數據庫的檢索速度,改善數據庫性能。服務器
惟一索引不容許兩行具備相同的索引值。
若是現有數據中存在重複的鍵值,則通常狀況下大多數數據庫不容許建立惟一索引。當新數據使表中的鍵值重複時,數據庫也拒絕接收此數據。建立了惟一約束,將自動建立惟一索引。儘管惟一索引有助於找到信息,可是爲了得到最佳性能,建議使用主鍵約束。網絡
在數據庫關係圖中爲表定義一個主鍵將自動建立主鍵索引,主鍵索引是惟一索引的特殊類型。
主建索引要求主鍵中的每一個值都是惟一的。當在查詢使用主鍵索引時,它還容許快速訪問數據。併發
在彙集索引中,表中各行的物理順序與鍵值的邏輯(索引)順序相同。一個表中只能包含一個彙集索引。編程語言
非彙集索引創建在索引頁上,在查詢數據是能夠從索引中找到記錄存放的位置。
非彙集索引使表中各行數據存放的物理順序與鍵值的邏輯順序不匹配。彙集索引比非彙集索引有更快的數據訪問速度。在SQL Server中,一個表只能建立一個彙集索引,但能夠有多個非彙集索引。設置某列爲主鍵,該列就默認爲彙集索引。ide
在建立索引時,並非只能對其中一列建立索引,與建立主鍵同樣,能夠將多個列組合做爲索引,這種索引稱爲複合索引。
須要注意的是:只有用到複合索引的第一列或整個複合索引列做爲條件完成數據查詢時纔會用到該索引。模塊化
全文索引是一種特殊類型的基於標記的功能性索引,由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的B一、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中的死鎖,能夠參考以下圖:
發生死鎖須要以下四個必要條件:
互斥條件;
請求和等待條件;
不剝奪條件;
- 環路等待條件;
預防死鎖就是破壞四個必要條件中的某一個和幾個,使其不能造成死鎖,經常使用方法以下:
破壞互斥條件;
破壞請求和等待條件;
- 破壞不剝奪條件;
———————— 本文至此結束,感謝閱讀 ————————