走向DBA[MSSQL篇] 面试官最喜欢的问题 ----索引+C#面试题客串

原文:走向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 列创建一个 UNIQUE 约束。如果用户尝试在该列中为多个雇员输入相同的值,将显示错误消息并且不能输入重复的值。

唯一索引能够确保定义的列的数据完整性并提供了对查询优化器有用的附加信息。

包含性列索引:一种非聚集索引,它扩展后不仅包含键列,还包含非键列。

设计原则:

重新设计索引键大小较大的非聚集索引,以便只有用于搜索和查找的列为键列。将覆盖查询的所有其他列设置为包含性非键列。这样,将具有覆盖查询所需的所有列,但索引键本身较小,而且效率高。

USE AdventureWorks;
GO
SELECT AddressLine1, AddressLine2, City, StateProvinceID, PostalCode
FROM Person.Address
WHERE PostalCode BETWEEN N'98000' and N'99999';

 若要覆盖查询,必须在索引中定义每列。尽管可以将所有列定义为键列,但键大小为 334 字节。因为实际上用作搜索条件的唯一列是 PostalCode 列(长度为 30 字节),所以更好的索引设计应该将 PostalCode 定义为键列并包含作为非键列的所有其他列。

USE AdventureWorks;
GO
CREATE INDEX IX_Address_PostalCode
ON Person.Address (PostalCode)
INCLUDE (AddressLine1, AddressLine2, City, StateProvinceID);

 索引视图:视图的索引将具体化(执行)视图,并将结果集永久存储在唯一的聚集索引中,而且其存储方法与带聚集索引的表的存储方法相同。创建聚集索引后,可以为视图添加非聚集索引。

设计原则:对视图创建索引的另一个好处是:优化器可以在未直接在 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报告有关表或视图上索引的信息。

exec sp_helpindex 'PPS_App_Infomation'

 

根据sys.indexes视图来查看索引信息

select * from sys.indexes

至于索引增删查改的语法网上一搜一片的 就不造轮子了 关于索引还有很多高级应用例如 虚拟列索引、选择索引等等 不过大家未必感兴趣 实用才是王道 如果有人对这些感兴趣可以留言讨论



 客串答案

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

1.虚函数重写是运行时的多态  派生类的覆盖是隐藏基类的方法

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

很多程序员会抱怨别人和自己同样的工龄 为什么别人的薪水那么高 也有很多程序员觉得自己牛气冲天 只是没遇到伯乐 其实当自己不淡定的时候 不如回头看看 重头学一遍 或许自己的观点会改变很多 



  希望本篇对大家帮助 大家的支持才是虫子的动力 -____-

 

时间: 2025-01-29 11:10:33

走向DBA[MSSQL篇] 面试官最喜欢的问题 ----索引+C#面试题客串的相关文章

走向DBA[MSSQL篇] 针对大表 设计高效的存储过程【原理篇】 附最差性能sql语句进化过程客串

原文:走向DBA[MSSQL篇] 针对大表 设计高效的存储过程[原理篇] 附最差性能sql语句进化过程客串 测试的结果在此处 本篇详解一下原理 设计背景 由于历史原因,线上库环境数据量及其庞大,很多千万级以上甚至过亿的表.目标是让N张互相关联的表 按照一张源表为基表,数据搬移归档 这里我们举例N为50 每张表数据5000W 最差性能sql进化客串 2表KeyName 字段意义 名称等相同 从bug01 表中取出前500条不在bug02 表中的数据 最差性能: SELECT TOP 500 a.K

走向DBA[MSSQL篇] 积跬步行千里

原文:走向DBA[MSSQL篇] 积跬步行千里 不知道大家对SQL系列的感不感兴趣 先在这里探个路 本文针对的读者为SQL菜鸟 欢迎大牛驳论或者补充 既然是探路篇 就先说下数据过滤中的偏门匹配 希望能给大家带来收获 create table 虫子的临时表 ( 编号 varchar(30), 名称 varchar(30), 备注 varchar(100) ) insert into 虫子的临时表 values('编号01','name01','这是一个奇迹') insert into 虫子的临时表

走向DBA[MSSQL篇] 从SQL语句的角度 提高数据库的访问性能

