從去年4月到現在的開博以來,我寫了不少關於MS SQL的文章,感覺自己對MS SQL越來越了解,今天下午在一個SQL Server的技術群文檔看到了一個文檔,是黃釗吉上傳的,我對他的印象,總覺得他是MS SQL的大牛,不管是從他的博客,還是出版的《 數據庫技術叢書:SQL Server性能優化與管理的藝術》。前段時間看他在群里招人,是以師帶徒的形式,估計是升職,或者自己要請假一段時間,找個靠譜的助手。看了下自己對MS SQL的了解,還是覺得不能太勝任。這事也就隨着群里聊天記錄的不斷刷屏慢慢淡忘了。今天在群里翻看了下群文件,發現了"我踩過的聽過的那些坑.txt"文檔,我看了下,對自己蠻有啟發的。
因此,我打算寫篇文章來回答他在文檔里提的一些問題,我覺得,這些問題對於想從事DBA工作的都有一定的借鑒意義,本人水平有限,如果回答不正確,歡迎各位留言幫我一起修正,謝謝大家!
- SQL Server 最小存儲單元是什么?多大?再上一層存儲單元是什么?多大?
答:頁或page,8kb大小,上一層是區,一個區有8個頁,共64k。 - 堆表和非堆表的本質區別?
答:堆表沒有聚集索引,非堆表有,看具體情況,可以是聚集索引和非聚集索引。 - SQL Server目前有多少種高可用技術?分別是什么?
答:這個不是很清楚,目前只知道公司現在服務器在用的群集技術,有2個節點,允許一台服務器當機,另一台服務器會自動繼續服務。 - SQL Server有多少種索引?盡可能列出來。
答:總的有聚集索引和非聚集索引,另外有覆蓋索引和過濾索引。聚集索引和非聚集索引都是B樹結果,區別是聚集索引的葉子節點保存的是表的聚集鍵,非聚集索引根據所在表的不同,如果在聚集表(表里已經有一個聚集索引),則頁子節點保存的是指向聚集索引的聚集鍵,如果在堆表(沒有索引),則葉子節點保存的是RID(即文件號:頁號:槽號)。覆蓋索引是非聚集索引的葉子節點也保存了要查詢的列,可以用來避免書簽查找。過濾索引包含條件的索引,這些索引只針對符合條件的數據進行建立,可以針對命中這些條件的記錄提高查詢效率。 - SQL Server有多少個系統庫?
答:4個,mater,model,msdb,tempdb。
其實還有兩個系統數據庫,一個是Resource Database,另一個是distribution(建了復制才有)。(感謝FishParadise完善) - 如果一個報表存儲過程很慢,你的思路是什么?
答:看下執行計划,看看是不是缺少索引,還是統計信息過期,還是具體的查詢語句問題。 - 圖形化執行計划閱讀順序?
答:從右到左,從下到上。 - 怎么在SSMS中得知某個SQL語句的物理讀、邏輯讀次數?
答:可以使用SET STATISTICS IO ON。 - Profiler/SQL Trace和Extent Event相比,在過濾數據的行為上有什么不同?
答:目前只了解過Profile,可以用它來跟蹤SQL語句,區別不知道。 - 有下面一個表:
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完善) - 你覺得為什么跨服務器多表關聯查詢時“可能”性能很差?你能想到哪些可以提升跨服務器查詢時性能低下的方法?
答:暫無思路。
可以參考下分布性查詢或分布性事務,您也許有所發現:)(感謝FishParadise完善) - 如何清空有外鍵的表的數據?
答:可以嘗試取消外鍵約束,再用truncate后加會外鍵約束。 - LDF暴增怎么辦?你先查哪個DMV?
答:可以先進行一次完成備份,收縮下日志;空間允許的情況下,先修改日志文件大小,待收縮后,再還原為原來的大小。sys.dm_db_log_space_usage - 如果某個JOB的所有者是sa,能不能禁用sa?
答:應該不可以吧,除非還有別的管理員賬號。
你可以測試下。如果不行,那么原來用sa創建的job,后來禁用了sa,所有job都不能運行嗎?(感謝FishParadise完善) - SSMS修改一個表的一列的數據類型 ,與用T-SQL實現ALTER TABLE 的底層實現區別在哪?
答:不是很清楚,一般小表用SSMS可以修改成功,大表會提示超時,只能用T-SQL語句來修改。 - UNION 和UNION ALL從性能上的區別是什么?
答:暫無思路。只知道UNION可以踢掉重復的記錄。
補充:如果確認兩個查詢無重復記錄用UNION ALL更好些,不需要去重步驟。(感謝韓慶剛完善。) - 初始安裝SQL Server 2008及其以上版本時,SQL Server默認是什么啟動賬號?
答:應該是network service。 - 不在域中的兩台服務器做數據庫鏡像,與在域環境相比,必不可少的一個操作是什么?
答:設置host文件。(感謝FunLove回答)
必需創建證書。這是鏡像在域或非域中最大的區別。(感謝FishParadise完善) - 事務復制對表最起碼有哪個硬性要求?
答:表必須有主鍵!(感謝davidhou回答) - 你能不能猜到什么結果?為什么?
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。(感謝韓慶剛完善) - 怎么優化這段代碼?
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) - 十萬左右的數據要作為臨時數據,你用臨時表還是表變量?大概說說理由。
答:使用臨時表,臨時表上可以建立索引,可以使用統計信息來優化。 - 入職后大概工作:
- 完成大概5~8份文檔,所以你需要有一定的文檔編寫水平。
- 協助我完成數據庫源代碼管控任務。
- 逐步接手目前為止8台服務器大概60個數據庫,目前只用了事務復制(這個最重要,…………你接不起常規管理到時就搞死我)
- 常規管理包含但可能不僅限於:
- 備份還原
- 處理復制問題(不會的找X東大牛)
- 初中級T-SQL優化
- 數據庫日常監控
- 一年之內逐步讀完這些書,不好意思,我沒有中文版,也不會翻譯好然后給你讀
- 協助我實現SQL Server運維自動化,但是目前我還沒有想法,只知道要做。
- 能滿足的以后還有機會做你想做的事情。
《Training Kit (Exam 70-461)》和《Training Kit (Exam 70-462)》需要的童鞋可以站內短信聯系(發現自己可以用微雲分享,現已經加上鏈接),由於文件太大,不能上傳到博客園文件,我會發到你郵箱。
對於上述加粗的問題,大家如有更好的回答,歡迎幫我一起修正。
讓我們一起繼續前行!
