SQL Server查詢優化和事務處理

對於瞭解掌握SQL的增、刪、改、查的語句操做是最基本的,實際生產環境中,咱們還會用到一些比較高級的數據處理和查詢,包括索引、視圖、存儲過程和觸發器。本篇博文主要如何更好的實現對數據庫的操做、診斷及優化。shell

博文大綱:
1、索引;
2、視圖;
3、存儲過程;
4、觸發器;
5、事務;數據庫

1、索引

索引提供指針以指向存儲在表中指定列的數據值,而後根據指定的次序排列這些指針,再跟隨指針到達包含該值的列。編程

1.什麼是索引

數據庫中的索引與書籍中的目錄類似。在一本書中,無需閱讀整本書,利用目錄就能夠快速的查找到所需的信息。在數據庫中,索引使數據庫程序無須對整個表進行掃描,就能夠在其中找到所需的數據。書中的目錄就是一個詞語列表,其中註明了包含各個詞的頁碼。而數據庫中的索引是某個表中一列或若干列值的集合,以及物理表示這些值得數據業的邏輯指針清單。安全

索引是SQL Server編排數據的內部方法,它爲SQL Server提供一種方法來編排查詢數據的路由。服務器

索引頁是數據庫中存儲索引的數據頁。索引頁存放檢索數據行的關鍵字頁以及該數據行的地址指針。經過使用索引,能夠大大提升數據庫的檢索速度,改善數據庫性能。網絡

2.索引分類

在SQL Server中,經常使用的索引有:ide

(1)惟一索引

惟一索引不容許兩行具備相同的索引值。模塊化

若是現有數據中存在重複的鍵值,則通常狀況下大多數數據庫不容許建立惟一索引。當新數據使表中的鍵值重複時,數據庫也拒絕接收此數據。性能

建立了惟一約束,將自動建立惟一索引。儘管惟一索引有助於找到信息,可是爲了得到最佳性能,建議使用主鍵約束。優化

(2)主鍵索引

在數據庫關係圖中爲表定義一個主鍵將自動建立主鍵索引,主鍵索引是惟一索引的特殊類型。

主建索引要求主鍵中的每一個值都是惟一的。當在查詢使用主鍵索引時,它還容許快速訪問數據。

(3)彙集索引

在彙集索引中,表中各行的物理順序與鍵值的邏輯(索引)順序相同。

一個表中只能包含一個彙集索引。

(4)非彙集索引

非彙集索引創建在索引頁上,在查詢數據是能夠從索引中找到記錄存放的位置。
非彙集索引使表中各行數據存放的物理順序與鍵值的邏輯順序不匹配。彙集索引比非彙集索引有更快的數據訪問速度。

在SQL Server中,一個表只能建立一個彙集索引,但能夠有多個非彙集索引。設置某列爲主鍵,該列就默認爲彙集索引。

(5)複合索引

在建立索引時,並非只能對其中一列建立索引,與建立主鍵同樣,能夠將多個列組合做爲索引,這種索引稱爲複合索引。

注意:只有用到複合索引的第一列或整個複合索引列做爲條件完成數據查詢時纔會用到該索引。

(6)全文索引

全文索引是一種特殊類型的基於標記的功能性索引,由SQL Server中全文引擎服務建立和維護。

全文索引主要用於在大量文本中搜索字符串,此時使用全文索引的效率將大大高於使用T-SQL的LIKE關鍵字的效率。

3.建立和使用索引

建立索引的方法有兩種:使用SSMS和T-SQL語句。

使用SSMS建立索引,以下:
SQL Server查詢優化和事務處理
SQL Server查詢優化和事務處理
SQL Server查詢優化和事務處理
使用SSMS建立索引完成!

select * from chengji
WITH (INDEX=IX_chengji)
where name LIKE '孫%'
//使用建立的索引查詢數據

雖然能夠指定SQL Server按哪一個索引進行數據查詢,但通常不須要人工指定。SQL Server將會根據所建立的索引,自動優化查詢。

使用索引可加快數據檢索速度,但爲每一個列都創建索引沒有必要。由於索引自己也是須要維護,並佔用必定的資源,能夠按照如下標準選擇創建索引的列。

  • 頻繁搜索的列;
  • 常常用於查詢選擇的列;
  • 常常排序、分組的列;
  • 常常用於鏈接的列(主鍵/外鍵);

