走向DBA[MSSQL篇] 面試官最喜歡的問題 ----索引+C#面試題客串
2011-11-07 13:05 熬夜的蟲子 閱讀(3206) 評(píng)論(21) 收藏 舉報(bào)對大量數(shù)據(jù)進(jìn)行查詢時(shí),可以應(yīng)用到索引技術(shù)。索引是一種特殊類型的數(shù)據(jù)庫對象,它保存著數(shù)據(jù)表中一列或者多列的排序結(jié)果,有效地使用索引可以提高數(shù)據(jù)的查詢效率。大家面試初級(jí)、中級(jí)或者高級(jí)程序員的時(shí)候應(yīng)該大部分都會(huì)被問到這樣一些問題,你了解索引嗎?你知道索引的分類嗎?你知道這些索引的區(qū)別嗎?你如何去創(chuàng)建有效的索引。本章讓大家學(xué)會(huì)反問面試官 hold住全場。 --_____--
友情客串
最近面試的文章比較火 客串一下 我只簡單問2個(gè)問題 看看有多少人能直接回答出來 都是比較基礎(chǔ)的
1.基類虛函數(shù)、派生類重寫 與 基類普通函數(shù)、派生類覆蓋的區(qū)別(-____-)
2.Using閉包中try catch,異常捕獲后拋出,那么using資源能否正常釋放,概述原因(-____-)
答案在文章結(jié)尾揭曉
基本知識(shí) (面試官會(huì)問的)
索引是神馬
一般說法:索引是與表關(guān)聯(lián)的磁盤上結(jié)構(gòu),可以加快從表中檢索行的速度。索引包含由表中的一列或多列生成的鍵。這些鍵存儲(chǔ)在一個(gè)結(jié)構(gòu)中,使 SQL Server 可以快速有效地查找與鍵值關(guān)聯(lián)的行。
hold說法:索引說白了就是Balanced Tree(簡稱B樹)結(jié)構(gòu),多層次、自維護(hù),節(jié)點(diǎn)存放表的數(shù)據(jù)標(biāo)識(shí)信息,如果表中的一條記錄在磁盤上占用500字節(jié)的話,我們對其中10字節(jié)的一個(gè)字段建立索引,那么該記錄對應(yīng)的索引塊的大小只有10字節(jié)。這樣檢索IO訪問量要少的多。
索引的分類
一般說法:聚集索引與非聚集索引
hold說法:聚集索引、非聚集索引、唯一索引、包含性列索引、索引視圖、全文索引、XML索引
說下聚集索引與非聚集索引的區(qū)別
一般說法:聚集索引是基于記錄內(nèi)容在數(shù)據(jù)表內(nèi)的排序和存儲(chǔ)。非聚集索引不會(huì)為數(shù)據(jù)表的數(shù)據(jù)進(jìn)行物理上排序,只是將索引建立在索引頁上,在查詢數(shù)據(jù)時(shí)一樣可以從索引中找到記錄存放的位置。
hold說法:聚集索引根據(jù)數(shù)據(jù)行的鍵值在表中排序和存儲(chǔ)這些數(shù)據(jù)行。索引定義中包含聚集索引列。每個(gè)表只能有一個(gè)聚集索引,因?yàn)閿?shù)據(jù)行本身只能按一個(gè)順序排序。只有當(dāng)表包含聚集索引時(shí),表中的數(shù)據(jù)行才按排序順序存儲(chǔ)。如果表具有聚集索引,則該表稱為聚集表。如果表沒有聚集索引,則其數(shù)據(jù)行存儲(chǔ)在一個(gè)稱為堆的無序結(jié)構(gòu)中。
非聚集索引具有獨(dú)立于數(shù)據(jù)行的結(jié)構(gòu)。非聚集索引包含非聚集索引鍵值,并且每個(gè)鍵值項(xiàng)都有指向包含該鍵值的數(shù)據(jù)行的指針。從非聚集索引中的索引行指向數(shù)據(jù)行的指針稱為行定位器。行定位器的結(jié)構(gòu)取決于數(shù)據(jù)頁是存儲(chǔ)在堆中還是聚集表中。對于堆,行定位器是指向行的指針。對于聚集表,行定位器是聚集索引鍵。
一張表中可以建立幾個(gè)聚集索引和非聚集索引
一般說法:1個(gè)聚集索引和249個(gè)非聚集索引
hold說法:冷哼一聲、笑而不語。
索引的設(shè)計(jì)原則
一般說法:表增刪改操作多的少用索引 查操作多的適當(dāng)建立索引
hold說法:
1.大量的索引會(huì)影響DML語句的性能;
2. 對小表進(jìn)行索引可能不會(huì)產(chǎn)生優(yōu)化效果;
3.對經(jīng)常用于查詢中的謂詞和連接列創(chuàng)建非聚集索引;
4.覆蓋索引可以提高查詢性能;
5.聚集索引,最好保持較短的索引鍵;
6.考慮對定義完善的的列使用篩選索引;
7.如果索引包含多個(gè)列 ,應(yīng)考慮列的順序;
進(jìn)階知識(shí)(可以用來調(diào)戲面試官)
創(chuàng)建索引的限制
每個(gè)索引最多16個(gè)鍵列;
索引鍵最長900字節(jié);
大型對象數(shù)據(jù)類型不能作為索引鍵列;
唯一索引:唯一索引確保索引鍵不包含重復(fù)的值,因此,表或視圖中的每一行在某種程度上是唯一的。聚集索引和非聚集索引都可以是唯一索引。
設(shè)計(jì)原則:
唯一索引能夠保證索引鍵中不包含重復(fù)的值,從而使表中的每一行從某種方式上具有唯一性。只有當(dāng)唯一性是數(shù)據(jù)本身的特征時(shí),指定唯一索引才有意義。例如,如果您希望確保 HumanResources.Employee 表的 NationalIDNumber 列中的值唯一,當(dāng)主鍵為 EmployeeID 時(shí),可以為 NationalIDNumber 列創(chuàng)建一個(gè) UNIQUE 約束。如果用戶嘗試在該列中為多個(gè)雇員輸入相同的值,將顯示錯(cuò)誤消息并且不能輸入重復(fù)的值。
唯一索引能夠確保定義的列的數(shù)據(jù)完整性并提供了對查詢優(yōu)化器有用的附加信息。
包含性列索引:一種非聚集索引,它擴(kuò)展后不僅包含鍵列,還包含非鍵列。
設(shè)計(jì)原則:
重新設(shè)計(jì)索引鍵大小較大的非聚集索引,以便只有用于搜索和查找的列為鍵列。將覆蓋查詢的所有其他列設(shè)置為包含性非鍵列。這樣,將具有覆蓋查詢所需的所有列,但索引鍵本身較小,而且效率高。
USE AdventureWorks; GO SELECT AddressLine1, AddressLine2, City, StateProvinceID, PostalCode FROM Person.Address WHERE PostalCode BETWEEN N'98000' and N'99999';
若要覆蓋查詢,必須在索引中定義每列。盡管可以將所有列定義為鍵列,但鍵大小為 334 字節(jié)。因?yàn)閷?shí)際上用作搜索條件的唯一列是 PostalCode 列(長度為 30 字節(jié)),所以更好的索引設(shè)計(jì)應(yīng)該將 PostalCode 定義為鍵列并包含作為非鍵列的所有其他列。
USE AdventureWorks; GO CREATE INDEX IX_Address_PostalCode ON Person.Address (PostalCode) INCLUDE (AddressLine1, AddressLine2, City, StateProvinceID);
索引視圖:視圖的索引將具體化(執(zhí)行)視圖,并將結(jié)果集永久存儲(chǔ)在唯一的聚集索引中,而且其存儲(chǔ)方法與帶聚集索引的表的存儲(chǔ)方法相同。創(chuàng)建聚集索引后,可以為視圖添加非聚集索引。
設(shè)計(jì)原則:對視圖創(chuàng)建索引的另一個(gè)好處是:優(yōu)化器可以在未直接在 FROM 子句中指定某一視圖的查詢中使用該視圖的索引。這樣一來,可從索引視圖檢索數(shù)據(jù)而無需重新編碼,由此帶來的高效率也使現(xiàn)有查詢獲益。
索引視圖可以提高下列查詢類型的性能:1.處理大量行的聯(lián)接和聚合。2.許多查詢經(jīng)常執(zhí)行的聯(lián)接和聚合操作。 3.決策支持工作負(fù)荷。
全文索引:這個(gè)蟲子以后會(huì)單獨(dú)開全文檢索章節(jié)來講
XML:xml 數(shù)據(jù)類型列中 XML 二進(jìn)制大型對象 (BLOB) 的已拆分持久表示形式。XML實(shí)例的最大數(shù)據(jù)量可以達(dá)到2GB,如果在沒有索引的xml字段里查詢會(huì)很
耗時(shí),在XML字段上創(chuàng)建的索引就是xml索引。
設(shè)計(jì)原則:主 XML 索引,輔助 XML 索引。xml 類型列的第一個(gè)索引必須是主 XML 索引。使用主 XML 索引時(shí),支持三種類型的輔助索引。這些類型包括 PATH、VALUE 和 PROPERTY。根據(jù)查詢類型的不同,這些輔助索引可能有助于改善查詢性能。
提高篇(和面試無關(guān)了)
索引優(yōu)化
無論何時(shí)對基礎(chǔ)數(shù)據(jù)執(zhí)行插入,更新或刪除操作,數(shù)據(jù)庫引擎都會(huì)自動(dòng)維護(hù)索引。這些修改可導(dǎo)致索引中產(chǎn)生碎片;碎片非常多的索引可能會(huì)降低查詢性能,導(dǎo)致應(yīng)用程序響應(yīng)緩慢。
1.定期整理索引;
2.設(shè)置索引并行度;
3.分析TRACE數(shù)據(jù),調(diào)整索引;
聚集表、堆和索引
聚集表是有聚集索引的表。數(shù)據(jù)行基于聚集索引鍵按順序存儲(chǔ)。聚集索引按 B 樹索引結(jié)構(gòu)實(shí)現(xiàn),B 樹索引結(jié)構(gòu)支持基于聚集索引鍵值對行進(jìn)行快速檢索。索引中每個(gè)級(jí)別的頁(包括葉級(jí)別的數(shù)據(jù)頁)鏈接在一個(gè)雙向鏈接的列表中。但是,通過使用鍵值來執(zhí)行從一個(gè)級(jí)別到另一級(jí)別的導(dǎo)航。
堆是沒有聚集索引的表。數(shù)據(jù)行不按任何特殊的順序存儲(chǔ),數(shù)據(jù)頁也沒有任何特殊的順序。數(shù)據(jù)頁不在鏈接列表內(nèi)鏈接。
菜鳥如何有效的創(chuàng)建索引
前提是你有線上服務(wù)器的權(quán)限 -___-
首先打開SQL Server Profiler新建一個(gè)跟蹤

