我踩过的听过的那些坑

来源:互联网 发布:剑网三李白脸型数据 编辑:程序博客网 时间:2024/04/28 17:29

题目是黄钊吉大牛出的, 答案的自己写的。

1.SQL Server 最小存储单元是什么?多大?再上一层存储单元是什么?多大?

答:SQL Server最小的存储单位是页(Page),一个页的大小是8K=8192字节。页头的大小是固定的96个字节,所以剩下8192-96=8096个字节用于存储数据行和行偏移矩阵。再上一层的存储单元是:区。区是管理空间的基本单位。一个区是八个物理上连续的页(即 64 KB)。

2.堆表和非堆表的本质区别?

堆表无序,非堆表有序(有聚集索引)。

3.SQL Server目前有多少种高可用技术?分别是什么?

镜像、复制订阅、快照、日志分发、故障转移集群、Alwasyon。

4.SQL Server有多少种索引?尽可能列出来。

聚集索引、非聚集索引、唯一索引、包含索引、过滤索引、列聚集索引。

5.SQL Server有多少个系统库?

master, model, msdb, tempdb, resource

6.如果一个报表存储过程很慢,你的思路是什么?

--1. 先标记时间, 查出哪里慢, 是否有堵塞;

--2. 用工具测试看下服务器的IO是否正常;

--3. 对于复杂的多表查询, 改为分步骤查询, 中间用临时表缓存数据;

--4. 观察执行计划,看是否需要添加索引。


7.图形化执行计划阅读顺序?

从右到左, 从下到上

8.怎么在SSMS中得知某个SQL语句的物理读、逻辑读次数?

SET STATISTICS IO ON

9.Profiler/SQL Trace和Extent Event相比,在过滤数据的行为上有什么不同?

扩展事件更高效,对服务器影响较小。

10.有下面一个表:
CREATE TABLE T(ID Int identity(1,1),aqty int,bqty int)
大概数据如下:
1 1 2
2 2 3
3 2 1
4 3 5
....


假设数据有几百万,现在有个语句很慢:
SELECT ID
FROM T
WHERE aqty>bqty
列上已经有索引,你能想到root cause是什么?你会怎么优化?

两个列进行比较, 原来的索引起不了作用。

优化:增加计算列,并在计算列上加索引。

alter table T add compare  AS case when aqty>bqty then 1 when aqty=bqty then 0 else -1 end


11.你觉得为什么跨服务器多表关联查询时“可能”性能很差?你能想到哪些可以提升跨服务器查询时性能低下的方法?

一是网络传输影响, 二是执行计划不准确。

优化:不大的表, 先传过来再进行查询。或者只取需要的数据传过来再查询。


12.如何清空有外键的表的数据?

先禁用外键依赖,再truncate table

13.LDF暴增怎么办?你先查哪个DMV?

先备份、收缩日志。sys.dm_db_log_space_usage

14.如果某个JOB的所有者是sa,能不能禁用sa?

可以。 这一步在 sqlserver2014上亲自试验过了。

15.SSMS修改一个表的一列的数据类型 ,与用T-SQL实现ALTER TABLE 的底层实现区别在哪? 

ssms在图形界面直接修改列类型, 会重新建立表再将数据插入, 而语句则不会。

16.UNION 和UNION ALL从性能上的区别是什么?

union 有去重的消耗, 而 union all 没有。

17.初始安装SQL Server 2008及其以上版本时,SQL Server默认是什么启动账号?

network service

18.不在域中的两台服务器做数据库镜像,与在域环境相比,必不可少的一个操作是什么?

设置host文件。

19.事务复制对表最起码有哪个硬性要求?

表必须有主键!

20.你能不能猜到什么结果?为什么?
DECLARE @demo VARCHAR


SET @demo = '你猜猜会怎样?'


SELECT @demo


一片空白, 因为 varchar 不指定长度, 默认长度为1个字节


21. 怎么优化这段代码?
USE AdventureWorks2014  --AdventureWorks均可不一定是2014
GO
DECLARE @date DATE = '2013-09-30'
SELECT SalesOrderID,
SalesOrderDetailID,
ModifiedDate
FROM Sales.SalesOrderDetail
WHERE CONVERT(VARCHAR(20), ModifiedDate, 23) = CONVERT(VARCHAR(20), @date, 23)
不应该在where 左边使用表达式。改为:WHERE ModifiedDate= CONVERT(datetime, @date)

22.十万左右的数据要作为临时数据,你用临时表还是表变量?大概说说理由。

用临时表, 而不是表变量。因为临时表可以用索引, 可以使用统计信息来优化。


入职后大概工作:
1. 完成大概5~8份文档,所以你需要有一定的文档编写水平。
2. 协助我完成数据库源代码管控任务。
3. 逐步接手目前为止8台服务器大概60个数据库,目前只用了事务复制(这个最重要,因为我今年7月要休陪产假,你接不起常规管理到时就搞死我)
常规管理包含但可能不仅限于:
1. 备份还原
2. 处理复制问题(不会的找X东大牛)
3. 初中级T-SQL优化
4. 数据库日常监控


4. 一年之内逐步读完这些书,不好意思,我没有中文版,也不会翻译好然后给你读
《Training Kit (Exam 70-461)》
《Training Kit (Exam 70-462)》
《Microsoft SQL Server 2008 Internals》
《microsoft_sql_server_2012_security_cookbook》
《Syngress.Securing.SQL.Server.Feb.2011》
《Troubleshooting Performance Problems in SQL Server 2008》
5. 协助我实现SQL Server运维自动化,但是目前我还没有想法,只知道要做。
6. 能满足的以后还有机会做你想做的事情。



0 0