天天看點

走向DBA[MSSQL篇] 面試官最喜歡的問題 ----索引+C#面試題客串

對大量資料進行查詢時,可以應用到索引技術。索引是一種特殊類型的資料庫對象,它儲存着資料表中一列或者多列的排序結果,有效地使用索引可以提高資料的查詢效率。大家面試初級、中級或者進階程式員的時候應該大部分都會被問到這樣一些問題,你了解索引嗎?你知道索引的分類嗎?你知道這些索引的差別嗎?你如何去建立有效的索引。本章讓大家學會反問面試官 hold住全場。 --_____--

友情客串

最近面試的文章比較火 客串一下 我隻簡單問2個問題 看看有多少人能直接回答出來 都是比較基礎的

1.基類虛函數、派生類重寫 與 基類普通函數、派生類覆寫的差別(-____-)

2.Using閉包中try catch,異常捕獲後抛出,那麼using資源能否正常釋放,概述原因(-____-)

答案在文章結尾揭曉

 基本知識 (面試官會問的)

索引是神馬

一般說法:索引是與表關聯的磁盤上結構,可以加快從表中檢索行的速度。索引包含由表中的一列或多列生成的鍵。這些鍵存儲在一個結構中,使 SQL Server 可以快速有效地查找與鍵值關聯的行。

hold說法:索引說白了就是Balanced Tree(簡稱B樹)結構,多層次、自維護,節點存放表的資料辨別資訊,如果表中的一條記錄在磁盤上占用500位元組的話,我們對其中10位元組的一個字段建立索引,那麼該記錄對應的索引塊的大小隻有10位元組。這樣檢索IO通路量要少的多。

索引的分類

一般說法:聚集索引與非聚集索引

hold說法:聚集索引、非聚集索引、唯一索引、包含性列索引、索引視圖、全文索引、XML索引

說下聚集索引與非聚集索引的差別

一般說法:聚集索引是基于記錄内容在資料表内的排序和存儲。非聚集索引不會為資料表的資料進行實體上排序,隻是将索引建立在索引頁上,在查詢資料時一樣可以從索引中找到記錄存放的位置。

hold說法:聚集索引根據資料行的鍵值在表中排序和存儲這些資料行。索引定義中包含聚集索引列。每個表隻能有一個聚集索引,因為資料行本身隻能按一個順序排序。隻有當表包含聚集索引時,表中的資料行才按排序順序存儲。如果表具有聚集索引,則該表稱為聚集表。如果表沒有聚集索引,則其資料行存儲在一個稱為堆的無序結構中。 

非聚集索引具有獨立于資料行的結構。非聚集索引包含非聚集索引鍵值,并且每個鍵值項都有指向包含該鍵值的資料行的指針。從非聚集索引中的索引行指向資料行的指針稱為行定位器。行定位器的結構取決于資料頁是存儲在堆中還是聚集表中。對于堆,行定位器是指向行的指針。對于聚集表,行定位器是聚集索引鍵。

一張表中可以建立幾個聚集索引和非聚集索引

一般說法:1個聚集索引和249個非聚集索引

hold說法:冷哼一聲、笑而不語。

索引的設計原則

一般說法:表增删改操作多的少用索引 查操作多的适當建立索引

hold說法:

1.大量的索引會影響DML語句的性能;

2. 對小表進行索引可能不會産生優化效果;

3.對經常用于查詢中的謂詞和連接配接列建立非聚集索引;

4.覆寫索引可以提高查詢性能;

5.聚集索引,最好保持較短的索引鍵;

6.考慮對定義完善的的列使用篩選索引;

7.如果索引包含多個列 ,應考慮列的順序;

進階知識(可以用來調戲面試官)

建立索引的限制

每個索引最多16個鍵列;

索引鍵最長900位元組;

大型對象資料類型不能作為索引鍵列;

唯一索引:唯一索引確定索引鍵不包含重複的值,是以,表或視圖中的每一行在某種程度上是唯一的。聚集索引和非聚集索引都可以是唯一索引。

設計原則:

唯一索引能夠保證索引鍵中不包含重複的值,進而使表中的每一行從某種方式上具有唯一性。隻有當唯一性是資料本身的特征時,指定唯一索引才有意義。例如,如果您希望確定 HumanResources.Employee 表的 NationalIDNumber 列中的值唯一,當主鍵為 EmployeeID 時,可以為 NationalIDNumber<code></code> 列建立一個 UNIQUE 限制。如果使用者嘗試在該列中為多個雇員輸入相同的值,将顯示錯誤消息并且不能輸入重複的值。

唯一索引能夠確定定義的列的資料完整性并提供了對查詢優化器有用的附加資訊。

包含性列索引:一種非聚集索引,它擴充後不僅包含鍵列,還包含非鍵列。

重新設計索引鍵大小較大的非聚集索引,以便隻有用于搜尋和查找的列為鍵列。将覆寫查詢的所有其他列設定為包含性非鍵列。這樣,将具有覆寫查詢所需的所有列,但索引鍵本身較小,而且效率高。

<a href="http://blog.51cto.com/dubing/712445#">?</a>

