首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL 開發必知細節:NULL 值陷阱、連接查詢效能迷思與優化實戰

     編輯:關於SqlServer

一、NULL 值的七大行為差異

建立測試表 testNull(ID, a, b),插入 ('1','') 與 ('2',NULL) 對比:

  1. 運算黑洞:NULL + 1 = NULL,任何運算結果皆為 NULL。
  2. 比較陷阱:WHERE col = NULL 永無結果,必須用 IS NULL / IS NOT NULL。
  3. 統計函數:COUNT(col) 忽略 NULL,COUNT(*) 計列數。需統計含 NULL 列時用 COUNT(ISNULL(col,''))。
  4. IN 子查詢:WHERE col IN (NULL) 會忽略 NULL 列。
  5. 排序順序:ORDER BY col ASC NULL 排最前,DESC 排最後。
  6. GROUP BY:所有 NULL 視為同一群組。
  7. 等值邏輯:NULL = NULL 為 False,只能用 IS 判斷。

二、表連接查詢效能迷思驗證

環境:student 表 999,999 列,classInfo 表 100 列。

三種寫法

  1. 大表在前 INNER JOIN
  2. 小表在前 INNER JOIN
  3. WHERE 隱性連接

執行計畫證據

三者執行計畫完全相同,表順序不影響效能,優化器自動決定最佳連接順序。隱性連接(WHERE)已被標準淘汰,建議統一使用顯性 INNER JOIN。

三、三大連接演算法與適用場景

  1. Nested Loops:外部表小、結果集小(<1萬列)適合。範例:classInfo (100) JOIN course (小)。
  2. Hash Join:大表連接大表,小表建雜湊表在記憶體,掃描大表探測。範例:classInfo (小) JOIN student (大)。TOP 10000 用 Hash Join,加 ORDER BY 轉 Nested Loops,包子查詢可轉回 Hash Join。
  3. Merge Join:雙方已排序時最優,省去排序成本。

結論:INNER JOIN 與 WHERE 效能無差異,關鍵在於統計資訊、索引與查詢模式,優化器自動選擇最佳演算法。

四、實戰建議

  • 善用 SET STATISTICS IO/TIME ON、SHOWPLAN 分析真實成本。
  • 避免 DISTINCT/ORDER BY/GROUP BY 過度使用加重 tempdb 負擔。
  • 大量資料用 SELECT INTO 避免 Log,小量用 CREATE TABLE + INSERT 緩和系統表壓力。
  • 臨時表用畢 TRUNCATE TABLE 後 DROP TABLE,減少系統表鎖定時間。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved