首先聲明:這是本人的答案,並非官方答案,不要盲目追捧,因為覺得這問題很具有代表性,很多人想瞭解,所以記下,順便讓廣大園友也來給本人打打分。因為本人平時用sqlserver2000,所以大多基於sql2000回答。
原帖地址 http://www.cnblogs.com/fygh/archive/2011/10/18/2216166.html
問題如下:
1. char、varchar、nvarchar之間的區別(包括用途和空間佔用);xml類型尋找某個節點的資料有哪些方法,哪個效率高;使用儲存
過程和使用T-SQL查詢資料有啥不一樣;
答:char 是定長的字元類型,若長度不夠自動在後面補足夠的空格 ;varchar是可變長度的字元類型,具長度體根據存入的資料而定;nvarchar可理解為unicode的可變長度字元類型;
xml類型的欄位沒用過,因為感覺xml用不上索引;
2. 系統DB有哪些,都有什麼作用,需不需要做備份,為什麼;損壞了如何做還原(主要是master庫);
答:master 主要儲存系統級的資訊,比如本資料庫執行個體都有哪些資料庫 ,都有哪些帳號等,需備份;
model 模板,每建立一個資料庫 ,都會根據這個庫的結構來建立,如果改過此庫,建議備份;
msdb 儲存計劃任務,作業之類的資訊,需備份,否則會丟失作業和備份計劃;
tempdb 使用者對sqlserver操作時產生的臨時資料依賴於此庫,最常見的是暫存資料表,不許備份;
resource 這個是sqlserver2005新增的唯讀資料庫,儲存了sqlserver的系統對象,如sys.objects,建議備份,磁碟損壞時需要;
master的還原要依賴於sqlcmd,估計很少人經常幹這事,所以這時候應該查下資料;
3. 有哪些操作會使用到TempDB;如果TempDB異常變大,可能的原因是什麼,該如何處理;
答:每個sqlserver運行時所產生的臨時資料都會用到tempdb,最常見的是執行sql指令碼需要返回的記錄集;
異常變大的原因是執行的操作返回的記錄集過大造成,找出該語句最佳化,減少資料範圍,或者分批操作這些資料;
4. Index有哪些類型,它們的區別和實現原理是什麼,索引有啥優點和缺點;如何為SQL語句建立合適的索引,索引建立時有哪些需要
注意的項,如何查看你建立的索引是否被使用;如何維護索引;索引損壞如何檢查,怎麼修複;T-SQL有更好的索引存在,但是運行
時並沒有使用該索引,原因可能是什麼;
答:叢集索引,非叢集索引;叢集索引只能有一個,非聚集可有多個,資料依賴於叢集索引來儲存,如果沒有叢集索引,資料是一個亂序的堆;
優點:合適的索引可有效提高查詢效率;缺點:過多的索引,在insert、update 和 delete 的時候增加索引的維護成本,降低並發量;
一般索引的建立要依賴於 where 和 order by 這兩個關鍵字,執行計畫可以看出是否用到了索引;
還沒遇到過索引損壞的情況,如果損壞,重建之;
用不到索引可能是索引片段過多 ,可進行磁碟重組,若不行可加強制索引with(index( 索引名 ))
5. 視圖上我們能建索引嗎,如果能建的話,會啥好處和壞處;視圖上建索引和表上建索引有啥區別;
答:有索引檢視表,不過本人從來不用, 因為視圖被定義為一個虛擬表,如果對其建立索引,需要具備一些苛刻的條件,也不易維護,所以從來不用;
6. Job資訊我們可以通過哪些表擷取;系統正在啟動並執行語句可以通過哪些視圖擷取;如何擷取某個T-SQL語句的IO、Time等資訊;
答:sql2000下是通過 master.dbo.sysjobs 來查看作業資訊;系統正在啟動並執行語句可通過 master.dbo.sysprocesses 結合 dbcc inputbuffer 來查看,一般查堵塞這個很管用(關於堵塞的定位可看我的另外一篇部落格,sqlserver阻塞定位 );
IO,在sql2000下我本人都是通過profiler看reads,duration,sql2005下有了動態視圖(dmv);
7. 線上系統,一個表有五千萬記錄,現在要你將其中的兩千萬條記錄匯入到另一台伺服器的某個表中,導完後,需要將這兩千萬資料刪
除,你預備如何處理,優缺點是什麼;
答:這個的我之前專門寫了一篇部落格,在這裡 SQLServer DBA 三十問之我答(第7題)
8. 資料庫伺服器報磁碟空間不足,你將如何應對,要求儘快恢複;
答:如果是記錄檔太大,備份日誌,sqlserver會自動截斷日誌;
如果是資料檔案過大,趕緊轉移到一個足夠大的硬碟上,然後再想辦法拆分庫,一般一個庫100G應該差不多,如果太大備份還原什麼的都不是很方便,至於拆分方案那不可一概而論;
9. 暫存資料表、表變數、CTE(通用資料表運算式)有啥區別和聯絡,儲存位置有啥不一樣,使用時如何決定選哪種;
答:暫存資料表,儲存在 tempdb中,
表變數 儲存在記憶體中,他和暫存資料表的區別是 一個是儲存在tempdb,一個儲存在記憶體中,
cte是sqlserver2005新增的,是把一個記錄集當做一個變數來使用,他跟表變數的區別是不需要insert資料,所以應該比表變數更高效;
如果只使用一次cte應該是最好的,如果要重複多次使用同一個記錄集,我個人認為還是表變數,
如果你還需要用到truncate語句來清除臨時的資料,那最好用暫存資料表,因為表變數不支援truncate,可參考我的另一篇 本質:sqlserver為什麼表變數不能truncate
10. SQLServer有哪些隔離等級,預設層級是哪個;資料庫有哪些主要的鎖類型;資料列版本設定是如何?的;
答: 隔離等級: read uncommitted,相當於給每個select 加with(nolock), 會產生髒讀,為提高並發量可設定此選項;
read committed 不允許髒度,預設層級;repeatable read 鎖定select的資料集;serializable 相當於在select的表上加 with(holdlock),從來沒用過;
books online 裡查 set transaction isolation level 可查到。
後語:剛開始看這題目的時候,感覺都經常用到,應該很easy,但是真正要回答的時候發現不知道該怎麼表示,最後還是花了不少時間來查一些資料,也算是對自己知識的再鞏固。可能有些回答的不一定準確,如果哪位仁兄另有高見,不妨賜教一二,也可經常切磋切磋,共同進步。從本人招聘的經曆來看,做asp.net開發的能答對第1、第4題已經算是很不錯的了,從這點可以看到sql是廣大的程式員的弱項。