原文:走向DBA[MSSQL篇] 从SQL语句的角度 提高数据库的访问性能 最近公司来一个非常虎的dba  10几年的经验 这里就称之为蔡老师吧 在征得我们蔡老同意的前提下  我们来分享一下蔡老给我们带来的宝贵财富 欢迎其他的dba来拍砖  目录 1.什么是执行计划?执行计划是依赖于什么信息.2. 统一SQL语句的写法减少解析开销3. 减少SQL语句的嵌套4. 使用"临时表"暂存中间结果5. OLTP系统SQL语句必须采用绑定变量6. 倾斜字段的绑定变量窥测问题7. begin tra

分享SEO应聘中如何运筹帷幄虏获面试官的心

    最近笔者所在的公司开始招聘一些SEO职员,笔者在面试这些应聘者发现大多数的应聘者都有出现大同小异的错误,其中最明显的就是很多人都无法真正的抓住SEO工作的重点,结果很难在众多的求职者中脱颖而出虏获面试官的心.下面笔者就站在面试官的角度给SEO求职者几个好的建议,希望能帮助大家找到一个称心的工作. 1:SEO求职简历的书写,做有重心的求职者 SEO与其他行业相比来说更注重的是经验与是否有真实的操作案例,所以作为一名SEO求职者你需要在你的简历上详细的注明之前所在公司的工作内容,包括所接触过

我遇到过的哪些奇葩面试官

这些年,我为了找工作,面试了N家公司,不敢说身经百战,但也算是见惯了血雨腥风,下面这些都是我在面试中总结出来的,给大家参考吧. 在找工作的道路上,有一拨人,他们就像是你通向offer路上的一道道关卡,至于是否能够顺利闯关,则完全取决于你和他(她)的沟通和交流是否顺利,并且拍板权绝对在他们手中!这拨"挖坑好手"团伙有一个共同的名字,那就是:面试官!在人海茫茫的面试官中,奇葩面试官数不胜数!那么,你可能都会碰到哪些奇葩面试官呢?让我来一一道来. 类型一:虚张声势 故意虚张声势,有意制造紧张

面试官最爱的volatile关键字

在Java相关的岗位面试中,很多面试官都喜欢考察面试者对Java并发的了解程度,而以volatile关键字作为一个小的切入点,往往可以一问到底,把Java内存模型(JMM),Java并发编程的一些特性都牵扯出来,深入地话还可以考察JVM底层实现以及操作系统的相关知识. 下面我们以一次假想的面试过程,来深入了解下volitile关键字吧! 面试官: Java并发这块了解的怎么样?说说你对volatile关键字的理解 就我理解的而言,被volatile修饰的共享变量,就具有了以下两点特性: 1 .

seo主管浅谈如何获得面试官青睐四点技巧

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 最近公司在招聘一些seo员工,在面试这些seo应聘者时,发现了一些seo应聘者在应聘时抓不住重点,前来面试的seo人员很多,如何才能在众多的seo应聘者中脱颖而出,获得面试官的青睐呢?今天作为公司seo主管对近期seo应聘者提出几点好的建议,让大家都找到自己心意的工作. 1.简历的书写方式 相信很多面试官最注重的就是一个人的工作经验,所以,在

面试官培训-基础篇

简述 面试的重要性 面试的重要性 面试的原则 电话面试原则 F2F面试原则 如何定位侯选人是否适用 一.深刻理解工作特征和对人才的要求 熟悉招聘岗位的工作内容,组织关系,工作难点,需要的资源和支持.了解该岗位人员必须的技能.知识.经验.背景资源等等, 除了必须的条件外,具有什么个性特征的人更适合做好这份工作?为了更好地把握岗位特征与人才的契合,可对照分析以前从事该岗位人员的特征:什么样的人曾经在此岗位上做得很优秀?什么样的人曾经使人失望? 二.具备招聘岗位所需的专业技术能力 本身具备该岗位所需的

【JAVA秒会技术之秒杀面试官】集合篇(二)

秒杀Java面试官--集合篇(二) 三.HashMap底层实现原理(基于JDK1.8)         面试中,你是否也曾被问过以下问题呢:     你知道HashMap的数据结构吗?HashMap是如何实现存储的?底层采用了什么算法?为什么采用这种算法?如何对HashMap进行优化?如果HashMap的大小超过了负载因子定义的容量,怎么办?等等.     有觉得很难吗?别怕!下面博主就带着大家深度剖析,以源代码为依据,逐一分析,看看HashMap到底是怎么玩的:        ① HashMa