內容介紹
本書全面深入地介紹了Microsoft SQL Server 2008中高級T-SQL查詢、性能最佳化等方面的內容,以及SQL Server 2008新增加的一些特性。主要內容包括SQL的基礎理論、查詢最佳化、查詢算法及複雜度,以及在使用子查詢、表表達式、排名函式、數據聚合和透視轉換、TOP和APPLY、數據修改、分區表、特殊數據結構等實際套用時會遇到的各種高級查詢問題和解決方案。作為一本講述T-SQL高級查詢的專業圖書,本書旨在結合實踐中的各種常見問題,教讀者如何用SQL作為語言工具來思考問題,揭示基於集合查詢的強大威力。本書內容豐富、文字簡潔明快,列舉的實例具有一定的難度,而且實用性很強,可以把它們作為解決實際問題的標準模式。閱讀本書,可以充分地理解T-SQL語言和良好的編程實踐,學會如何編寫更加有效而強大的查詢語句。
本書適合有經驗的程式設計師和DBA閱讀,是在SQL Server 2008中編寫和最佳化SQL查詢的必備參考圖書。
作者介紹
Itzik Ben-GanItzik Ben-Gan是Solid Quality Mentors的首席顧問和創始人。他從1999年以來一直是SQL Server方面的Microsoft MVP(最有價值的專業人員)。Itzik在世界各地從事T-SQL查詢、查詢最佳化和編程相關的培訓工作。Itzik是幾本關於T-SQL圖書的作者。他為SQL Server Magazine和MSDN撰寫過很多文章,在許多業界的專題會議上發表演講,包括Tech Ed、DevWeek、PASS和SQL Server Magazine Connections。
Lubor Kollar
Lubor Kollar 是微軟公司的集團項目經理(Group Program Manager)。從1996年以來,他一直從事SQL Server的開發組織。在加入微軟之前,他在IBM開發過各種DB2引擎。目前,Lubor正在領導SQL Server Customer Advisory Team(SQL CAT)從事世界範圍內最具挑戰性的SQL Server開發。SQL CAT負責維持客戶和SQL Server新版本發行之間的密切聯繫。SQL CAT的另一個主要目標是傳播從最先進的SQL Server開發中學習到的智慧。公眾接觸SQL CAT的一個主要渠道是Web網站www.sqlcat.com。
Dejan Sarka
Dejan Sarka主要從事資料庫和商業智慧型套用方面的開發。除了做項目,他把大約一半的時間都用於教學和諮詢工作。他經常在一些最重要的國際會議上發表演講,包括PASS、TechEd和SqlDevCon。他也是微軟一些區域性事件中不可或缺的人物,例如NT Conference(微軟在中東歐最大的會議)。他是Slovenian SQL Server和.NET User Group的創始人。Dejan是7本關於資料庫和SQL Server圖書的主要作者、合著者或客串作者。 Dejan也講授Solid Quality learning的兩門課程:Data Modeling Essentials 和 Data Mining with SQL Server 2008。
Steve Kass
Steve Kass是University of Wisconsin 大學畢業的數學專業的博士,目前是Drew University大學數學系和計算機系的教授,從1988年以來一直從事教學。他於2002年成為SQL Server Microsoft MVP,為SQL Server Magazine撰寫文章,在SQL Server Magazine Connections上發表演講,是New York City區域的用戶組成員。Steve已經在Complex Systems 和 the Journal of Algebra上發表過一些數學論文。
作品目錄
目錄Table of Contents
序言 I
致謝 III
前言 V
第1章邏輯查詢處理 1
1.1邏輯查詢處理的各個階段 2
1.1.1邏輯查詢處理階段簡介 2
1.2客戶/訂單場景下的查詢示例 4
1.3邏輯查詢處理階段詳解 5
1.3.1步驟1:FROM階段 5
1.3.2步驟2:WHERE階段 9
1.3.3步驟3:GROUP BY階段 10
1.3.4步驟4:HAVING階段 11
1.3.5步驟5:SELECT階段 12
1.3.6步驟6:排序用的ORDER BY階段 13
1.4邏輯查詢處理的深入內容 16
1.4.1表運算符 16
1.4.2OVER子句 23
1.4.3集合運算符 25
1.5總結 26
第2章集合論和謂詞邏輯 27
2.1自然語言表述到數學表示的轉換 27
2.1.1嚴格定義(well-Definedness) 28
2.1.2相等、恆等和同一性 30
2.1.3數學命名約定 30
2.1.4數字 31
2.1.5上下文 32
2.1.6函式、參數和變數 33
2.1.7指令和算法 34
2.2集合論 34
2.2.1集合的標記方法 35
2.2.2集合的嚴格定義 36
2.2.3論域 36
2.2.4真實性 38
2.2.5羅素悖論(Russell’s Paradox) 40
2.2.6有序對、元組和笛卡爾積 41
2.2.7空集 42
2.2.8集合的特徵函式 43
2.2.9集合的基數(Cardinality) 43
2.2.10順序 44
2.2.11集合運算符 47
2.2.12集合的劃分(Partition) 49
2.2.13集合論的推廣 50
2.3謂詞邏輯 50
2.3.1程式語言中的邏輯功能 50
2.3.2命題和謂詞 51
2.3.3排中律 53
2.3.4與、或、非運算 53
2.3.5邏輯等價 55
2.3.6邏輯蘊含 55
2.3.7量化(Quantification) 56
2.3.8替代和推廣 58
2.4關係 59
2.4.1自反性、對稱性和傳遞性 59
2.5一個實際的套用 60
2.6總結 63
第3章關係模型 65
3.1關係模型簡介 65
3.1.1關係、元組和類型 65
3.1.2關係模型:快速摘要 70
3.2關係代數和關係計算 70
3.2.1基本運算符 71
3.2.2關係代數 71
3.2.3關係演算 79
3.2.4T-SQL支持 80
3.3數據完整性 81
3.3.1聲明式約束 82
3.3.2實施完整性的其他方法 84
3.4資料庫正規化和其他設計主題 86
3.4.1解決函式依賴的範式 87
3.4.2更高級的範式 92
3.4.3反規範化(Denormalization) 95
3.4.4一般化和特殊化 96
3.5總結 98
第4章查詢最佳化 99
4.1本章用到的樣本數據 99
4.2最佳化方法論 102
4.2.1分析實例級別的等待 104
4.2.2關聯等待和佇列 111
4.2.3確定行動方案 112
4.2.4細化到資料庫/檔案級別 113
4.2.5細化到進程級別 115
4.2.6最佳化索引和查詢 132
4.3查詢最佳化的工具 133
4.3.1查詢執行計畫的快取 133
4.3.2清空快取 134
4.3.3動態管理對象 134
4.3.4STATISTICS IO 135
4.3.5測量查詢的運行時間 135
4.3.6分析執行計畫 136
4.3.7提示(Hint) 144
4.3.8跟蹤/Profiler 145
4.3.9資料庫引擎最佳化顧問 145
4.3.10數據收集和管理數據倉庫 146
4.3.11使用SMO來複製統計信息 146
4.4索引最佳化 146
4.4.1表和索引的結構 146
4.4.2索引訪問方法 153
4.4.3索引策略的分析 191
4.4.4碎片 200
4.4.5分區 201
4.5準備樣本數據 202
4.5.1數據準備 202
4.5.2TABLESAMPLE 206
4.6基於集合的方法和疊代/過程方法的比較,以及一個最佳化練習 208
4.7總結 214
第5章算法和複雜性 215
5.0.1你有一個1夸特的硬幣嗎? 215
5.1如何度量算法(How Algorithms Scale) 217
5.1.1二次縮放(Quadratic Scaling)的一個例子 217
5.1.2具有線性複雜度的算法 218
5.1.3指數和超指數複雜度 218
5.1.4次線性(sublinear)複雜度 219
5.1.5常量複雜度 219
5.1.6複雜度的技術定義 220
5.1.7複雜度的比較 221
5.2經典算法和算法策略 222
5.2.1排序算法 223
5.2.2字元串查找 225
5.3一個實際的應用程式 226
5.3.1識別測量數據的趨勢 226
5.3.2LISLP算法的複雜度 226
5.3.3用T-SQL解決最長上升子序列的長度問題 227
5.4總結 229
第6章子查詢、表表達式和排名函式 231
6.1子查詢 232
6.1.1獨立子查詢 232
6.1.2相關子查詢 235
6.1.3行為不當的子查詢 244
6.1.4不常用的謂詞 245
6.2表表達式(Table Expressions) 246
6.2.1派生表 247
6.2.2公用表表達式 249
6.3分析排名函式 255
6.3.1行號 257
6.3.2排名和密集排名(Dense Rank) 271
6.3.3組號(Tile Number) 272
6.4數字輔助表 276
6.5缺失範圍和現有範圍(也稱為間斷和孤島) 279
6.5.1缺失範圍(間斷) 281
6.5.2現有範圍(孤島) 288
6.6總結 296
第7章聯接和集合運算 297
7.1聯接 297
7.1.1舊語法和新語法 297
7.1.2基本聯接類型 298
7.1.3其他的聯接分類 306
7.1.4上一年度的滑動合計 317
7.1.5聯接算法 320
7.1.6拆分元素 326
7.2集合運算 332
7.2.1UNION 332
7.2.2EXCEPT 333
7.2.3INTERSECT 334
7.2.4集合運算的優先權 335
7.2.5在集合運算中使用INTO 336
7.2.6避開不支持的邏輯階段 336
7.3總結 338
第8章數據聚合和透視 339
8.1OVER 子句 339
8.2決勝屬性(Tiebreaker) 341
8.3連續聚合 343
8.3.1累積聚合(Cumulative Aggregation) 344
8.3.2滑動聚合(Sliding Aggregation) 348
8.3.3年初至今(YTD) 349
8.4透視轉換(Pivoting) 350
8.4.1透視轉換屬性 350
8.4.2關係除法 353
8.4.3聚合數據 355
8.5逆透視轉換 357
8.6自定義聚合 360
8.6.1使用透視轉換的自定義聚合 361
8.6.2用戶定義聚合函式(UDA,User Defined Aggregate) 362
8.6.3專用解決方案 370
8.7直方圖(Histogram) 380
8.8分組因子 383
8.9分組集 385
8.9.1樣例數據 386
8.9.2GROUPING SETS從屬子句 387
8.9.3CUBE從屬子句 389
8.9.4ROLLUP從屬子句 390
8.9.5分組集代數 392
8.9.6GROUPING_ID函式 395
8.9.7保存分組集 397
8.9.8排序 399
8.10總結 400
第9章TOP和APPLY 401
9.1SELECT TOP 401
9.1.1TOP和確定性 402
9.1.2TOP和輸入表達式 403
9.1.3TOP和修改 404
9.1.4增強的TOP 406
9.2APPLY 407
9.3使用TOP和APPLY解決常見問題 408
9.3.1每組中的TOP n 408
9.3.2匹配當前值和前一個值 413
9.3.3分頁 416
9.3.4隨機行 419
9.3.5中值(Median) 421
9.4邏輯轉換 422
9.5總結 424
第10章數據修改 425
10.1插入數據 425
10.1.1增強的VALUES子句 425
10.1.2SELECT INTO 426
10.1.3BULK行集提供程式 428
10.1.4按最小方式記錄日誌的操作 430
10.1.5INSERT EXEC 447
10.1.6序列機制 450
10.1.7全局唯一標識符(GUID) 454
10.2刪除數據 454
10.2.1TRUNCATE與DELETE 454
10.2.2刪除包含重複數據的行 455
10.2.3基於聯接的DELETE 456
10.3更新數據 458
10.3.1基於聯接的UPDATE 458
10.3.2更新大值數據類型 461
10.3.3用SELECT和UPDATE語句進行賦值 462
10.4合併數據 465
10.4.1MERGE語句基礎 467
10.4.2額外增加一個謂詞 470
10.4.3多個WHEN子句 471
10.4.4WHEN NOT MATCHED BY SOURCE子句 472
10.4.5MERGE Values 473
10.4.6MERGE與觸發器 474
10.5OUTPUT子句 475
10.5.1帶有OUTPUT的INSERT 476
10.5.2帶有OUTPUT的DELETE 477
10.5.3帶有OUTPUT的UPDATE 478
10.5.4帶有OUTPUT的MERGE 480
10.5.5可組合的DML 481
10.6總結 482
第11章查詢分區表 483
11.1在SQL Server中進行分區 483
11.1.1分區視圖 483
11.1.2分區表 484
11.2總結 496
第12章圖、樹、層次結構和遞歸查詢 497
12.1術語 497
12.1.1圖 497
12.1.2樹 498
12.1.3層次結構 498
12.2套用場景 498
12.2.1員工組織圖 498
12.2.2材料清單(BOM) 500
12.2.3道路系統 502
12.3疊代/遞歸 505
12.3.1下屬 505
12.3.2祖先 513
12.3.3帶有路徑枚舉的子圖/子樹 516
12.3.4排序 518
12.3.5環 520
12.4具體化路徑 523
12.4.1維護數據 523
12.4.2查詢 527
12.5使用HIERARCHYID數據類型的具體化路徑 531
12.5.1維護數據 532
12.5.2查詢 537
12.5.3使用HIERARCHYID的其他方面 540
12.6嵌套集合 548
12.6.1分配左值和右值 549
12.6.2查詢 553
12.7傳遞閉包(Transitive Closure) 555
12.7.1有向無環圖 555
12.7.2無向有環圖 559
12.8總結 566
索引 567