⑴ 你了解sql的索引原理嗎
索引是為檢索而存在的,就是說索引並不是一個表必須的。表索引由多個頁面組成,這些頁面一起組成了一個樹形結構,輪鉛即我們通常說的B樹,首先來看下錶索引的組成部分:
根極節點,root,它指向另外兩個頁,把一個表的記錄從邏輯上分成非葉級節點Non-Leaf
Level(枝),它指向了更加小的葉級節點Leaf
Level(葉)。
根節點、非葉級節點和葉級節點都位於索引頁中,統稱為索引葉節點,屬於索引頁的范籌。這些"枝"、"葉"最終指向數據頁Page。根級節點和葉級節點之間的葉又叫數據中間頁。根節點對應了sysindexes表的Root欄位,記載了非葉級節點的物理位置(即指針);非葉級節點位於根節點和葉節點之間,記載了指向葉級節點的指針;而葉級節點則最終指向數據頁,這就是最後的B樹。
資料庫是怎樣薯升訪問表數據的:
第一:沒有創建任何索引的表。
這種表我們稱為堆表,因為所有的數據頁都是無序的,雜亂無章的,在查詢數據時,需要一條一條記錄查詢,有時第一條記錄就能找到,最壞的情況是在最後一條記錄中查找到,但是千萬不要認為SQL此時查找到數據後會當成結果立即返回,SQL即使查找到了記錄,也會將所有數據遍歷一次,這能從最終的執行計劃中得知,就是平時說的表掃描,對於沒有索引的表也能查詢,就是臘手好效率會特別低,如果數據量稍大的話。
問題:SQL是如何得知表沒有索引呢?
SQL在接到查詢請求的時候,會分析sysindexes表中索引標志符(INDID:
Index
ID)的欄位的值,如果該值為0,表示這是一張數據表而不是索引表,SQL就會使用sysindexes表的另一個欄位FirstIAM值中找到該表的IAM
頁鏈也就是所有數據頁集合。至於什麼是IAM,大家可以網上搜索下。
第二:訪問創建有非聚集索引的表。
⑵ SQL附加資料庫時提示"錯誤602;未能在sysindexes中找到資料庫ID7中對象ID1的索引ID1對應的行。"
1.新建一個同名的資料庫(數據文件與原來的要一致)2.再停掉sqlserver(注意不要分離資料庫)3.用原資料庫的數據文件覆蓋掉這個新建的資料庫4.再重啟sqlserver5.此時打開企業管理器時會出現置疑,先不管,執行下面的語句(注意修改其中的資料庫名)6.完成後一般就可以訪問資料庫中的數據了,這時,資料庫本身一般還要問題,解決法是,利用資料庫的腳本創建一個新的資料庫,並將數據導進去就行了.USEMASTERGOSP_CONFIGURE'ALLOWUPDATES',=32768WHERENAME='置疑的資料庫名'Gosp_dboption'置疑的資料庫名','singleuser','true'GoDBCCCHECKDB('置疑的資料庫名')Goupdatesysdatabasessetstatus=28wherename='置疑的資料庫名'Gosp_configure'allowupdates',0reconfigurewithoverrideGosp_dboption'置疑的資料庫名','singleuser','false'