我踩過的聽過的那些坑

吉普賽的歌發表於2017-01-10

題目是黃釗吉大牛出的, 答案的自己寫的。

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. 能滿足的以後還有機會做你想做的事情。



相關文章