數據庫完整性:是指數據庫中數據在邏輯上的一致性、正確性、有效性和相容性
實體完整性(Entity Integrity 行完整性):實體完整性指表中行的完整性。主要用於保證操作的數據(記錄)非空、唯一且不重復。即實體完整性要求每個關系(表)有且僅有一個主鍵,每一個主鍵值必須唯一,而且不允許為“空”(NULL)或重復。
域完整性(Domain Integrity 列完整性):是指數據庫表中的列必須滿足某種特定的數據類型或約束。其中約束又包括取值范圍、精度等規定。表中的CHECK、FOREIGN KEY 約束和DEFAULT、 NOT NULL定義都屬於域完整性的范疇。
參照完整性(Referential Integrity)屬於表間規則:對於永久關系的相關表,在更新、插入或刪除記錄時,如果只改其一,就會影響數據的完整性。如刪除父表的某記錄后,子表的相應記錄未刪除,致使這些記錄稱為孤立記錄。
參照完整性規則(Referential Integrity)要求:若屬性組F是關系模式R1的主鍵,同時F也是關系模式R2的外鍵,則在R2的關系中,F的取值只允許兩種可能:空值或等於R1關系中某個主鍵值。
Sql Server的存儲結構,頁、區、堆
頁:用於數據存儲的連續的磁盤空間塊,SQL Server中數據存儲的基本單位是頁,磁盤I/O操作在頁級執行,頁的大小為8KB。每頁的開頭是96字節的頁頭,用於存儲有關頁的系統信息,包括頁碼、頁類型、頁的可用空間以及擁有該頁的對象的分配單元ID;其他便是存儲數據的數據行與剩下可用空間,結構圖如下(個人繪制)
區間:區是管理空間的基本單位,一個區是8個物理上連續的頁(即64KB)的集合,所有頁都存儲在區中。SQL Server有兩種類型的區:統一區和混合區。
堆:堆是指不含聚集索引的表,它的數據不按任何順序進行存儲。
聯系一個堆中的數據的唯一結構是被稱為索引分配映射(IAM)的一個位圖頁,當掃描對象時,SQl server使用IAM頁來遍歷該對象的數據。
堆表內的數據頁和行沒有任何特定的順序,也不鏈接在一起。數據頁之間唯一的邏輯連接是記錄在 IAM 頁內的信息
假設某訂單明細表中有100萬條數據,需要查詢某個訂單的明細數據,如下:
select * from T_EPZ_INOUT_ENTRY_DETAIL where entry_apply_id='31227000034000090169'
如果在堆表中進行查詢,SQL Server通過掃描 IAM 頁對堆表進行全表掃描,對entry_apply_id比較100萬次,如果以entry_apply_id字段建立索引,則因為索引鍵值數據都必定以B-Tree有順序的擺放,所以可采用二分查找找數據。也就是2的N次方大於記錄數,就可以找到該條數據。而2的20次方大於100萬,因此最多找尋20次就可以找到該條記錄。20次與100萬次的比較,你可以輕松感受出性能的差異。
由此引出索引的概念
索引分為聚集索引與非聚集索引
聚集索引 :聚集索引是指數據庫表行中數據的物理順序與鍵值的邏輯(索引)順序相同。一個表只能有一個聚集索引,因為一個表的物理順序只有一種情況,所以,對應的聚集索引只能有一個。如果某索引不是聚集索引,則表中的行物理順序與索引順序不匹配,與非聚集索引相比,聚集索引有着更快的檢索速度
非聚集索引:非聚集索引是一種索引,該索引中索引的邏輯順序與磁盤上行的物理存儲順序不同
聚集索引與非聚集索引的形象比喻



dbcc showcontig(Tstudent,non_sname) --Tstudent表明,PK_TStudent索引名 ,查詢頁分裂情況 dbcc indexdefrag(schoolDB,Tstudent,non_sname)--索引整理 create nonclustered index non_sname on TStudent(sname) with drop_existing,fillfactor = 50--重建索引,並且制定填充因子 dbcc show_statistics(tstudent,non_sname)--查看索引統計 update statistics schooldb.dbo.tstudent --人工更新表中所有索引的統計 update statistics schooldb.dbo.tstudent non_sname --人工更新表中non_sname索引統計