根據(jù)自己選擇針對性選擇屬性

運(yùn)行一段時(shí)間保存跟蹤文本

打開優(yōu)化引擎

根據(jù)自己需求設(shè)置

分析并根據(jù)系統(tǒng)的建議進(jìn)行優(yōu)化

因?yàn)橄x子跑的本地環(huán)境 下面的步驟就不截圖了 你們都懂的
和索引關(guān)聯(lián)的存儲(chǔ)過程
sp_helpindex報(bào)告有關(guān)表或視圖上索引的信息。
exec sp_helpindex 'PPS_App_Infomation'

根據(jù)sys.indexes視圖來查看索引信息
select * from sys.indexes

至于索引增刪查改的語法網(wǎng)上一搜一片的 就不造輪子了 關(guān)于索引還有很多高級(jí)應(yīng)用例如 虛擬列索引、選擇索引等等 不過大家未必感興趣 實(shí)用才是王道 如果有人對這些感興趣可以留言討論
客串答案
是不是網(wǎng)上也沒找到想要的答案 O(∩_∩)O
1.虛函數(shù)重寫是運(yùn)行時(shí)的多態(tài) 派生類的覆蓋是隱藏基類的方法
2.using的dispose原理和try catch的finally是一樣的
很多程序員會(huì)抱怨別人和自己同樣的工齡 為什么別人的薪水那么高 也有很多程序員覺得自己牛氣沖天 只是沒遇到伯樂 其實(shí)當(dāng)自己不淡定的時(shí)候 不如回頭看看 重頭學(xué)一遍 或許自己的觀點(diǎn)會(huì)改變很多
希望本篇對大家?guī)椭?大家的支持才是蟲子的動(dòng)力 -____-
![]() |
原創(chuàng)作品允許轉(zhuǎn)載,轉(zhuǎn)載時(shí)請務(wù)必以超鏈接形式標(biāo)明文章原始出處以及作者信息。 作者:熬夜的蟲子 點(diǎn)擊查看:博文索引 |

浙公網(wǎng)安備 33010602011771號(hào)