不要使用下面的列建立索引:

  • 僅包含幾個不一樣值的列;
  • 表中僅包含幾行;

在工做中的經驗:

  • 查詢時減小使用「*」返回所有列,不要返回不須要的列;
  • 索引應該儘可能小,在字節小的列上創建索引;
  • where子句中有多個條件表達式時,包含索引列的表達式應置於其餘條件表達式以前;
  • 避免在order by子句中使用表達式;
  • 根據業務數據發生頻率,按期從新生成或從新組織索引,進行碎片整理;

2、視圖

視圖是保存在數據庫中的select查詢。所以,對查詢指定的大多數操做也能夠在視圖上進行。

使用視圖的緣由有:

  • (1)處於安全考慮,用戶沒必要看到整個數據庫結構,而隱藏部分數據;
  • (2)符合用戶平常業務邏輯,使其對數據更容易理解;

1.什麼是視圖

視圖是另外一種查看數據庫中一個或多個表中的數據的方法。視圖是一種虛擬表,一般是做爲來自一個或多個表的行或列的子集建立的。固然,視圖也能夠包含所有的行和列。可是,視圖並非數據庫中存儲的數據值的集合,它的行和列來自查詢中引用的表。在執行時,視圖直接顯示來自表中的數據。

視圖充當着查詢中指定的表的篩選器。定義視圖的查詢能夠基於一個或多個表,也能夠基於其餘視圖、當前數據庫或其餘數據庫。

視圖一般用來進行如下三種操做:

  • 篩選表中的行;
  • 防止未經許可的用戶訪問敏感的信息;
  • 將多個物理數據表抽象爲一個邏輯數據表。

(1)使用視圖的好處:

(1)對最終用戶的好處:
結果更容易理解;
得到數據更容易;
(2)對開發人員的好處:
限制數據檢索更容易;
維護應用程序更方便;

(2)建立視圖

語法:

create view aa
as
SELECT     dbo.基本信息表.學號, dbo.成績表.學號 AS Expr1, dbo.基本信息表.姓名, dbo.成績表.成績
FROM         dbo.基本信息表 INNER JOIN
                      dbo.成績表 ON dbo.基本信息表.學號 = dbo.成績表.學號

查看視圖

select * from aa

(3)使用視圖的注意事項

(1)每一個視圖可使用多個表;
(2)與查詢類似,一個視圖能夠嵌套另外一個視圖,最好不要超過三層;
(3)視圖定義中的select語句不能包含如下內容:

  • order by子句,除非子啊select語句的選擇列表中也有一個TOP子句;
  • into關鍵字;
  • 引用臨時表或表變量;

3、存儲過程

SQL Server使用存儲過程來避免遠程發送並執行SQL代碼帶來的安全隱患。

1.爲何須要存儲過程

當今的軟件大多應用於網絡中,而通常應用程序所運用的數據保存在數據庫中。在沒有使用存儲過程的數據庫應用程序中,用戶大多從本地極端及客戶端經過網絡向服務器端發送SQL代碼編寫的請求,服務器端對接收到SQL代碼進行語法編譯後執行,並經指定結果傳送回客戶端,再由客戶端的應用軟件處理後輸出。若是開發者對服務器的安全性考慮不全面,就會爲非法者提供盜取數據的機會。如圖:
SQL Server查詢優化和事務處理
未經受權的非法者在網絡中截取用戶想服務器發送的SQL代碼,改寫後的惡意SQL代碼提交到服務器編譯並執行,最後非法者就比較容易地得到他所需的數據。

從圖中,咱們能夠看到應用程序執行的過程是不安全的,主要在於如下幾個方面:

  • 數據不安全:網絡傳送SQL代碼,容易被未經受權者截取;
  • 每次提交SQL代碼都要通過語法編譯後再執行,影響應用程序的運行性能;
  • 網絡流量大:對於反覆執行的相同SQL代碼,將會在網絡上屢次傳送,增長網絡傳輸流量。

爲了解決這些問題,咱們能夠採用存儲過程把對數據庫操做的SQL代碼預先編譯好並保存在服務器端,用戶只需在本機上輸入要執行的存儲過程名稱和必要的數據就能夠直接調用執行存儲過程完成行管的操做。這樣。既減小了網絡傳輸流量,又能保證應用程序的運行性能,同時也防止了未經受權者想截獲SQL代碼的行爲。

