转 - 常见的SQL小问题解答

    1. SQL Server 最小存储单元是什么?多大?再上一层存储单元是什么?多大?
      答:page,8kb大小,上一层是区,一个区有8个页,共64k
    2. 堆表和非堆表的本质区别?
      答:堆表没有聚集索引,非堆表有,看具体情况,可以是聚集索引非聚集索引
    3. SQL Server目前有多少种高可用技术?分别是什么?
      答:这个不是很清楚,目前只知道公司现在服务器在用的群集技术,有2个节点,允许一台服务器当机,另一台服务器会自动继续服务。
    4. SQL Server有多少种索引?尽可能列出来。
      答:总的有聚集索引非聚集索引,另外有覆盖索引和过滤索引。聚集索引和非聚集索引都是B树结果,区别是聚集索引的叶子节点保存的是表的聚集键,非聚集索引根据所在表的不同,如果在聚集表(表里已经有一个聚集索引),则页子节点保存的是指向聚集索引的聚集键,如果在堆表(没有索引),则叶子节点保存的是RID(即文件号:页号:槽号)。覆盖索引是非聚集索引的叶子节点也保存了要查询的列,可以用来避免书签查找。过滤索引包含条件的索引,这些索引只针对符合条件的数据进行建立,可以针对命中这些条件的记录提高查询效率
    5. SQL Server有多少个系统库?
      答:4个,mater,model,msdb,tempdb。
      其实还有两个系统数据库,一个是Resource Database,另一个是distribution(建了复制才有)。(感谢FishParadise完善)
    6. 如果一个报表存储过程很慢,你的思路是什么?
      答:看下执行计划,看看是不是缺少索引,还是统计信息过期,还是具体的查询语句问题。
    7. 图形化执行计划阅读顺序?
      答:从右到左,从下到上。
    8. 怎么在SSMS中得知某个SQL语句的物理读、逻辑读次数?
      答:可以使用SET STATISTICS IO  ON
    9. Profiler/SQL Trace和Extent Event相比,在过滤数据的行为上有什么不同?
      答:目前只了解过Profile,可以用它来跟踪SQL语句,区别不知道。
    10. 有下面一个表:
      1 CREATE TABLE T(ID Int identity(1,1),aqty int,bqty int)
      

      大致数据如下:

      1 1 2
      2 2 3
      3 2 1
      4 3 5
      ....
      假设数据有几百万,现在有个语句很慢:
      1 SELECT ID
      2 FROM T
      3 WHERE aqty>bqty
      

      列上已经有索引,你能想到root cause是什么?你会怎么优化?

      答:表扫描。(感谢韩庆刚完善。)
      补充:这个当然是表扫描,条件无法使用索引,只能一条条的判断了。而且表扫描也不是最慢的,在有些场景下如果索引和查询使用的不好会导致性能暴跌,甚至不如表扫描。(感谢Daniel Cai完善)
    11. 你觉得为什么跨服务器多表关联查询时“可能”性能很差?你能想到哪些可以提升跨服务器查询时性能低下的方法?
      答:暂无思路。
      可以参考下分布性查询或分布性事务,您也许有所发现:)(感谢FishParadise完善)
    12. 如何清空有外键的表的数据?
      答:可以尝试取消外键约束,再用truncate后加会外键约束。
    13. LDF暴增怎么办?你先查哪个DMV?
      答:可以先进行一次完成备份,收缩下日志;空间允许的情况下,先修改日志文件大小,待收缩后,再还原为原来的大小。sys.dm_db_log_space_usage
    14. 如果某个JOB的所有者是sa,能不能禁用sa?
      答:应该不可以吧,除非还有别的管理员账号。
      你可以测试下。如果不行,那么原来用sa创建的job,后来禁用了sa,所有job都不能运行吗?(感谢FishParadise完善)
    15. SSMS修改一个表的一列的数据类型 ,与用T-SQL实现ALTER TABLE 的底层实现区别在哪? 
      答:不是很清楚,一般小表用SSMS可以修改成功,大表会提示超时,只能用T-SQL语句来修改。
    16. UNION 和UNION ALL从性能上的区别是什么?
      答:暂无思路。只知道UNION可以踢掉重复的记录。
      补充:如果确认两个查询无重复记录用UNION ALL更好些,不需要去重步骤。(感谢韩庆刚完善。)
    17. 初始安装SQL Server 2008及其以上版本时,SQL Server默认是什么启动账号?
      答:应该是network service。
    18. 不在域中的两台服务器做数据库镜像,与在域环境相比,必不可少的一个操作是什么?
      答:设置host文件。(感谢FunLove回答)
      必需创建证书。这是镜像在域或非域中最大的区别。(感谢FishParadise完善)
    19. 事务复制对表最起码有哪个硬性要求?
      答:表必须有主键!(感谢davidhou回答)
    20. 你能不能猜到什么结果?为什么?
      1 DECLARE @demo VARCHAR
      2 SET @demo = '你猜猜会怎样?'
      3 SELECT @demo
      

      答:没有指定VARCHAR长度会显示空白,在SSMS里运行的真的是空白。(感谢FunLove回答)
      补充:你没有指定varchar长度,默认是长度1,中文占两个字节,显示?或者乱码,如果是下列语句:

      1 DECLARE @demo VARCHAR
      2 SET @demo = '123' 
      3 select @demo
      

      会显示1。(感谢FunLove回答)
      补充:因为DECLARE @demo VARCHAR没有定义长度,而且存中文更建议用NVARCHAR。(感谢韩庆刚完善)

    21. 怎么优化这段代码?
      复制代码
      1 USE AdventureWorks2014  --AdventureWorks均可不一定是2014
      2 GO
      3 DECLARE @date DATE = '2013-09-30'
      4 SELECT SalesOrderID,
      5     SalesOrderDetailID,
      6     ModifiedDate
      7 FROM Sales.SalesOrderDetail
      8 WHERE CONVERT(VARCHAR(20), ModifiedDate, 23) = CONVERT(VARCHAR(20), @date, 23)
      
      复制代码

      答:不应该在条件里使用表达式,应该做如下修改:

      复制代码
      1 USE AdventureWorks2012  --AdventureWorks均可不一定是2014
      2 GO
      3 DECLARE @date DATE = '2013-09-30'
      4 SELECT SalesOrderID,
      5     SalesOrderDetailID,
      6     ModifiedDate
      7 FROM Sales.SalesOrderDetail
      8 WHERE ModifiedDate = CONVERT(datetime,@date)
      
      复制代码
    22. 十万左右的数据要作为临时数据,你用临时表还是表变量?大概说说理由。
      答:使用临时表,临时表上可以建立索引,可以使用统计信息来优化
posted @ 2018-05-11 15:53  火火火火四火  阅读(50)  评论(0编辑  收藏  举报