1

2

3

4

5

6

<code>USE AdventureWorks;</code>

<code>GO</code>

<code>SELECT</code> <code>AddressLine1, AddressLine2, City, StateProvinceID, PostalCode</code>

<code>FROM</code> <code>Person.Address</code>

<code>WHERE</code> <code>PostalCode </code><code>BETWEEN</code> <code>N</code><code>'98000'</code> <code>and</code> <code>N</code><code>'99999'</code><code>;</code>

 若要覆寫查詢,必須在索引中定義每列。盡管可以将所有列定義為鍵列,但鍵大小為 334 位元組。因為實際上用作搜尋條件的唯一列是 <code>PostalCode</code> 列(長度為 30 位元組),是以更好的索引設計應該将 <code>PostalCode</code> 定義為鍵列并包含作為非鍵列的所有其他列。

<code>CREATE</code> <code>INDEX</code> <code>IX_Address_PostalCode      </code>

<code>ON</code> <code>Person.Address (PostalCode)      </code>

<code>INCLUDE (AddressLine1, AddressLine2, City, StateProvinceID);</code>

 索引視圖:視圖的索引将具體化(執行)視圖,并将結果集永久存儲在唯一的聚集索引中,而且其存儲方法與帶聚集索引的表的存儲方法相同。建立聚集索引後,可以為視圖添加非聚集索引。

設計原則:對視圖建立索引的另一個好處是:優化器可以在未直接在 FROM 子句中指定某一視圖的查詢中使用該視圖的索引。這樣一來,可從索引視圖檢索資料而無需重新編碼,由此帶來的高效率也使現有查詢獲益。

索引視圖可以提高下列查詢類型的性能:1.處理大量行的聯接和聚合。2.許多查詢經常執行的聯接和聚合操作。 3.決策支援工作負荷。  

全文索引:這個蟲子以後會單獨開全文檢索章節來講

XML:xml 資料類型列中 XML 二進制大型對象 (BLOB) 的已拆分持久表示形式。XML執行個體的最大資料量可以達到2GB,如果在沒有索引的xml字段裡查詢會很

耗時,在XML字段上建立的索引就是xml索引。

設計原則:主 XML 索引,輔助 XML 索引。xml 類型列的第一個索引必須是主 XML 索引。使用主 XML 索引時,支援三種類型的輔助索引。這些類型包括 PATH、VALUE 和 PROPERTY。根據查詢類型的不同,這些輔助索引可能有助于改善查詢性能。

提高篇(和面試無關了)

索引優化

無論何時對基礎資料執行插入,更新或删除操作,資料庫引擎都會自動維護索引。這些修改可導緻索引中産生碎片;碎片非常多的索引可能會降低查詢性能,導緻應用程式響應緩慢。

1.定期整理索引;

2.設定索引并行度;

3.分析TRACE資料,調整索引;

聚集表、堆和索引

聚集表是有聚集索引的表。資料行基于聚集索引鍵按順序存儲。聚集索引按 B 樹索引結構實作,B 樹索引結構支援基于聚集索引鍵值對行進行快速檢索。索引中每個級别的頁(包括葉級别的資料頁)連結在一個雙向連結的清單中。但是,通過使用鍵值來執行從一個級别到另一級别的導航。

堆是沒有聚集索引的表。資料行不按任何特殊的順序存儲,資料頁也沒有任何特殊的順序。資料頁不在連結清單内連結。

菜鳥如何有效的建立索引

前提是你有線上伺服器的權限 -___-

首先打開SQL Server Profiler建立一個跟蹤

根據自己選擇針對性選擇屬性

運作一段時間儲存跟蹤文本

打開優化引擎

根據自己需求設定

分析并根據系統的建議進行優化

因為蟲子跑的本地環境 下面的步驟就不截圖了 你們都懂的

 和索引關聯的存儲過程

sp_helpindex報告有關表或視圖上索引的資訊。

<code>exec</code> <code>sp_helpindex </code><code>'PPS_App_Infomation'</code>

根據sys.indexes視圖來檢視索引資訊

<code>select</code> <code>* </code><code>from</code> <code>sys.indexes</code>

至于索引增删查改的文法網上一搜一片的 就不造輪子了 關于索引還有很多進階應用例如 虛拟列索引、選擇索引等等 不過大家未必感興趣 實用才是王道 如果有人對這些感興趣可以留言讨論

 客串答案

是不是網上也沒找到想要的答案 O(∩_∩)O

1.虛函數重寫是運作時的多态  派生類的覆寫是隐藏基類的方法

2.using的dispose原理和try catch的finally是一樣的

很多程式員會抱怨别人和自己同樣的工齡 為什麼别人的薪水那麼高 也有很多程式員覺得自己牛氣沖天 隻是沒遇到伯樂 其實當自己不淡定的時候 不如回頭看看 重頭學一遍 或許自己的觀點會改變很多 

  希望本篇對大家幫助 大家的支援才是蟲子的動力 -____-

本文轉自 熬夜的蟲子  51CTO部落格,原文連結:http://blog.51cto.com/dubing/712445