2.什麼是存儲過程

存儲過程是SQL語句和控制語句的預編譯集合,保存在數據庫中,可由應用程序調用執行,並且容許用戶聲明變量,邏輯控制語句及其餘強大的編程功能。

使用存儲過程的優勢:

  • 1.模塊化程序設計;
  • 2.執行速度快、效率高;減小網絡流量;
  • 3.減小網絡流量;
  • 4.具備良好的安全性;

3.系統存儲過程

SQL Server提供系統存儲過程,它們是一組預編譯的T-SQL語句。系統存儲過程提供了管理數據庫和更新表的機制,並充當從系統表中檢索信息的快捷方式

(1)經常使用的系統存儲過程

SQL Server的系統存儲過程的名稱以「sp-」開頭,並存放在Resource數據庫中。如圖:
SQL Server查詢優化和事務處理
好比:

exec sp_databases
#列出當前系統中的數據庫
exec sp_helptext aa
#查看視圖的語句文本

若xp_cmdshell做爲服務器安全配置的一部分而被關閉,請使用以下語句啓用:

exec sp_configure 'show advanced options',1
#顯示高級配置信息
go
reconfigure
#從新配置
go
exec sp_configure 'xp_cmdshell',1
#打開xp_cmdshell選項
go
reconfigure
#從新配置
go

(2)經常使用的擴展存儲過程

好比使用這些語句在系統中建立某些文件:

exec xp_cmdshell 'md c:\bank',no_output
#建立文件夾c:\bank
exec xp_cmdshell 'dir c:\'
#列出c盤下的文件等內容
create   proc  oo
as
select 姓名, SUM(成績)  as 總成績
from   基本信息表  left join  成績表  on  基本信息表.學號=成績表.學號
group  by  姓名
#建立存儲過程qq
exec qq
#查看存儲過程qq
create   proc  ww
@shuo  varchar(10)
as
select 姓名, SUM(成績)  as 總成績
from   基本信息表  left join  成績表  on  基本信息表.學號=成績表.學號
group  by  姓名
having  姓名=@shuo
#建立針對每一個同窗查看的記錄
exec ww 張三
#查看ww存儲過程可是隻查看張三

4、觸發器

觸發器分爲如下幾種
INSERT觸發器:當向表中插入數據時觸發,自動執行觸發器定義的SQL語句;
UPDATE觸發器:當更新表中某列、多列時觸發,自動執行觸發器所定義的SQL語句;
DELETE觸發器:當刪除表中記錄時觸發,自動執行觸發器定義的SQL語句。
兩個特殊的表由系統管理:
SQL Server查詢優化和事務處理

建立觸發器的語句:
第一種

create   trigger   刪除
on  科目表
for  delete
as
begin
delete  from 成績表  
end
#刪除以後不會同步從表中的數據

第二種

create   trigger   自動同步成績
on  科目表
after delete
as
begin
delete  from 成績表  where 科目id=(select   科目id  from deleted)
end
#刪除以後自動同步成績

第三種

create  trigger  禁止刪除
on 基本信息表
for  delete
as
print  '禁止刪除'
rollback  transaction
#禁止刪除數據,若是刪除數據則執行回滾、撤回操做

5、事務

事務:保證數據庫的原子性、一致性、隔離性、持久性,簡稱ACID。
一個小實例

begin transaction
declare @errorsum int
set @errorsum=0
#定義 內部變量,用來保存前一條的執行結果,執行成功爲0,執行不成功爲非0.
/*--轉賬:張三的賬戶少1000,李四的賬戶多1000元--*/
update bank set currentmoney=currentmoney-1000
where name='zhangsan'
set @errorsum=@errorsum+@@ERROR 
update bank set currentmoney=currentmoney+1000
where name='lisi'
set @errorsum=@errorsum+@@error
print '查看轉帳事務中的餘額'
select * from bank
if @errorsum<>0
 begin
  print '交易失敗,回滾事務'
  rollback transaction
 end
else
 begin
   print '交易成功,提交事務,寫入硬盤,永久地保存'
   commit transaction
  end
 go
 print '查看轉帳事務後的餘額'
 select * from bank
 go

———————— 本文至此結束,感謝閱讀 ————————

相關文章
相關標籤/搜索