SQL 管理過程中踩過的那些坑
作者:
https://www.cnblogs.com/woodytu/p/5280838.html
1、SQL Server 最小存儲單元是什麼?多大?再上一層存儲單元是什麼?多大?
答:頁或 page,8kb 大小,上一層是區,一個區有 8 個頁,共 64k。
2、堆表和非堆表的本質區別?
答:堆表沒有聚集索引,非堆表有,看具體情況,可以是聚集索引和非聚集索引。
3、SQL Server 有多少種索引?儘可能列出來。
答:總的有聚集索引和非聚集索引,另外有覆蓋索引和過濾索引。
聚集索引和非聚集索引都是 B 樹結果,區別是聚集索引的葉子節點保存的是表的聚集鍵,非聚集索引根據所在表的不同,如果在聚集表(表裏已經有一個聚集索引),則頁子節點保存的是指向聚集索引的聚集鍵,如果在堆表(沒有索引),則葉子節點保存的是 RID(即文件號:頁號:槽號)。
覆蓋索引是非聚集索引的葉子節點也保存了要查詢的列,可以用來避免書籤查找。過濾索引包含條件的索引,這些索引只針對符合條件的數據進行建立,可以針對命中這些條件的記錄提高查詢效率。
4、SQL Server 有多少個系統庫?
答:4 個,mater,model,msdb,tempdb。
其實還有兩個系統數據庫,一個是 Resource Database,另一個是 distribution(建了複製纔有)。
5、如果一個報表存儲過程很慢,你的思路是什麼?
答:看下執行計劃,看看是不是缺少索引,還是統計信息過期,還是具體的查詢語句問題。
6、圖形化執行計劃閱讀順序?
答:從右到左,從下到上。
7、怎麼在 SSMS 中得知某個 SQL 語句的物理讀、邏輯讀次數?
答:可以使用 SET STATISTICS IO ON。
8、Profiler/SQL Trace 和 Extent Event 相比,在過濾數據的行爲上有什麼不同?
答:目前只瞭解過 Profile,可以用它來跟蹤 SQL 語句,區別不知道。
9、有下面一個表:
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
列上已經有索引,你能想到根本原因是什麼?你會怎麼優化?
答:表掃描。條件無法使用索引,只能一條條的判斷了。而且表掃描也不是最慢的,在有些場景下如果索引和查詢使用的不好會導致性能暴跌,甚至不如表掃描。
10、你覺得爲什麼跨服務器多表關聯查詢時 “可能” 性能很差?你能想到哪些可以提升跨服務器查詢時性能低下的方法?
答:可以參考下分佈性查詢或分佈性事務
11、如何清空有外鍵的表的數據?
答:可以嘗試取消外鍵約束,再用 truncate 後加會外鍵約束。
12、LDF 暴增怎麼辦?你先查哪個 DMV?
答:可以先進行一次完成備份,收縮下日誌;空間允許的情況下,先修改日誌文件大小,待收縮後,再還原爲原來的大小。sys.dm_db_log_space_usage
13、如果某個 JOB 的所有者是 sa,能不能禁用 sa?
答:可以的,禁用 sa 並不會對 JOB 有什麼影響,依然可以正常執行。
**14、SSMS 修改一個表的一列的數據類型 ,與用 T-SQL 實現 ALTER TABLE 的底層實現區別在哪? **
答:一般小表用 SSMS 可以修改成功,大表會提示超時,只能用 T-SQL 語句來修改。
15、UNION 和 UNION ALL 從性能上的區別是什麼?
答:UNION 會去掉重複數據,UNION ALL 不會去掉重複數據,UNION 會消耗更多的資源去查找並去掉重複數據。如果確認兩個查詢無重複記錄用 UNION ALL 更好些, 不需要去重步驟
16、初始安裝 SQL Server 2008 及其以上版本時,SQL Server 默認是什麼啓動賬號?
答:network service。
17、不在域中的兩臺服務器做數據庫鏡像,與在域環境相比,必不可少的一個操作是什麼?
答:設置 host 文件。必需創建證書。這是鏡像在域或非域中最大的區別。
18、事務複製對錶最起碼有哪個硬性要求?
答:表必須有主鍵
19、你能不能猜到什麼結果?爲什麼?
DECLARE @demo VARCHAR
SET @demo = '你猜猜會怎樣?'
SELECT @demo
答:沒有指定 VARCHAR 長度會顯示空白,沒有指定 varchar 長度,默認是長度 1,並不是 0。中文佔兩個字節顯示,如果是下列語句:
DECLARE @demo VARCHAR
SET @demo = '123'
SELECT @demo
會顯示 1。
如果使用的是 NVARCHAR 則默認長度是 2。
20、怎麼優化這段代碼?
USE AdventureWorks
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)
答:不應該在條件裏使用表達式,應該做如下修改:
USE AdventureWorks
GO
DECLARE @date DATE = '2013-09-30'
SELECT SalesOrderID,
SalesOrderDetailID,
ModifiedDate
FROM Sales.SalesOrderDetail
WHERE ModifiedDate = CONVERT(datetime,@date)
21、十萬左右的數據要作爲臨時數據,你用臨時表還是表變量?大概說說理由。
答:使用臨時表,臨時表上可以建立索引,可以使用統計信息來優化。
22、入職後大概工作:
-
完成大概 5~8 份文檔,所以你需要有一定的文檔編寫水平。
-
協助完成數據庫源代碼管控任務。
-
逐步接手目前爲止 8 臺服務器大概 60 個數據庫,目前只用了事務複製
-
常規管理包含但可能不僅限於:
備份還原
處理複製問題
初中級 T-SQL 優化
數據庫日常監控
- 一年之內逐步讀完這些書
《SQL Server 2008 技術內幕:T-SQL 語言基礎》
《SQL Server 2008 技術內幕:T-SQL 查詢》
《SQL Server 2008 企業級平臺管理實踐》
《SQL Server 2008 管理員必備指南》
《SQL Server 2008 查詢性能優化》
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/xXvR7C-Ze6J6jzadd1vXIQ