❶ 資料庫基礎詳解:存儲過程、視圖、游標、sql語句優化以及索引
寫在文章前:本系列文章用於博主自己歸納復習一些基礎知識,同時也分享給可能需要的人,因為水平有限,肯定存在諸多不足以及技術性錯誤,請大佬們及時指正。
存儲過程 是事先經過編譯並存儲在資料庫中的一段SQL語句的集合。想要實現相應的功能時,只需要調用這個存儲過程就行了(類似於函數,輸入具有輸出參數)。
優點 :
缺點 :
Delete用來刪除表的全部或者部分數據,執行delete之後,用戶需要提交之後才會執行,會觸發表上的DELETE觸發器(包含一個OLD的虛擬表,可以只讀訪問被刪除的數據),DELETE之後表結構還在,刪除很慢,一行一行地刪,因為會記錄日誌,可以利用日誌還原數據;
Truncate刪除表中的所有數據,這個操作不能回滾,也不會觸發這個表上的觸發器。操作比DELETE快很多(直接把表drop掉,再創建一個新表,刪除的數據不能找回)。如果表中有自增(AUTO_INCREMENT)列,則重置為1。
Drop命令從資料庫中刪除表,所有的數據行,索引和約束都會被刪除。不能回滾,不會觸發觸發器。
觸發器(TRIGGER)是由事件(比如INSERT/UPDATE/DELETE)來觸發運行的操作(不能被直接調用,不能接收參數)。在資料庫里以獨立的對象存儲,用於保證數據完整性(比如可以檢驗或轉換數據)。
約束(Constraint)類型:
從資料庫的基本表中通過查詢選取出來的數據組成的虛擬表(資料庫中只存放視圖的定義,而不存放視圖的數據)。可以對其進行增/刪/改/查等操作。視圖是對若干張基本表的引用,一張虛表,查詢語句執行的結果,不存儲具體的數據(基本表數據發生了改變,視圖也會跟著改變)。
可以跟基本表一樣,進行增刪改查操作( 增刪改操作有條件限制,一般視圖只允許查詢操作 ),對視圖的增刪改也會影響原表的數據。 它就像一個窗口,透過它可以看到資料庫中自己感興趣的數據並且操作它們。 好處:
用於定位在查詢返回的結果集的特定行,以對特定行進行操作。使用游標可以方便地對結果集進行移動遍歷,根據需要滾動或對瀏覽/修改任意行中的數據。主要用於互動式應用。它是一段私有的SQL工作區,也就是一段內存區域,用於暫時存放受SQL語句影響的數據,簡單來說,就是將受影響的數據暫時放到了一個內存區域的虛表當中,這個虛表就是游標。
游標是一種能從包括多條數據記錄的結果集中每次提取一條記錄的機制。即游標用來逐行讀取結果集。游標充當指針的作用。盡管游標能遍歷結果中的所有行,但他一次只指向一行。
游標的一個常見用途就是保存查詢結果,以便以後使用。游標的結果集是由SELECT語句產生,如果處理過程需要重復使用一個記錄集,那麼創建一次游標而重復使用若干次,比重復查詢資料庫要快的多。通俗來說,游標就是能在sql的查詢結果中,顯示某一行(或某多行)數據,其查詢的結果不是數據表,而是已經查詢出來的結果集。
簡單來說:游標就是在查詢出的結果集中進行選擇性操作的工具。
讓緩存更高效。對於連接查詢,如果其中一個表發生變化,那麼整個查詢緩存就無法使用。而分解後的多個查詢,即使其中一個表發生變化,對其它表的查詢緩存依然可以使用。分解成多個單表查詢,這些單表查詢的緩存結果更可能被其它查詢使用到,從而減少冗餘的查詢。減少鎖競爭。
索引是對資料庫表中一列或多列的值進行排序的一種結構(說明是在列上建立的),使用索引可快速訪問資料庫表中的特定信息。如果想按特定職員的姓來查找他或她,則與在表中搜索所有的行相比,索引有助於更快地獲取信息。索引的一個主要目的就是加快檢索表中數據,亦即能協助信息搜索者盡快的找到符合限制條件的記錄ID的輔助數據結構。
當表中有大量記錄時,若要對表進行查詢,第一種搜索信息方式是全表搜索,是將所有記錄一一取出,和查詢條件進行一一對比,然後返回滿足條件的記錄,這樣做會消耗大量資料庫系統時間,並造成大量磁碟I/O操作。第二種就是在表中建立索引,然後在索引中找到符合查詢條件的索引值,最後通過保存在索引中的ROWID(相當於頁碼)快速找到表中對應的記錄。
例如這樣一個查詢:select * from table1 where id=10000。如果沒有索引,必須遍歷整個表,直到ID等於10000的這一行被找到為止。有了索引之後(必須是在ID這一列上建立的索引),即可在索引中查找。由於索引是經過某種演算法優化過的,因而查找次數要少的多。可見,索引是用來定位的。
從應用上分, 主鍵索引(聚集) , 唯一索引(聚集/非聚集) , 普通索引 , 組合索引 , 單列索引和全文索引
❷ 創建唯一索引的 sql語句
sql語句創建唯一索引的方法:
1、在sql server資料庫中:
CREATE UNIQUE INDEX AK_UnitMeasure_Name
ON Proction.UnitMeasure (Name);
GO
2、在oracle中床創建
CREATE unique INDEX 索引名 ON 表名 (列名)
TABLESPACE 表空間名;
❸ SQL Server唯一索引和非唯一索引的區別簡析
SQL Server創建索引時,可以指定Unique使之成為唯一索引。「唯一」顧名思義,但是兩都到底有什麼區別呢?因為索引也是一種物理結構,所以還是要從存儲和結構上分析。
索引結構分葉級和非葉級,分析時我們要分開來看,這個很重要。
文中涉及的索引行大小計算,參考MSDN估計資料庫大小索引部分。
1. 非唯一聚集索引和唯一聚集索引
創建兩個測試表,各10000條整數,tb1唯一,tb2非唯一,有1000條為9999的重復值。
view sourceprint?
01.<img onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_402704').style.display='none'; document.getElementById('Code_Open_Image_402704').style.display='inline'; document.getElementById('Code_Open_Text_402704').style.display='inline';"id="Code_Closed_Image_402704"align="top"src=""width="11"height="16"style="display: none;"><img alt="載入中..."title="圖片載入中..."src="http://www.it165.net/statics/images/s_nopic.gif"><img onclick="this.style.display='none'; document.getElementById('Code_Open_Text_402704').style.display='none'; getElementById('Code_Closed_Image_402704').style.display='inline'; getElementById('Code_Closed_Text_402704').style.display='inline';"id="Code_Open_Image_402704"style="display: none;"align="top"src=""width="11"height="16"><img alt="載入中..."title="圖片載入中..."src="http://www.it165.net/statics/images/s_nopic.gif">Codecreate table tb1
02.(col1int);
03.declare@iint=1
04.while@i<10001
05.begin
06.insert into tb1 values(@i);
07.set@i=@i+1;
08.end;
09.create unique clustered index ucix on tb1 (col1)
10.go
11.-------
12.create table tb2
13.(col2int);
14.declare@iint=1
15.while@i<9001
16.begin
17.insert into tb2 values(@i);
18.set@i=@i+1;
19.end;
20.go
21.insert into tb2 values(9999)
22.go1000;
23.create clustered index cix on tb2 (col2)
24.go
先查詢索引的一些基本狀況:
發現多出一個UNIQUIFIER,同樣葉級也是一樣。MSDN說明:
「如果聚集索引不是唯一的索引,SQL Server 將添加在內部生成的值(稱為唯一值)以使所有重復鍵唯一。此四位元組的值對於用戶不可見。僅當需要使聚集鍵唯一以用於非聚集索引中時,才添加該值。」
還有UNIQUIFIER不是一個全局自增列,重復記錄增加時此值會發生改變,並且它是一個可為null的變長列。
現在來算一算索引行大小:
兩個表都是只有一個int型可為NULL的欄位,而聚集索引葉級是存儲數據本身
葉級是一個4位元組的INT列,無變長列,加上3位元組的NULL點陣圖,再加上4位元組的行頭開銷:兩個表的葉級minSize =4+0+3+4=11
非葉級是一個4位元組的INT列,無變長列,加上3位元組的NULL點陣圖,加上1位元組的行頭開銷,再加6位元組的子頁指針:兩個表的非葉級minSize=4+0+3+1+6=14
tb1的索引行大小是一致的minSize=maxSize,因為它是唯一的。tb2的索引行大小不一致,有大有小,大的索引行是因為:a)不唯一 b)UNIQUIFIER
唯一標識列增加了2+1*2+4=8位元組開銷,tb2的min和max相差就是這8位元組。
tb2的葉級maxSize=4+8+3+4=19
tb2的非葉級maxSize=4+8+3+1+6=22
小結:非唯一聚集索引為保證索引鍵值唯一性,會生成UNIQUIFIER與鍵列一起組成索引鍵值。同時無論在葉級還是非葉頁級,都比唯一索引佔用更多存儲空間。
❹ SQL資料庫 使用命令為表studinfo的studsex欄位建立一個非聚集唯一索引myidx,請
非聚集索引,前提條件是:
該 欄位是IDENTITY KEY NONCLUSTERED類型,也就是指定NONCLUSTERED關鍵字。
比如:
CREATETABLEMyTableKeyExample
{
,
Column2int
聚集索引默認與主鍵相匹配,在設置主鍵時,SQL Server會默認在主鍵列創建聚集索引。但是可以手動更改為在任意一個列創建聚集索引,然後在另一個欄位或多個欄位上定義主鍵。這時主鍵將會被作為一個唯一的非聚集索引(唯一索引)被創建。通過指定NONCLUSTERED關鍵字就可以做到。
聲明唯一索引的語法很簡單,只是多了個UNIQUE關鍵字。
比如:
CREATEUNIQUENONCLUSTEREDINDEX[AK_Proct_Name]ONProction.Proct([Name]);
❺ 在sql中建立唯一索引要用到什麼保留字
解決方案:
1.必須在TSQL前Set ARITHABORT ON,代碼如下
1: Set ARITHABORT ON
2: GO
3: INSERT INTO ta ..
2.在ADO中,你可以這樣來寫(C#代碼)
MyConnection.Execute("SET ARITHABORT ON");
如果以上你都覺得很麻煩或由於一些原因沒法更改,你可以嘗試修改SQL Server伺服器選項
3.exec sp_dboption 'yourdb','ARITHABORT','true'
或者
4.1: ALTER DATABASE yourdb
2: SET ARITHABORT ON
❻ 如何創建唯一索引
例如,如果計劃頻繁查詢 employee 表中(其中主鍵為 emp_id)的身份證號碼 (ssn)列,並希望確保身份證號碼是唯一的,則可以在 ssn 上創建唯一索引。如果用戶為一個以上的雇員輸入相同的身份證號碼,則資料庫將顯示錯誤而且無法保存該表。在創建或修改唯一索引時,可以可設置一個忽略重復鍵的選項。如果此選項已設置為「是」,當您試圖通過添加影響多行的數據來創建重復鍵(使用 INSERT 語句)時,則不會添加包含重復項的行;如果此選項設置為「否」,則整個插入操作將失敗,並且將回滾所有數據。 創建唯一索引 在對象資源管理器中,右鍵單擊表,再單擊「設計」。此時,將在表設計器中打開該表。在表設計器菜單上,單擊「索引/鍵」。單擊「添加」。「選定的主/唯一鍵或索引」列表將顯示新索引的系統分配名稱。在網格中,單擊「類型」。從屬性右側的下拉列表中選擇「索引」。在「列」下,選擇要編制索引的列。最多可選擇 16 列。為獲得最佳的性能,請只為每個索引選擇一列或兩列。對於所選的每一列,指定索引是以升序還是以降序來排列此列的值。在網格中,單擊「是唯一的」。從屬性右側的下拉列表中選擇「是」。如果希望忽略會在唯一索引中創建重復鍵(用 INSERT 語句)的數據,請選擇「忽略重復鍵」選項並選擇「是」。在保存表或關系圖時將在資料庫中創建該索引。注意:如果單個列在多行中包含 NULL,則無法對該列創建唯一索引。同樣,如果列的組合在多行中包含 NULL,則無法對多個列創建唯一索引。在進行索引時,它們都被視為重復值。
❼ 創建唯一索引的sql語句是什麼
創建唯一索引的sql語句如下:
CREATE [UNIQUE|CLUSTERED] INDEX INDEX_NAME ON TABLE_NAME(PROPERTY_NAME)
其中UNIQUE和CLUSTERED為可選項,分別是建立唯一索引和聚簇索引。
具體解釋為:
UNIQUE:表示此索引的每一個索引值只對應唯一的數據。
CLUSTERED:表示要建立的索引時聚簇索引,即索引項的順序與表中記錄的物理順序一致的索引組織。