我踩過的聽過的那些坑


從去年4月到現在的開博以來,我寫了不少關於MS SQL的文章,感覺自己對MS SQL越來越了解,今天下午在一個SQL Server的技術群文檔看到了一個文檔,是黃釗吉上傳的,我對他的印象,總覺得他是MS SQL的大牛,不管是從他的博客,還是出版的《 數據庫技術叢書:SQL Server性能優化與管理的藝術》。前段時間看他在群里招人,是以師帶徒的形式,估計是升職,或者自己要請假一段時間,找個靠譜的助手。看了下自己對MS SQL的了解,還是覺得不能太勝任。這事也就隨着群里聊天記錄的不斷刷屏慢慢淡忘了。今天在群里翻看了下群文件,發現了"我踩過的聽過的那些坑.txt"文檔,我看了下,對自己蠻有啟發的。

因此,我打算寫篇文章來回答他在文檔里提的一些問題,我覺得,這些問題對於想從事DBA工作的都有一定的借鑒意義,本人水平有限,如果回答不正確,歡迎各位留言幫我一起修正,謝謝大家!

  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. 十萬左右的數據要作為臨時數據,你用臨時表還是表變量?大概說說理由。
    答:使用臨時表,臨時表上可以建立索引,可以使用統計信息來優化
  23. 入職后大概工作:

《Training Kit (Exam 70-461)》和《Training Kit (Exam 70-462)》需要的童鞋可以站內短信聯系(發現自己可以用微雲分享,現已經加上鏈接),由於文件太大,不能上傳到博客園文件,我會發到你郵箱。

對於上述加粗的問題,大家如有更好的回答,歡迎幫我一起修正。

讓我們一起繼續前行!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM