我踩過的聽過的那些坑

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

所以,我打算寫篇文章來回答他在文檔裏提的一些問題,我以爲,這些問題對於想從事DBA工做的都有必定的借鑑意義,本人水平有限,若是回答不正確,歡迎各位留言幫我一塊兒修正,謝謝你們!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)

    答:不該該在條件裏使用表達式,應該作以下修改:ide

    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)》須要的童鞋能夠站內短信聯繫(發現本身能夠用微雲分享,現已經加上連接),因爲文件太大,不能上傳到博客園文件,我會發到你郵箱。sqlserver

對於上述加粗的問題,你們若有更好的回答,歡迎幫我一塊兒修正。性能

讓咱們一塊兒繼續前行! 測試

相關文章
相關標籤/搜索