数据库技术与应用(SQL Server 2008版)-电子教案.rar
2022-06-27 10:04:41 21.72MB 教学资料
SQL Server 2008网络数据库管理项目教程-电子教案.rar
2022-06-26 11:05:26 21.12MB 教学资料
SQL Server 2008数据库开发经典案例教程-电子教案&习题解答等.rar
2022-06-26 11:05:25 8.79MB 教学资料
SQL Server 2008数据库基础-电子教案.rar
2022-06-26 11:05:25 6.67MB 教学资料
SQL Server 2008 R2数据挖掘与商业智能基础及高级案例实战-案例文件.rar
2022-06-25 14:05:52 2.35MB 教学资料
CruiseYoung提供的带有详细书签的电子书籍目录 http://blog.csdn.net/fksec/article/details/7888251 该资料是《SQL Server 2008数据库设计与实现》的随书源代码 对应的书籍资料见: SQL Server 2008数据库设计与实现(关系数据库实现的通关宝典) 基本信息 原书名: Pro SQL Server 2008 Relational Database Design and Implementation 原出版社: Apress 作者: (美)Louis Davidson    Kevin Kline    译者: 程桦 张绪业 丛书名: 图灵程序设计丛书 数据库 出版社:人民邮电出版社 ISBN:9787115215543 上架时间:2009-10-30 出版日期:2009 年11月 开本:16开 页码:560 版次:1-1 编辑推荐    资深数据库专家的心血力作    SQL Server设计思想的独到解析    关系数据库实现的通关宝典 内容简介   本书深入浅出地介绍了目前世界上最受欢迎的数据库管理系统之一——sql server。全书共分三个部分:第一部分阐释了数据库的基本概念,讲解了数据库建模语言;第二部分展示了从概念建模到在 sql server 2008上真正实现数据库的过程;第三部分深入探讨了 sql server若干方面的技术细节,如数据保护、索引、并发访问等。通过将理论融入数据库实践,清晰地讲解了关系型数据库的设计原则,完整地展示了如何进行良好的关系型数据库设计,深入揭示了 sql server 2008的技术细节。.   本书浓缩了作者作为 sql server数据库架构师多年来丰富的实践经验,适合各类数据库开发和管理人员学习参考。... 作译者 作者:   Kevin Kline是Quest软件公司SQL Server解决方案的技术战略经理。Kevin从2004年开始就是微软的SQL Server MVP,他是国际SQLServer专家联盟(PASS)创辽委员会的成员和下一届总裁。他独自写作或参与合著了好几本书,包括SQL in a Nutshell(O'Reilly,2004)、Pro SQL Server 2005 Database Design and Optimization(Apress,2006)以及Database Benchmarking:Practical Methods for Oracle&SQL; Server(Rampant,2007)。Kevin给SQL Server Magazine和Database Trendv and Applications杂志供稿,他的博客可以在SQLBlog.com和SQLMag.com上找到。在世界范围内的会议上,比如微软的Tech Ed、PASS社区峰会、微软汀论坛、DevTeach以及SQLConnections,Kevin也是人气最高的演讲者。从1986年开始Kevin就活跃在IT工业中。..   Kurt Windisch是Levi,Ray,and Shoup,Inc.公司内部IT部门的应用程序监管,该公司是——家技术方案的全球供应商,总部位于伊利诺伊州的Springfield。Kurt在IT工业中的经验超过了17年。他在SQL Server专家联盟的董事会中服务了5年,为很多SQL Server杂志供过稿,也在讨论SQL Server数据库编程的国际会议上发过言。   Louis Davidson,作为企业数据库开发人员和架构师,他拥有超过15年的工作经验。目前他是田纳西州Nashville的Christian广播网络和NorthStar工作室的数据架构师。对于Louis而言,他全部的职业经验几乎都与微软的SQL Server有关,从早期版本一直到当前最新版本的Beta版。Louis是一本讲数据库设计的书的4个版本的主要作者。Louis主要的兴趣领域是数据库架构和用T-SQL编码,并且,他设计过许多数据库,在这许多年中编写过数以千计的存储过程和触发器。   Scott Klein是一位独立咨询师,对SQL Server、.NET和XML相关的所有知识都充满热情。他是几本书的作者,这包括Professional SQL Server 2005 XML(Wrox,2006)和Professional LINQ(Wrox,2008),他还为SQL PASS Community Connector写每两周一次的特辑文章。他也为好几个网站供稿,这包括Wrox(http://www.wrox.com)和TopXML(http://www.topxml.com)。他经常同佛罗里达附近的SQL Server和.NET用户群体交流。Scott住在佛罗里达的Wellington,当他不坐在计算机前时,你会发现他和自己的家人在一起,或者骑着他的雅马哈摩托车轰鸣在当地的摩托车越野赛赛道上。你可以通过ScottKlein@SqlXml.com联系他。 目录 封面 -17 封底 -16 扉页 -15 版权 -14 译者序 -13 关于作者 -12 序 -11 前言 -10 致谢 -6 目录 -4 第1章 数据库概念简介 1 1.1 数据库设计阶段 2 1.1.1 概念阶段 3 1.1.2 逻辑阶段 5 1.1.3 实现阶段 5 1.1.4 物理阶段 6 1.2 关系数据结构 6 1.2.1 数据库和模式 6 1.2.2 表、行和列 7 1.2.3 信息原则 10 1.2.4 域 12 1.2.5 元数据 13 1.2.6 键 13 1.2.7 未显式赋值的项(NULL) 18 1.3 实体之间的关系 20 1.3.1 二元关系 21 1.3.2 非二元关系 24 1.4 数据访问语言(SQL) 24 1.5 理解依赖性 25 1.5.1 函数依赖性 26 1.5.2 判定 26 1.6 总结 27 第2章 数据建模语言 28 2.1 数据建模介绍 28 2.2 实体 29 2.3 属性 32 2.3.1 主键 33 2.3.2 替代键 35 2.3.3 外键 35 2.3.4 域 36 2.3.5 命名 38 2.4 关系 39 2.4.1 识别性关系 40 2.4.2 非识别性关系 40 2.4.3 角色名字 43 2.4.4 关系基数 44 2.4.5 动词短语(关系名字) 49 2.5 描述信息 51 2.6 其他建模方法 52 2.6.1 信息工程 53 2.6.2 Chen ERD 54 2.6.3 Visio 55 2.6.4 Management Studio数据库关系图 56 2.7 最佳实践 57 2.8 总结 57 第3章 概念阶段数据建模 59 3.1 理解需求 60 3.2 文档化过程 61 3.3 需求收集 62 3.3.1 客户访谈 63 3.3.2 要回答的问题 64 3.3.3 现存的系统和原型 67 3.3.4 其他类型的文档 67 3.4 识别对象和过程 69 3.4.1 识别实体 70 3.4.2 实体间关系 76 3.4.3 识别属性和域 82 3.5 识别业务规则和业务过程 90 3.5.1 识别业务规则 90 3.5.2 识别基础业务过程 92 3.6 完成概念模型 93 3.6.1 识别明显的、额外的数据需求 94 3.6.2 和客户一起评审 95 3.6.3 重复以上步骤直到客户同意你的模型 95 3.7 最佳实践 95 3.8 总结 96 第4章 规范化过程 97 4.1 为什么要规范化 98 4.1.1 消灭重复数据 98 4.1.2 避免编写不必要的代码 98 4.1.3 给表瘦身 98 4.1.4 最大化聚集索引的使用 99 4.1.5 降低每张表中索引的数量 99 4.2 规范化应该走多远 99 4.3 规范化过程 100 4.4 实体和属性的形式:第一范式 100 4.4.1 所有属性必须是原子的 101 4.4.2 实体的所有实例必须包含相同数量的值 104 4.4.3 实体中出现的所有实体类型都必须不同 106 4.4.4 第一范式所避免的不规则编程 106 4.4.5 当前设计不符合第一范式的线索 110 4.5 属性间的关系 111 4.5.1 第二范式 111 4.5.2 第三范式 116 4.5.3 Boyce-Codd范式 121 4.6 实体中的多值依赖 124 4.6.1 第四范式 124 4.6.2 第五范式 135 4.7 非规范化 136 4.8 最佳实践 136 4.9 总结 137 4.10 额外的例子 137 4.11 本书迄今为止所讲述的故事 142 第5章 实现基础的表结构 144 5.1 评审逻辑设计 147 5.2 变换设计 148 5.2.1 选择名字 148 5.2.2 处理子类型 151 5.2.3 决定树的实现方式 155 5.2.4 选择键的实现方式 156 5.2.5 决定域的实现方式 161 5.2.6 设置模式 172 5.2.7 评审“最终的”实现模型 172 5.3 实现设计 173 5.3.1 创建基本表结构 175 5.3.2 添加唯一性约束 183 5.3.3 构建默认约束 189 5.3.4 添加关系(外键) 195 5.3.5 处理排序规则和排序 205 5.3.6 计算列 209 5.3.7 实现用户定义的数据类型 212 5.3.8 文档化你的数据库 220 5.3.9 处理依赖信息 222 5.4 最佳实践 225 5.5 总结 226 第6章 保护数据的完整性 228 6.1 最佳实践 229 6.2 自动数据保护 231 6.2.1 声明性数据保护 231 6.2.2 基本语法 233 6.2.3 基于简单表达式的CHECK约束 235 6.2.4 基于函数的CHECK约束 237 6.2.5 约束引起的错误 242 6.2.6 DML触发器 244 6.2.7 处理来自触发器和约束的错误 277 6.3 手动数据保护 280 6.4 更多最佳实践 287 6.5 总结 287 第7章 模式与查询技术 289 7.1 预计算值 290 7.1.1 序列表 290 7.1.2 日期计算 297 7.2 二进制大型对象(BLOB) 305 7.3 存储用户自定义数据 307 7.3.1 一长串通用列 308 7.3.2 实体-属性-值(EAV) 309 7.3.3 往表中增加列 313 7.4 通用实现对象 318 7.5 反模式 319 7.5.1 多用途键域 320 7.5.2 通用键引用 322 7.5.3 对非结构化数据的过度使用 325 7.6 总结 326 7.7 回顾与展望 326 第8章 数据访问安全 328 8.1 安全主体与安全对象 329 8.2 数据库安全概述 330 8.2.1 模拟 331 8.2.2 权限 333 8.2.3 控制对象访问 334 8.2.4 角色 338 8.2.5 模式 344 8.3 通过T-SQL编程对象控制对象访问 345 8.3.1 存储过程和标量函数 346 8.3.2 对象内模拟 347 8.3.3 跨数据库边界 352 8.3.4 不同的服务器(分布式查询) 357 8.4 视图与表值函数 357 8.4.1 一般用法 358 8.4.2 使用视图实现可配置的行级安全 360 8.5 数据混淆 364 8.6 监视与审核 367 8.6.1 服务器与数据库审核 367 8.6.2 使用DML触发器查看表的变更历史 371 8.6.3 DDL触发器 374 8.6.4 分析器日志 377 8.7 最佳实践 379 8.8 总结 380 第9章 表结构与索引 382 9.1 数据库物理结构 383 9.1.1 文件与文件组 383 9.1.2 分区与页 386 9.1.3 页中的数据 388 9.1.4 分区 391 9.2 索引概览 393 9.3 基本索引结构 393 9.4 索引类型 395 9.4.1 聚集索引 395 9.4.2 非聚集索引 397 9.4.3 聚集表上的非聚集索引 398 9.5 索引创建的基本方法 400 9.6 基本的索引使用模式 402 9.6.1 使用聚集索引 403 9.6.2 使用非聚集索引 405 9.6.3 使用唯一索引 416 9.7 高级的索引使用案例 416 9.7.1 外键索引 416 9.7.2 索引视图 419 9.8 最佳实践 422 9.9 总结 423 第10章 并发编程 425 10.1 什么是并发 426 10.2 查询优化的基础知识 427 10.3 操作系统与硬件因素 428 10.4 事务 429 10.4.1 事务语法 430 10.4.2 已编译的SQL Server代码 437 10.5 SQL Server并发控制 444 10.5.1 锁 445 10.5.2 隔离级别 448 10.6 完整性与并发性编程 459 10.6.1 悲观锁定 459 10.6.2 实现单线程代码块 461 10.6.3 乐观锁定 463 10.6.4 基于行的锁定 464 10.6.5 逻辑工作单元 469 10.7 最佳实践 470 10.8 总结 471 第11章 数据访问策略 472 11.1 即席SQL 473 11.1.1 优点 474 11.1.2 缺陷 480 11.2 存储过程 484 11.2.1 封装性 485 11.2.2 动态存储过程 486 11.2.3 安全性 488 11.2.4 性能 490 11.2.5 缺陷 491 11.2.6 观点 495 11.3 T-SQL与CLR(公共语言运行时) 497 11.3.1 选择T-SQL的准则 500 11.3.2 选择.NET的准则 501 11.3.3 CLR对象类型 501 11.4 最佳实践 503 11.5 总结 504 附录A Codd的RDBMS十二法则 506 附录B 标量数据类型参考 511 索引 538 译者序   如果将数据库称为现代数字生活的基础,那么这样的说法一点也不夸张——大型企业应用、网站,所有这些东西的背后,都是数据库在支撑。并且,最终说来,产生价值的并不是绚丽的界面和现代化的输入方式,而是存放在数据库中的数据。不幸的是,虽然关系型数据库历经了约30年的发展,有成熟的理论和大量的实践基础,但是,大多数设计、开发人员在设计数据库结构时仍然是“跟着感觉走”,根据业务的需要和编程的方便,把字段这张表放几个那张表放几个完事。对这样设计出来的数据库,只需多问几个为什么——业务模型是如何体现的?数据完整性如何保证?性能是如何权衡的?——恐怕设计者就该崩溃了。.   这也难怪,设计、开发人员在学校中学习数据库时,理论书籍离实际开发较远——试问有几个人能够以可实践的方式把规范化的几条原则阐述清楚?在工作时,使用的数据库资料和书籍又往往是“手册型”,大多仅仅讲解特定数据库提供的功能。   正如作者所说——“我的书目标很简单,那就是填补这个空白,架起学院教科书与通常针对SQL Server所写的,纯粹面向实践的书之间的桥梁”。翻译的过程中,译者感到此言不虚:作者从数据库的基本概念到数据库建模,从如何运用规范化原则到如何做成实际的数据库表,从如何保护数据库完整性到如何提高数据库的性能,从数据库的安全机制到并发事务控制,从数据库设计开发的常用模式到应用程序的数据访问策略,既有理论又紧扣实践。阅读本书的过程,就是把一些以前模糊地知道,但又觉得很难运用的理论实实在在地运用到实践中的过程。   虽然本书是针对SQL Server这个特定数据库平台来阐述理论和实践的,然而,本书所体现的思想和方法,完全可以运用到其他关系数据库平台上。..   翻译的时间很紧,如果没有家人的支持和理解,很难想象如何完成这项工作。   感谢人民邮电出版社图灵公司很好地推动了这本书的翻译工作。另外,图灵公司的论坛上丰富的资料和活跃的讨论也使我们眼界大开,受益良多。   翻译工作并非阐述自己的思想,翻译的第一要务是忠实地传达原著者的思想。虽然无法自由地表达自己的想法,然而,翻译的快乐就在于:使另一个人的好想法能让更多的人了解。当然,由于时间紧张,译者水平有限,错误粗糙之处相信不在少数,敬请广大读者批评指正。   感谢我的妻子魏萍,你容忍我一吃完饭就坐到计算机前。谢谢女儿程灵馨,在爸爸不能陪你玩时,5岁的你居然也表示理解。谢谢作者Louis Davidson,你耐心地回答了我的问题。   程桦   感谢我的未婚妻张艳,是你的鼓励和体贴让我在寒冷的冬日伏案不辍。还要感谢我的家人,你们殷殷的期盼让我产生了对知识的不渝追求。...   张绪业   2009年5月    前言   我经常扪心自问,“为什么要做这件事?为什么还要写新版本?这值得吗?如果我抛开书去打任天堂游戏机,我是不是能帮超级玛丽快点把公主救出来?”在微软MVP 2008年峰会上,这些问题都由一位MVP帮我回答了。他感谢我写了这本书,说他曾经试着读点这方面的大学教材,但那些书都太难了,读不太懂。.   “喔,是的,”我想,“那是我最开始要写这本书的原因。”当我最早开始设计数据库时,我从几位伟大的导师那里学到了不少东西,但是,当我想进一步深入研究时,我开始寻找数据库设计方面的材料,但没找着多少。我找到的最好的一本书是Chris Date的An Introduction to Database Systems(Addison Wesley,2003),然后我读了自己能读懂的部分。然而,我很快就有点晕头转向,没法做到一旦理解了概念之后,就能很好地将关于设计的理论转换到真正的、同时较为简单的设计过程中去。在我所使用的Chris和其他人的教材中,很明显,创建关系模型这件事包含了太多理论,甚至是数学知识。   如果你想要成为一名理论家,那Chris的书就是必读的,当然,除此之外还有很多可以参考的书(最好去看看http://www.dbdebunk.com/books.html,你会找到更多的书)。问题在于,这些书大多数都包含了太多的理论,超出了一般实践工作者所需了解的(或者愿意花时间去读的)内容,并且它们没有真正地深入到实际数据库系统的实现中去。我的书的目标很简单,那就是填补这个空白,在大学教材与通常针对SQL Server所写的、纯粹面向实践的书之间架起一座桥梁。我的目的不是顶替这些书,完全不是,在我的书架上有很多这样的书。本书更像是一本面向技术的书,而不是讲解SQL Server功能的使用手册。我将介绍关系引擎的大多数典型功能,教给你使用它们的技术。然而,我不能说这是你书架上需要的唯一一本书。   如果你有本书以前的版本,你可能会问为什么还需要这个新版本,我了解你的感受。我花了大量时间找出应该买这个新版本的理由,而这个理由并不那么明显——那就是,我现在涵盖了2008的所有功能。很明显,这只是部分原因,最重要的是,我一直在努力加入更多新内容让你的工作更轻松。我加入了一章(第7章)介绍开发模式,每一章中也都加入了大量新材料,从而能帮你改进数据库设计。   诗人和剧作家奥斯卡王尔德曾经说过:“只有年轻人才会无所不知。”现在回头看时有点后悔,自己在写第一本书Professional SQL Server 2000 Database Design之前,以为自己什么都知道。正是那种无知和放纵不羁的热情,才让我有勇气写下第一本书。最后,我确实完成了第一本书,它之所以还不错,主要归功于技术编辑给予的批评。并且,如果我没有最初那种驱使我写完书的热情的话,我也不可能写这本书的第四版。无论如何,如果你花几周的时间逐章逐节地比较了这些书的每个版本的话,你会发现这是个内容逐步丰富的过程,而且作者也在逐步成熟。   过程的逐步丰富和作者的逐渐成熟都有其原因。一个原因是过去两个版本以来我所碰到的编辑:首先是Tony Davis,现在是Jonathan Gennick。他们两人对我的文风都多有指摘,并且他们把本书的结构调整得很棒。另一个原因可以简单地归结为经验,因为从我开始写第一版以来已经过了8年。但是,书中所用的材料之所以有进步,最大的原因还是它们经过了检验。一方面我在对别人贡献着自己的好评论,另一方面我也收到了大量关于如何改进的反馈(其中一些评论可不那么友善)。我非常用心地倾听,从书发布那天开始就记一系列笔记。对于我能用得上的任何反馈,我都会感到很高兴。可以用电子邮件联系我(louis@drsql.org),如果你愿意也可以在我的网站(drsql.org)留下匿名反馈。你可以在网站上找到一个附录,里面含有我希望自己在写这本书时就了解了的材料。   数据库设计的目的   数据库设计的目的是什么?你到底为什么要关心这事?主要的原因是设计良好的数据库用起来很简单,因为所有东西都在其应处于的逻辑位置上。这非常像一个收拾得很好的橱柜,如果你需要红辣椒粉,直接到调味品搁架的红辣椒粉那格就能取到,这就比到处乱找要强得多。但是,许多系统组织得一团糟。即使每件东西都有一个分好的地方,如果找起来很困难,那件东西也就没啥价值了。想象如果一本电话簿完全没有排序会如何?或者,编排字典的时候把词任意放在文字中能放下的地方又会如何?数据库如果组织良好的话,即使要写一两个联结,你也可以靠本能就知道去哪里获取需要的数据。我的意思是,说到底,这难道不是件很有趣的事吗?..   你也可能吃惊地发现,数据库设计是件相当简单的任务,不像听起来那么困难。与随着项目进行而拼凑数据存储相比,要做好这件事需要在项目一开始多花些时间,但是,在项目的整个生命周期中,这样做能获得相应回报。要想正确地进行数据库设计,我们面对的最具挑战性的问题是:与不做设计相比,正确地设计数据库会花更多的时间(在项目计划会议上,关于时间的争论经常发生)。因为数据库设计没有什么可见的东西来让客户感到赏心悦目,因此这一阶段经常会被压缩,目的就是让事情看起来进行得较快。对于普通客户而言,即使是最没有挑战性、最不让人感兴趣的用户界面也比最漂亮的数据模型要吸引人得多。虽然一般说来,数据才是投资创建系统的最终原因,但是,用户界面编程往往占据了中心地位。并不是说你的同事没有注意到一个糟糕的数据模型与一个漂亮的数据模型之间的区别,他们确实注意到了,但是,当程序员需要编码时,往往会顾不上考虑如何能正确地存储数据。我希望自己知道这个难题的答案,因为要是有这个答案,我的书会卖出一百万本。本书将努力提供一些技术和过程,帮助你进行数据库设计,力求对新手清晰易懂,对老练的专家也有所助益。   这个设计和架构数据存储的过程与数据库安装和管理的角色并不相同。例如,作为数据架构师的角色,我很少去创建用户、执行备份,或者去设置复制与集群。我很少谈及这些任务,它们被认为是管理工作,由DBA角色担当。既是开发人员又是DBA的人并不罕见(实际上,如果你在小公司工作,你会发现自己担当了多个角色,以至于不堪重负),但是,如果你能将自己的思维与偏重实现的角色相分离,从而使你能更多地思考数据有多难用,那么一般说来,你设计出的东西会好很多。对许多情况而言,数据库设计没有看起来那样困难。   注解为安全起见,我要澄清一件事:如果你做过任何编程工作的话,毫无疑问,你会反对本书中的某些观点和意见。我完全同意本书不是什么Katmai 的圣路易斯 福音书。我的意见和观点来自于超过16年对数据库的学习、在数据库上的工作,并且由来自于许多不同的人、书、大学课堂和研讨会的知识所补充。我在“致谢”一节已经感谢了其中的许多人,但是,我忘掉的人名也数以百计,我脑中铭刻的某些知识精华就来自于他们。本书所展示的设计方法是所有这些思想的集合。我希望本书能被看作是个有用的学习工具。通过阅读本书和其他人的著作,再实践你自己的想法,你将会总结出自己的方法论,它会适合你自己,并使你成为成功的数据库设计人员。   本书的结构   本书由如下各章组成。   第1章:数据库概念简介。该章提供了对关键术语和概念的简要概览。   第2章:数据建模语言。该章的作用是介绍数据架构师的主要工具——模型。该章详细介绍了一种建模语言——IDEF1X,因为它是本书中用于展示数据库设计的建模语言。还介绍了其他几种常见的建模语言,因为某些读者或者出于偏爱、或者由于公司的要求会使用这些类型的模型。   第3章:概念阶段数据建模。在概念阶段数据建模中,我们的目标是讨论这样的过程:引入顾客的需求集合,将表、列、关系和业务规则放入数据模型格式中相应的地方。   第4章:规范化过程。数据库设计过程的下一步是规范化。规范化的目标是将表、列、关系和业务规则的集合格式化为每个值只在一个地方存储、每张表只代表一个单一实体的形式。在最初几次进行规范化时,这个过程会感觉不太自然,因为你不用琢磨如何使用数据,却必须琢磨数据本身以及结构会如何影响数据的质量。然而,一旦你掌握了规范化,那么,不以规范化的方式存储数据就会让人觉得不舒服。   第5章:实现基础的表结构。在数据库设计过程中,这是第一个要启动SQL Server,开始写脚本来构建数据库对象的时间点。该章讨论了构造表(包括为列选择数据类型)及关系,其中提到了实现后的结构可能与我们在规范化过程中得到的模型不一致的问题。   第6章:保护数据的完整性。除了要将数据安排在表和列中之外,也需要实现其他业务规则。在SQL Server中,保证数据完整性条件得以满足的第一条防线由CHECK约束与触发器构成,因为用户无法轻易绕开由约束和触发器进行的验证。这一章还讨论了其他几种保护数据的方法,它们可以用存储过程和客户端代码来实现。   第7章:模式和查询技术。除了设计表时的各种基本技巧之外,我们还利用几种技巧来构成常见的数据/查询接口,从而方便未来的查询和使用。该章讨论了几种常见的、有用的模式,同时也观察了某些人需要使用的一些模式——有些查询需求的接口实现对你来说非常困难,而这些模式能使它们变得更简单些。 .  第8章:数据访问安全。这些日子以来,安全问题几乎在每个程序员的头脑中都占据了很重要的位置。该章讨论了用来在系统中实现数据安全的某些策略,比如使用视图、触发器、加密,甚至使用SQL ServerProfiler等。   第9章:表结构与索引。该章展示了如何在SQL Server中建立表结构的基础知识,以及某些对数据进行索引以获得更好性能的策略。   第10章:并发编程。数据库设计和实现过程的一部分是不仅要考虑结构,而且还要考虑如何在多个用户之间最大化资源的利用率。该章描述了几种策略,它们都与如何在你的数据访问和修改代码中实现并发相关。   第11章:数据访问策略。该章讨论了关于编写代码来访问SQL Server的许多概念和问题。比较了即席SQL与存储过程(包括两者面对的所有风险和挑战,比如计划的参数化、性能、开发投入、可选参数、SQL注入等),同时也讨论了T-SQL还是CLR对象更好,其中包括用CLR来编码不同类型的对象的示例。有关CLR的材料由Kurt Windisch提供,可以下载的CLR示例代码也由他提供。   附录A:Codd的RDBMS十二法则。本附录介绍了Codd关于数据库应该如何实现的创新的十二条原则。随着硬件的发展,我们离实现他的梦想越来越近。   附录B:标量数据类型参考。本附录介绍了可以被合法地当作标量类型的所有类型,为什么要用它们,以及它们的实现信息和其他细节。   再一次强调,给我反馈时不用犹豫,任何时候都不要犹豫(只要你不在早上3点给我打电话就行)。对任何章节,我都将努力改善大家发现还有所欠缺的地方,并将改善后的内容发布到我的博客上(http://sqlblog.com/blogs/louis_davidson),其标签为DesignBook,同时也会发布到我的网站上(http://drsql.org/ProSQLServerDatabaseDesign.aspx)。如果有什么新的想法或者找到了一些错误,或者有额外的资料,我都会将其添加在这两个地方。因为这是一本书,而不再是零零星星的资料,这两处是我能想到并选来发布信息的地方。...    序言   数据库设计是Louis和我都热衷的事情。今年秋季,我将幸运地和我的朋友Louis Davidson登上同一个舞台。我们将在DevLink会议上演讲,地点是Louis的家乡Nashville,然后,在西雅图的PASS上我们也将同台演讲。在这两次演讲中,我们都将针对数据库设计这个题目开展讨论和辩论,并探讨对以数据为中心的应用来说数据库设计有多关键。.   数据库设计是门科学也是门艺术。规范化应该说是门科学,而确定实体的范围则是一门艺术,需要具有与各种数据库打交道的经验才能学到手。优雅的解决方案都有一种简单的美。Louis不止是位作者和数据库设计人员,也是一位大师级技师。在本书中,你会发现字里行间都隐藏着作者的呼吁——改善你的技能,精心雕刻出能够经受时间考验的数据库,创造一个能让开发人员充分施展拳脚的、虚拟的数据世界。..   数据库设计是每个以数据为中心的应用的基石。一个优雅的数据库设计使得数据一目了然、容易查询,并且使用有效的、基于集的查询将开发人员武装起来,使他们获得成功。但是,如果数据库设计就很糟糕,则无论多少代码也无法补偿,也无法为数据库加上缺失的功能。对任何以数据为中心的应用来说,没有什么角色比数据建模人员这个角色更为重要。用户界面换来换去,但是,即使经历了好几代应用编程语言,数据仍然存在着。数据库架构上犯下的错误迟早会被未来的程序员诅咒,即使他现在还未出生,即使他用的是现在还没发明的语言和工具。在我的好朋友Louis的指导下,多花一点时间来润色你的数据库设计,绝对是件值得的事。   因此,欢迎你阅读本书,这是Louis针对软件世界最重大的工作所写的战地指南的第三版。能够为本书作序我感到无比愉快。...   Paul Nielsen   SQL Server MVP    媒体评论   “跟本书的2005版一样,我认为Louis的这本书写得非常好,信息量极其丰富而且实践性强。阅读过程中,你会觉得是在跟作者讨论问题。我喜欢这本书,还因为它有自己的观点,而非从在线图书中照搬过来……”   —— Amazon读者评论...   
2022-06-15 14:43:41 51KB SQL Server 数据库 设计与实现
1
《SQL Server 2008数据库设计与实现》深入浅出地介绍了目前世界上最受欢迎的数据库管理系统之一——SQL Server。全书共分三个部分:第一部分阐释了数据库的基本概念,讲解了数据库建模语言;第二部分展示了从概念建模到在SQL Server 2008上真正实现数据库的过程;第三部分深入探讨了SQL Server若干方面的技术细节,如数据保护、索引、并发访问等。通过将理论融入数据库实践,清晰地讲解了关系型数据库的设计原则,完整地展示了如何进行良好的关系型数据库设计,深入揭示了SQL Server 2008的技术细节。 《SQL Server 2008数据库设计与实现》浓缩了作者作为SQL Server数据库架构师多年来丰富的实践经验,适合各类数据库开发和管理人员学习参考。
2022-06-15 14:40:50 52.85MB SQL Server 2008 数据库
1
书名: SQLServer2008查询性能优化 作者: 弗里奇(Grant Fritchey) 出版社: 人民邮电出版社 出版日期: 2010年8月1日 ISBN: 9787115230294 编辑推荐 《SQL Server 2008查询性能优化》为你提供了处理查询性能所需要的工具。建立、维护数据库和数据库服务器可能是个困难的工作。当服务器的运行越来越慢时,这个工作就变得更加困难。来自用户的愤怒的电话以及站在你办公桌周围的管理人员都使你很不快活。在开发代码的同时,如果你花费时间和精力来开发一个性能故障排错的方法。那么你就能避免这种情况——至少可以快速而有效地做出反应。《SQL Server 2008查询性能优化》指出的性能要点之一是数据库随着用户和数据的日益增多而进行扩展的必要性。你需要理解性能低下的起因。以及识别并修复它们的方法。《SQL Server 2008查询性能优化》将帮助你: 使用性能监视器、SQL Trace以及动态管理视图和函数建立性能基线 理解一般系统中发生瓶颈的地方。以及解决瓶颈的方法 识别常见性能问题以及对其快速处理的方法 实施修复甚至预防性能问题的T-SQL最佳实践 《SQL Server 2008查询性能优化》不是理论书籍,它的目的是帮助你避免数据库出现性能低下的状况,它还能帮助你保住你的工作。 内容提要 《SQL Server 2008查询性能优化》通过大量实例,详细介绍了SQL Server数据库系统优化的各种方法和技巧。内容涵盖了数据库应用系统中各种性能瓶颈的表现形式及其发生的根源和解决方法,从硬件瓶颈到查询、索引设计以及数据库管理等,贯穿了数据库系统知识的各个方面。最后以一个实际的工作负载将所有技巧联系起来,并且提供了“宝典”式的最佳实践列表。 《SQL Server 2008查询性能优化》适合于关心数据库应用系统性能的开发人员和数据库管理人员阅读。通过阅读《SQL Server 2008查询性能优化》,不仅可以学习到数据库性能管理的许多知识和技巧,还有助于养成良好的编程习惯,为实现高性能的数据库应用系统打下基础。 目录 第1章 SQL查询性能调整 1 1.1 性能调整过程 2 1.1.1 核心过程 2 1.1.2 迭代过程 4 1.2 性能vs.价格 7 1.2.1 性能目标 7 1.2.2 “足够好”的调整 7 1.3 性能基线 8 1.4 工作的重点 9 1.5 SQL Server性能杀手 10 1.5.1 低质量的索引 10 1.5.2 不精确的统计 11 1.5.3 过多的阻塞和死锁 11 1.5.4 不基于数据集的操作 11 1.5.5 低质量的查询设计 12 1.5.6 低质量的数据库设计 12 1.5.7 过多的碎片 12 1.5.8 不可重用的执行计划 13 1.5.9 低质量的执行计划 13 1.5.10 频繁重编译计划 13 1.5.11 游标的错误使用 13 1.5.12 错误配置数据库日志 14 1.5.13 过多使用或者错误配置tempdb 14 1.6 小结 14 第2章 系统性能分析 15 2.1 性能监视器工具 15 2.2 动态管理视图 17 2.3 硬件资源瓶颈 18 2.3.1 识别瓶颈 18 2.3.2 瓶颈解决方案 19 2.4 内存瓶颈分析 19 2.4.1 SQL Server内存管理 20 2.4.2 Available Bytes 23 2.4.3 Pages/sec和Page Faults/sec计数器 23 2.4.4 Buffer Cache Hit Ratio 24 2.4.5 Page Life Expectancy 24 2.4.6 Checkpoint Pages/sec 24 2.4.7 Lazy writes/sec 24 2.4.8 Memory Grants Pending 25 2.4.9 Target Server Memory(KB)和Total Server Memory(KB) 25 2.5 内存瓶颈解决方案 25 2.5.1 优化应用程序工作负载 26 2.5.2 为SQL Server分配更多内存 27 2.5.3 增加系统内存 27 2.5.4 更换32位处理器为64位处理器 27 2.5.5 启用3GB进程空间 28 2.5.6 在32位SQL Server中使用4GB以上内存 28 2.6 磁盘瓶颈分析 29 2.6.1 磁盘计数器 30 2.6.2 % Disk Time 30 2.6.3 Current Disk Queue Length 31 2.6.4 Disk Transfers/sec 31 2.6.5 Disk Bytes/sec 32 2.6.6 Avg. Disk Sec/Read和Avg. Disk Sec/Write 32 2.7 磁盘瓶颈解决方案 32 2.7.1 优化应用程序工作负载 33 2.7.2 使用更快的磁盘驱动器 33 2.7.3 使用一个RAID阵列 33 2.7.4 使用SAN系统 35 2.7.5 恰当地对齐磁盘 35 2.7.6 使用电池后备的控制器缓存 36 2.7.7 添加系统内存 36 2.7.8 创建多个文件和文件组 36 2.7.9 将表和索引放在不同的磁盘上 39 2.7.10 将日志文件保存到独立的物理磁盘 39 2.7.11 表的分区 40 2.8 处理器瓶颈分析 40 2.8.1 % Processor Time 41 2.8.2 % Privileged Time 41 2.8.3 Processor Queue Length 42 2.8.4 Context Switches/sec 42 2.8.5 Batch Requests/sec 42 2.8.6 SQL Compilations/sec 42 2.8.7 SQL Recompilations/sec 43 2.9 处理器瓶颈解决方案 43 2.9.1 优化应用程序工作负载 43 2.9.2 消除过多的编译/重编译 43 2.9.3 使用更多或更快的处理器 44 2.9.4 使用大的二级(L2)/三级(L3)缓存 44 2.9.5 运行更高效的控制器/驱动程序 44 2.9.6 不运行不必要的软件 45 2.10 网络瓶颈分析 45 2.10.1 Bytes Total/sec 45 2.10.2 % Net Utilization 46 2.11 网络瓶颈解决方案 46 2.11.1 优化应用程序工作负载 46 2.11.2 增加网络适配器 47 2.11.3 节制和避免中断 47 2.12 SQL Server总体性能 47 2.12.1 丢失索引 48 2.12.2 数据库阻塞 49 2.12.3 不可重用的执行计划 50 2.12.4 总体表现 50 2.13 创建一个基线 51 2.13.1 创建性能计数器的一个可重用列表 51 2.13.2 使用性能计数器列表创建一个计数器日志 54 2.13.3 最小化性能监视器开销 55 2.14 以基线为标准的系统状态分析 56 2.15 小结 57 第3章 SQL查询性能分析 58 3.1 SQL Profiler工具 58 3.1.1 Profiler跟踪 59 3.1.2 事件 60 3.1.3 数据列 62 3.1.4 过滤器 64 3.1.5 跟踪模板 65 3.1.6 跟踪数据 65 3.2 跟踪的自动化 66 3.2.1 使用GUI捕捉跟踪 66 3.2.2 使用存储过程捕捉跟踪 67 3.3 结合跟踪和性能监视器输出 68 3.4 SQL Profiler建议 69 3.4.1 限制事件和数据列 69 3.4.2 丢弃性能分析所用的启动事件 70 3.4.3 限制跟踪输出大小 70 3.4.4 避免在线数据列排序 71 3.4.5 远程运行Profiler 71 3.4.6 限制使用某些事件 71 3.5 没有Profiler情况下的查询性能度量 71 3.6 开销较大的查询 72 3.6.1 识别开销较大的查询 73 3.6.2 识别运行缓慢的查询 77 3.7 执行计划 78 3.7.1 分析查询执行计划 80 3.7.2 识别执行计划中开销较大的步骤 82 3.7.3 分析索引有效性 83 3.7.4 分析连接有效性 84 3.7.5 实际执行计划vs.估算执行计划 88 3.7.6 计划缓存 89 3.8 查询开销 90 3.8.1 客户统计 90 3.8.2 执行时间 91 3.8.3 STATISTICS IO 92 3.9 小结 94 第4章 索引分析 95 4.1 什么是索引 95 4.1.1 索引的好处 97 4.1.2 索引开销 98 4.2 索引设计建议 100 4.2.1 检查WHERE子句和连接条件列 100 4.2.2 使用窄索引 102 4.2.3 检查列的唯一性 103 4.2.4 检查列数据类型 106 4.2.5 考虑列顺序 107 4.2.6 考虑索引类型 109 4.3 聚簇索引 109 4.3.1 堆表 110 4.3.2 与非聚簇索引的关系 110 4.3.3 聚簇索引建议 112 4.4 非聚簇索引 117 4.4.1 非聚簇索引维护 117 4.4.2 定义书签查找 117 4.4.3 非聚簇索引建议 118 4.5 聚簇索引vs.非聚簇索引 118 4.5.1 聚簇索引相对于非聚簇索引的好处 119 4.5.2 非聚簇索引相对于聚簇索引的好处 120 4.6 高级索引技术 121 4.6.1 覆盖索引 122 4.6.2 索引交叉 124 4.6.3 索引连接 125 4.6.4 过滤索引 126 4.6.5 索引视图 128 4.6.6 索引压缩 132 4.7 特殊索引类型 134 4.7.1 全文索引 134 4.7.2 空间索引 135 4.7.3 XML 135 4.8 索引的附加特性 135 4.8.1 不同的列排序顺序 135 4.8.2 在计算列上的索引 136 4.8.3 BIT数据类型列上的索引 136 4.8.4 作为一个查询处理的CREATE INDEX语句 136 4.8.5 并行索引创建 136 4.8.6 在线索引创建 137 4.8.7 考虑数据库引擎调整顾问 137 4.9 小结 137 第5章 数据库引擎调整顾问 139 5.1 数据库引擎调整顾问机制 139 5.2 数据库引擎调整顾问实例 143 5.2.1 调整一个查询 143 5.2.2 调整一个跟踪工作负载 146 5.3 数据库引擎调整顾问的局限性 148 5.4 小结 149 第6章 书签查找分析 150 6.1 书签查找的目的 150 6.2 书签查找的缺点 152 6.3 分析书签查找的起因 153 6.4 解决书签查找 155 6.4.1 使用一个聚簇索引 155 6.4.2 使用一个覆盖索引 155 6.4.3 使用索引连接 158 6.5 小结 160 第7章 统计分析 161 7.1 统计在查询优化中的角色 161 7.2 索引列上的统计 162 7.2.1 更新统计的好处 162 7.2.2 过时统计的缺点 164 7.3 在非索引列上的统计 165 7.3.1 在非索引列上统计的好处 166 7.3.2 丢失非索引列上的统计的缺点 169 7.4 分析统计 172 7.4.1 密度 174 7.4.2 多列索引上的统计 174 7.4.3 过滤索引上的统计 175 7.5 统计维护 176 7.5.1 自动维护 177 7.5.2 人工维护 179 7.5.3 统计维护状态 181 7.6 为查询分析统计的有效性 182 7.6.1 解决丢失统计问题 182 7.6.2 解决过时统计问题 184 7.7 建议 186 7.7.1 统计的向后兼容性 186 7.7.2 自动创建统计 186 7.7.3 自动更新统计 187 7.7.4 自动异步更新统计 189 7.7.5 收集统计的采样数量 189 7.8 小结 190 第8章 碎片分析 191 8.1 碎片的成因 191 8.1.1 UPDATE语句引起的页面分割 193 8.1.2 INSERT语句引起的页面分割 196 8.2 碎片开销 197 8.3 分析碎片数量 200 8.4 碎片解决方案 204 8.4.1 卸载并重建索引 204 8.4.2 使用DROP_EXISTING子句重建索引 205 8.4.3 执行ALTER INDEX REBUILD语句 205 8.4.4 执行ALTER INDEX REORGANIZE语句 207 8.5 填充因子的重要性 209 8.6 自动维护 212 8.7 小结 217 第9章 执行计划缓冲分析 218 9.1 执行计划生成 218 9.1.1 解析器 219 9.1.2 代数化器 220 9.1.3 优化 221 9.2 执行计划缓冲 227 9.3 执行计划组件 227 9.3.1 查询计划 227 9.3.2 执行上下文 227 9.4 执行计划的老化 228 9.5 分析执行计划缓冲 228 9.6 执行计划重用 229 9.6.1 即席工作负载 230 9.6.2 预定义工作负载 231 9.6.3 即席工作负载的计划可重用性 231 9.6.4 预定义工作负载的计划可重用性 239 9.7 查询计划Hash和查询Hash 248 9.8 执行计划缓冲建议 251 9.8.1 明确地参数化查询的可变部分 252 9.8.2 使用存储过程实现业务功能 252 9.8.3 使用sp_executesql编程以避免存储过程维护 252 9.8.4 实现准备/执行模式以避免重传查询字符串 253 9.8.5 避免即席查询 253 9.8.6 对于动态查询sp_executesql优于EXECUTE 253 9.8.7 小心地参数化查询的可变部分 254 9.8.8 不要允许查询中对象的隐含解析 254 9.9 小结 254 第10章 存储过程重编译 256 10.1 重编译的好处和缺点 256 10.2 确认导致重编译的语句 258 10.3 分析重编译起因 260 10.3.1 架构或绑定变化 261 10.3.2 统计变化 261 10.3.3 延迟对象解析 264 10.3.4 SET选项变化 266 10.3.5 执行计划老化 266 10.3.6 显式调用sp_recompile 267 10.3.7 显式使用RECOMPILE子句 268 10.4 避免重编译 269 10.4.1 不要交替使用DDL和DML语句 270 10.4.2 避免统计变化引起的重编译 271 10.4.3 使用表变量 273 10.4.4 避免在存储过程中修改SET选项 275 10.4.5 使用OPTIMIZE FOR查询提示 276 10.4.6 使用计划指南 277 10.5 小结 281 第11章 查询设计分析 282 11.1 查询设计建议 282 11.2 在小结果集上操作 283 11.2.1 限制选择列表中的列数 283 11.2.2 使用高选择性的WHERE子句 284 11.3 有效地使用索引 284 11.3.1 避免不可参数化的搜索条件 285 11.3.2 避免WHERE子句列上的算术运算符 289 11.3.3 避免WHERE子句列上的函数 290 11.4 避免优化器提示 292 11.4.1 连接提示 293 11.4.2 索引提示 295 11.5 使用域和参照完整性 296 11.5.1 非空约束 297 11.5.2 声明参照完整性 299 11.6 避免资源密集型查询 301 11.6.1 避免数据类型转换 301 11.6.2 使用EXISTS代替COUNT(*)验证数据存在 303 11.6.3 使用UNION ALL代替UNION 304 11.6.4 为聚合和排序操作使用索引 305 11.6.5 避免在批查询中的局部变量 306 11.6.6 小心地命名存储过程 309 11.7 减少网络传输数量 311 11.7.1 同时执行多个查询 311 11.7.2 使用SET NOCOUNT 311 11.8 降低事务开销 312 11.8.1 减少日志开销 312 11.8.2 减少锁开销 314 11.9 小结 315 第12章 阻塞分析 316 12.1 阻塞基础知识 316 12.2 理解阻塞 317 12.2.1 原子性 317 12.2.2 一致性 320 12.2.3 隔离性 320 12.2.4 持久性 321 12.3 数据库锁 321 12.3.1 锁粒度 322 12.3.2 锁升级 325 12.3.3 锁模式 326 12.3.4 锁兼容性 332 12.4 隔离级别 332 12.4.1 未提交读 333 12.4.2 已提交读 333 12.4.3 可重复读 335 12.4.4 可序列化(Serializable) 338 12.4.5 快照(Snapshot) 343 12.5 索引对锁的作用 343 12.5.1 非聚簇索引的作用 344 12.5.2 聚簇索引的作用 346 12.5.3 索引在可序列化隔离级别上的作用 346 12.6 捕捉阻塞信息 347 12.6.1 使用SQL捕捉阻塞信息 347 12.6.2 Profiler跟踪和被阻塞进程报告事件 349 12.7 阻塞解决方案 351 12.7.1 优化查询 352 12.7.2 降低隔离级别 352 12.7.3 分区争用的数据 353 12.7.4 争用数据上的覆盖索引 354 12.8 减少阻塞的建议 354 12.9 自动化侦测和收集阻塞信息 355 12.10 小结 359 第13章 死锁分析 360 13.1 死锁基础知识 360 13.2 使用错误处理来捕捉死锁 361 13.3 死锁分析 362 13.3.1 收集死锁信息 362 13.3.2 分析死锁 364 13.4 避免死锁 368 13.4.1 按照相同的时间顺序访问资源 368 13.4.2 减少被访问资源的数量 369 13.4.3 最小化锁的争用 369 13.5 小结 370 第14章 游标开销分析 372 14.1 游标基础知识 372 14.1.1 游标位置 373 14.1.2 游标并发性 374 14.1.3 游标类型 376 14.2 游标开销比较 378 14.2.1 游标位置的开销比较 378 14.2.2 游标并发性上的开销比较 380 14.2.3 在游标类型上的开销比较 381 14.3 默认结果集 383 14.3.1 好处 384 14.3.2 缺点 384 14.4 分析SQL Server游标开销 386 14.5 游标建议 390 14.6 小结 392 第15章 数据库工作负载优化 393 15.1 工作负载优化基础知识 393 15.2 工作负载优化步骤 394 15.3 捕捉工作负载 397 15.4 分析工作负载 399 15.5 识别开销最大的查询 400 15.6 确定开销最大的查询的基线资源使用 402 15.6.1 总体资源使用 402 15.6.2 详细资源使用 402 15.7 分析和优化外部因素 405 15.7.1 分析应用程序使用的批级别选项 405 15.7.2 分析统计有效性 406 15.7.3 分析碎片整理需求 406 15.8 分析开销最大的查询的内部行为 410 15.8.1 分析查询执行计划 410 15.8.2 识别执行计划中开销较大的步骤 412 15.8.3 分析处理策略的效率 412 15.9 优化代价最大的查询 412 15.9.1 修改现有索引 413 15.9.2 分析连接提示的应用 415 15.9.3 避免聚簇索引扫描操作 417 15.9.4 修改过程 418 15.10 分析对数据库工作负载的影响 420 15.11 迭代各个优化阶段 421 15.12 小结 424 第16章 SQL Server优化检查列表 425 16.1 数据库设计 425 16.1.1 平衡不足和过多的规范化 426 16.1.2 从实体完整性约束中得利 427 16.1.3 从域和参照完整性约束中得利 428 16.1.4 采用索引设计最佳实践 430 16.1.5 避免在存储过程名称中使用sp_前缀 431 16.1.6 最小化触发器的使用 431 16.2 查询设计 432 16.2.1 使用SET NOCOUNT ON命令 432 16.2.2 显式定义对象所有者 432 16.2.3 避免不可参数化的搜索条件 432 16.2.4 避免WHERE子句列上的算术运算符 433 16.2.5 避免优化器提示 434 16.2.6 远离嵌套视图 434 16.2.7 确保没有隐含的数据类型转换 435 16.2.8 最小化日志开销 435 16.2.9 采用重用执行计划的最佳实践 435 16.2.10 采用数据库事务最佳实践 436 16.2.11 消除或减少数据库游标开销 437 16.3 配置设置 437 16.3.1 Affinity Mask 437 16.3.2 内存配置选项 437 16.3.3 并行性开销阈值 438 16.3.4 最大并行度 438 16.3.5 优化即席工作负载 438 16.3.6 查询调控器开销限制 439 16.3.7 填充因子(%) 439 16.3.8 被阻塞过程阈值 439 16.3.9 数据库文件布局 439 16.3.10 数据库压缩 440 16.4 数据库管理 440 16.4.1 保持统计最新 440 16.4.2 保持最小数量的索引碎片数量 441 16.4.3 循环使用SQL错误日志文件 441 16.4.4 避免像AUTO_CLOSE或AUTO_SHRINK这样的自动化数据库功能 441 16.4.5 最小化SQL跟踪开销 442 16.5 数据库备份 442 16.5.1 增量和事务日志备份频率 442 16.5.2 备份分布 443 16.5.3 备份压缩 444 16.6 小结 444 作者介绍 作者:(美国)弗里奇(Grant Fritchey) (美国)达姆(Sajal Dam) 译者:姚军 弗里奇(Grant Fritchey),为FM Global(一家行业领先的工程和保险公司)工作,担任首席DBA。他使用各种语言(如VB、C#和Java等)开发了许多大规模的应用程序,从版本6.0开始使用SQL Server。他曾经为3家失败的.com公司担任财务和咨询工作,还是Dissecting SQL Server Execution Plans一书的作者。 达姆(Sajal Dam),拥有位于印度班加罗尔的印度理工学院的计算机科学技术硕士学位,并且使用微软技术超过16年。他已经在设计数据库应用和管理软件开发方面拥有了很广泛的背景。Saial还在从前端网页到后端数据库的基于微软技术的应用程序上,具备了故障定位和性能优化的大量经验。他有许多为《财富》500强公司设计可伸缩的数据库解决方案和最大化数据库环境性能的经验。
2022-06-15 05:34:40 37.01MB SQL Server 2008 2010
1
书名: SQLServer2008查询性能优化 作者: 弗里奇(Grant Fritchey) 出版社: 人民邮电出版社 出版日期: 2010年8月1日 ISBN: 9787115230294 编辑推荐 《SQL Server 2008查询性能优化》为你提供了处理查询性能所需要的工具。建立、维护数据库和数据库服务器可能是个困难的工作。当服务器的运行越来越慢时,这个工作就变得更加困难。来自用户的愤怒的电话以及站在你办公桌周围的管理人员都使你很不快活。在开发代码的同时,如果你花费时间和精力来开发一个性能故障排错的方法。那么你就能避免这种情况——至少可以快速而有效地做出反应。《SQL Server 2008查询性能优化》指出的性能要点之一是数据库随着用户和数据的日益增多而进行扩展的必要性。你需要理解性能低下的起因。以及识别并修复它们的方法。《SQL Server 2008查询性能优化》将帮助你: 使用性能监视器、SQL Trace以及动态管理视图和函数建立性能基线 理解一般系统中发生瓶颈的地方。以及解决瓶颈的方法 识别常见性能问题以及对其快速处理的方法 实施修复甚至预防性能问题的T-SQL最佳实践 《SQL Server 2008查询性能优化》不是理论书籍,它的目的是帮助你避免数据库出现性能低下的状况,它还能帮助你保住你的工作。 内容提要 《SQL Server 2008查询性能优化》通过大量实例,详细介绍了SQL Server数据库系统优化的各种方法和技巧。内容涵盖了数据库应用系统中各种性能瓶颈的表现形式及其发生的根源和解决方法,从硬件瓶颈到查询、索引设计以及数据库管理等,贯穿了数据库系统知识的各个方面。最后以一个实际的工作负载将所有技巧联系起来,并且提供了“宝典”式的最佳实践列表。 《SQL Server 2008查询性能优化》适合于关心数据库应用系统性能的开发人员和数据库管理人员阅读。通过阅读《SQL Server 2008查询性能优化》,不仅可以学习到数据库性能管理的许多知识和技巧,还有助于养成良好的编程习惯,为实现高性能的数据库应用系统打下基础。 目录 第1章 SQL查询性能调整 1 1.1 性能调整过程 2 1.1.1 核心过程 2 1.1.2 迭代过程 4 1.2 性能vs.价格 7 1.2.1 性能目标 7 1.2.2 “足够好”的调整 7 1.3 性能基线 8 1.4 工作的重点 9 1.5 SQL Server性能杀手 10 1.5.1 低质量的索引 10 1.5.2 不精确的统计 11 1.5.3 过多的阻塞和死锁 11 1.5.4 不基于数据集的操作 11 1.5.5 低质量的查询设计 12 1.5.6 低质量的数据库设计 12 1.5.7 过多的碎片 12 1.5.8 不可重用的执行计划 13 1.5.9 低质量的执行计划 13 1.5.10 频繁重编译计划 13 1.5.11 游标的错误使用 13 1.5.12 错误配置数据库日志 14 1.5.13 过多使用或者错误配置tempdb 14 1.6 小结 14 第2章 系统性能分析 15 2.1 性能监视器工具 15 2.2 动态管理视图 17 2.3 硬件资源瓶颈 18 2.3.1 识别瓶颈 18 2.3.2 瓶颈解决方案 19 2.4 内存瓶颈分析 19 2.4.1 SQL Server内存管理 20 2.4.2 Available Bytes 23 2.4.3 Pages/sec和Page Faults/sec计数器 23 2.4.4 Buffer Cache Hit Ratio 24 2.4.5 Page Life Expectancy 24 2.4.6 Checkpoint Pages/sec 24 2.4.7 Lazy writes/sec 24 2.4.8 Memory Grants Pending 25 2.4.9 Target Server Memory(KB)和Total Server Memory(KB) 25 2.5 内存瓶颈解决方案 25 2.5.1 优化应用程序工作负载 26 2.5.2 为SQL Server分配更多内存 27 2.5.3 增加系统内存 27 2.5.4 更换32位处理器为64位处理器 27 2.5.5 启用3GB进程空间 28 2.5.6 在32位SQL Server中使用4GB以上内存 28 2.6 磁盘瓶颈分析 29 2.6.1 磁盘计数器 30 2.6.2 % Disk Time 30 2.6.3 Current Disk Queue Length 31 2.6.4 Disk Transfers/sec 31 2.6.5 Disk Bytes/sec 32 2.6.6 Avg. Disk Sec/Read和Avg. Disk Sec/Write 32 2.7 磁盘瓶颈解决方案 32 2.7.1 优化应用程序工作负载 33 2.7.2 使用更快的磁盘驱动器 33 2.7.3 使用一个RAID阵列 33 2.7.4 使用SAN系统 35 2.7.5 恰当地对齐磁盘 35 2.7.6 使用电池后备的控制器缓存 36 2.7.7 添加系统内存 36 2.7.8 创建多个文件和文件组 36 2.7.9 将表和索引放在不同的磁盘上 39 2.7.10 将日志文件保存到独立的物理磁盘 39 2.7.11 表的分区 40 2.8 处理器瓶颈分析 40 2.8.1 % Processor Time 41 2.8.2 % Privileged Time 41 2.8.3 Processor Queue Length 42 2.8.4 Context Switches/sec 42 2.8.5 Batch Requests/sec 42 2.8.6 SQL Compilations/sec 42 2.8.7 SQL Recompilations/sec 43 2.9 处理器瓶颈解决方案 43 2.9.1 优化应用程序工作负载 43 2.9.2 消除过多的编译/重编译 43 2.9.3 使用更多或更快的处理器 44 2.9.4 使用大的二级(L2)/三级(L3)缓存 44 2.9.5 运行更高效的控制器/驱动程序 44 2.9.6 不运行不必要的软件 45 2.10 网络瓶颈分析 45 2.10.1 Bytes Total/sec 45 2.10.2 % Net Utilization 46 2.11 网络瓶颈解决方案 46 2.11.1 优化应用程序工作负载 46 2.11.2 增加网络适配器 47 2.11.3 节制和避免中断 47 2.12 SQL Server总体性能 47 2.12.1 丢失索引 48 2.12.2 数据库阻塞 49 2.12.3 不可重用的执行计划 50 2.12.4 总体表现 50 2.13 创建一个基线 51 2.13.1 创建性能计数器的一个可重用列表 51 2.13.2 使用性能计数器列表创建一个计数器日志 54 2.13.3 最小化性能监视器开销 55 2.14 以基线为标准的系统状态分析 56 2.15 小结 57 第3章 SQL查询性能分析 58 3.1 SQL Profiler工具 58 3.1.1 Profiler跟踪 59 3.1.2 事件 60 3.1.3 数据列 62 3.1.4 过滤器 64 3.1.5 跟踪模板 65 3.1.6 跟踪数据 65 3.2 跟踪的自动化 66 3.2.1 使用GUI捕捉跟踪 66 3.2.2 使用存储过程捕捉跟踪 67 3.3 结合跟踪和性能监视器输出 68 3.4 SQL Profiler建议 69 3.4.1 限制事件和数据列 69 3.4.2 丢弃性能分析所用的启动事件 70 3.4.3 限制跟踪输出大小 70 3.4.4 避免在线数据列排序 71 3.4.5 远程运行Profiler 71 3.4.6 限制使用某些事件 71 3.5 没有Profiler情况下的查询性能度量 71 3.6 开销较大的查询 72 3.6.1 识别开销较大的查询 73 3.6.2 识别运行缓慢的查询 77 3.7 执行计划 78 3.7.1 分析查询执行计划 80 3.7.2 识别执行计划中开销较大的步骤 82 3.7.3 分析索引有效性 83 3.7.4 分析连接有效性 84 3.7.5 实际执行计划vs.估算执行计划 88 3.7.6 计划缓存 89 3.8 查询开销 90 3.8.1 客户统计 90 3.8.2 执行时间 91 3.8.3 STATISTICS IO 92 3.9 小结 94 第4章 索引分析 95 4.1 什么是索引 95 4.1.1 索引的好处 97 4.1.2 索引开销 98 4.2 索引设计建议 100 4.2.1 检查WHERE子句和连接条件列 100 4.2.2 使用窄索引 102 4.2.3 检查列的唯一性 103 4.2.4 检查列数据类型 106 4.2.5 考虑列顺序 107 4.2.6 考虑索引类型 109 4.3 聚簇索引 109 4.3.1 堆表 110 4.3.2 与非聚簇索引的关系 110 4.3.3 聚簇索引建议 112 4.4 非聚簇索引 117 4.4.1 非聚簇索引维护 117 4.4.2 定义书签查找 117 4.4.3 非聚簇索引建议 118 4.5 聚簇索引vs.非聚簇索引 118 4.5.1 聚簇索引相对于非聚簇索引的好处 119 4.5.2 非聚簇索引相对于聚簇索引的好处 120 4.6 高级索引技术 121 4.6.1 覆盖索引 122 4.6.2 索引交叉 124 4.6.3 索引连接 125 4.6.4 过滤索引 126 4.6.5 索引视图 128 4.6.6 索引压缩 132 4.7 特殊索引类型 134 4.7.1 全文索引 134 4.7.2 空间索引 135 4.7.3 XML 135 4.8 索引的附加特性 135 4.8.1 不同的列排序顺序 135 4.8.2 在计算列上的索引 136 4.8.3 BIT数据类型列上的索引 136 4.8.4 作为一个查询处理的CREATE INDEX语句 136 4.8.5 并行索引创建 136 4.8.6 在线索引创建 137 4.8.7 考虑数据库引擎调整顾问 137 4.9 小结 137 第5章 数据库引擎调整顾问 139 5.1 数据库引擎调整顾问机制 139 5.2 数据库引擎调整顾问实例 143 5.2.1 调整一个查询 143 5.2.2 调整一个跟踪工作负载 146 5.3 数据库引擎调整顾问的局限性 148 5.4 小结 149 第6章 书签查找分析 150 6.1 书签查找的目的 150 6.2 书签查找的缺点 152 6.3 分析书签查找的起因 153 6.4 解决书签查找 155 6.4.1 使用一个聚簇索引 155 6.4.2 使用一个覆盖索引 155 6.4.3 使用索引连接 158 6.5 小结 160 第7章 统计分析 161 7.1 统计在查询优化中的角色 161 7.2 索引列上的统计 162 7.2.1 更新统计的好处 162 7.2.2 过时统计的缺点 164 7.3 在非索引列上的统计 165 7.3.1 在非索引列上统计的好处 166 7.3.2 丢失非索引列上的统计的缺点 169 7.4 分析统计 172 7.4.1 密度 174 7.4.2 多列索引上的统计 174 7.4.3 过滤索引上的统计 175 7.5 统计维护 176 7.5.1 自动维护 177 7.5.2 人工维护 179 7.5.3 统计维护状态 181 7.6 为查询分析统计的有效性 182 7.6.1 解决丢失统计问题 182 7.6.2 解决过时统计问题 184 7.7 建议 186 7.7.1 统计的向后兼容性 186 7.7.2 自动创建统计 186 7.7.3 自动更新统计 187 7.7.4 自动异步更新统计 189 7.7.5 收集统计的采样数量 189 7.8 小结 190 第8章 碎片分析 191 8.1 碎片的成因 191 8.1.1 UPDATE语句引起的页面分割 193 8.1.2 INSERT语句引起的页面分割 196 8.2 碎片开销 197 8.3 分析碎片数量 200 8.4 碎片解决方案 204 8.4.1 卸载并重建索引 204 8.4.2 使用DROP_EXISTING子句重建索引 205 8.4.3 执行ALTER INDEX REBUILD语句 205 8.4.4 执行ALTER INDEX REORGANIZE语句 207 8.5 填充因子的重要性 209 8.6 自动维护 212 8.7 小结 217 第9章 执行计划缓冲分析 218 9.1 执行计划生成 218 9.1.1 解析器 219 9.1.2 代数化器 220 9.1.3 优化 221 9.2 执行计划缓冲 227 9.3 执行计划组件 227 9.3.1 查询计划 227 9.3.2 执行上下文 227 9.4 执行计划的老化 228 9.5 分析执行计划缓冲 228 9.6 执行计划重用 229 9.6.1 即席工作负载 230 9.6.2 预定义工作负载 231 9.6.3 即席工作负载的计划可重用性 231 9.6.4 预定义工作负载的计划可重用性 239 9.7 查询计划Hash和查询Hash 248 9.8 执行计划缓冲建议 251 9.8.1 明确地参数化查询的可变部分 252 9.8.2 使用存储过程实现业务功能 252 9.8.3 使用sp_executesql编程以避免存储过程维护 252 9.8.4 实现准备/执行模式以避免重传查询字符串 253 9.8.5 避免即席查询 253 9.8.6 对于动态查询sp_executesql优于EXECUTE 253 9.8.7 小心地参数化查询的可变部分 254 9.8.8 不要允许查询中对象的隐含解析 254 9.9 小结 254 第10章 存储过程重编译 256 10.1 重编译的好处和缺点 256 10.2 确认导致重编译的语句 258 10.3 分析重编译起因 260 10.3.1 架构或绑定变化 261 10.3.2 统计变化 261 10.3.3 延迟对象解析 264 10.3.4 SET选项变化 266 10.3.5 执行计划老化 266 10.3.6 显式调用sp_recompile 267 10.3.7 显式使用RECOMPILE子句 268 10.4 避免重编译 269 10.4.1 不要交替使用DDL和DML语句 270 10.4.2 避免统计变化引起的重编译 271 10.4.3 使用表变量 273 10.4.4 避免在存储过程中修改SET选项 275 10.4.5 使用OPTIMIZE FOR查询提示 276 10.4.6 使用计划指南 277 10.5 小结 281 第11章 查询设计分析 282 11.1 查询设计建议 282 11.2 在小结果集上操作 283 11.2.1 限制选择列表中的列数 283 11.2.2 使用高选择性的WHERE子句 284 11.3 有效地使用索引 284 11.3.1 避免不可参数化的搜索条件 285 11.3.2 避免WHERE子句列上的算术运算符 289 11.3.3 避免WHERE子句列上的函数 290 11.4 避免优化器提示 292 11.4.1 连接提示 293 11.4.2 索引提示 295 11.5 使用域和参照完整性 296 11.5.1 非空约束 297 11.5.2 声明参照完整性 299 11.6 避免资源密集型查询 301 11.6.1 避免数据类型转换 301 11.6.2 使用EXISTS代替COUNT(*)验证数据存在 303 11.6.3 使用UNION ALL代替UNION 304 11.6.4 为聚合和排序操作使用索引 305 11.6.5 避免在批查询中的局部变量 306 11.6.6 小心地命名存储过程 309 11.7 减少网络传输数量 311 11.7.1 同时执行多个查询 311 11.7.2 使用SET NOCOUNT 311 11.8 降低事务开销 312 11.8.1 减少日志开销 312 11.8.2 减少锁开销 314 11.9 小结 315 第12章 阻塞分析 316 12.1 阻塞基础知识 316 12.2 理解阻塞 317 12.2.1 原子性 317 12.2.2 一致性 320 12.2.3 隔离性 320 12.2.4 持久性 321 12.3 数据库锁 321 12.3.1 锁粒度 322 12.3.2 锁升级 325 12.3.3 锁模式 326 12.3.4 锁兼容性 332 12.4 隔离级别 332 12.4.1 未提交读 333 12.4.2 已提交读 333 12.4.3 可重复读 335 12.4.4 可序列化(Serializable) 338 12.4.5 快照(Snapshot) 343 12.5 索引对锁的作用 343 12.5.1 非聚簇索引的作用 344 12.5.2 聚簇索引的作用 346 12.5.3 索引在可序列化隔离级别上的作用 346 12.6 捕捉阻塞信息 347 12.6.1 使用SQL捕捉阻塞信息 347 12.6.2 Profiler跟踪和被阻塞进程报告事件 349 12.7 阻塞解决方案 351 12.7.1 优化查询 352 12.7.2 降低隔离级别 352 12.7.3 分区争用的数据 353 12.7.4 争用数据上的覆盖索引 354 12.8 减少阻塞的建议 354 12.9 自动化侦测和收集阻塞信息 355 12.10 小结 359 第13章 死锁分析 360 13.1 死锁基础知识 360 13.2 使用错误处理来捕捉死锁 361 13.3 死锁分析 362 13.3.1 收集死锁信息 362 13.3.2 分析死锁 364 13.4 避免死锁 368 13.4.1 按照相同的时间顺序访问资源 368 13.4.2 减少被访问资源的数量 369 13.4.3 最小化锁的争用 369 13.5 小结 370 第14章 游标开销分析 372 14.1 游标基础知识 372 14.1.1 游标位置 373 14.1.2 游标并发性 374 14.1.3 游标类型 376 14.2 游标开销比较 378 14.2.1 游标位置的开销比较 378 14.2.2 游标并发性上的开销比较 380 14.2.3 在游标类型上的开销比较 381 14.3 默认结果集 383 14.3.1 好处 384 14.3.2 缺点 384 14.4 分析SQL Server游标开销 386 14.5 游标建议 390 14.6 小结 392 第15章 数据库工作负载优化 393 15.1 工作负载优化基础知识 393 15.2 工作负载优化步骤 394 15.3 捕捉工作负载 397 15.4 分析工作负载 399 15.5 识别开销最大的查询 400 15.6 确定开销最大的查询的基线资源使用 402 15.6.1 总体资源使用 402 15.6.2 详细资源使用 402 15.7 分析和优化外部因素 405 15.7.1 分析应用程序使用的批级别选项 405 15.7.2 分析统计有效性 406 15.7.3 分析碎片整理需求 406 15.8 分析开销最大的查询的内部行为 410 15.8.1 分析查询执行计划 410 15.8.2 识别执行计划中开销较大的步骤 412 15.8.3 分析处理策略的效率 412 15.9 优化代价最大的查询 412 15.9.1 修改现有索引 413 15.9.2 分析连接提示的应用 415 15.9.3 避免聚簇索引扫描操作 417 15.9.4 修改过程 418 15.10 分析对数据库工作负载的影响 420 15.11 迭代各个优化阶段 421 15.12 小结 424 第16章 SQL Server优化检查列表 425 16.1 数据库设计 425 16.1.1 平衡不足和过多的规范化 426 16.1.2 从实体完整性约束中得利 427 16.1.3 从域和参照完整性约束中得利 428 16.1.4 采用索引设计最佳实践 430 16.1.5 避免在存储过程名称中使用sp_前缀 431 16.1.6 最小化触发器的使用 431 16.2 查询设计 432 16.2.1 使用SET NOCOUNT ON命令 432 16.2.2 显式定义对象所有者 432 16.2.3 避免不可参数化的搜索条件 432 16.2.4 避免WHERE子句列上的算术运算符 433 16.2.5 避免优化器提示 434 16.2.6 远离嵌套视图 434 16.2.7 确保没有隐含的数据类型转换 435 16.2.8 最小化日志开销 435 16.2.9 采用重用执行计划的最佳实践 435 16.2.10 采用数据库事务最佳实践 436 16.2.11 消除或减少数据库游标开销 437 16.3 配置设置 437 16.3.1 Affinity Mask 437 16.3.2 内存配置选项 437 16.3.3 并行性开销阈值 438 16.3.4 最大并行度 438 16.3.5 优化即席工作负载 438 16.3.6 查询调控器开销限制 439 16.3.7 填充因子(%) 439 16.3.8 被阻塞过程阈值 439 16.3.9 数据库文件布局 439 16.3.10 数据库压缩 440 16.4 数据库管理 440 16.4.1 保持统计最新 440 16.4.2 保持最小数量的索引碎片数量 441 16.4.3 循环使用SQL错误日志文件 441 16.4.4 避免像AUTO_CLOSE或AUTO_SHRINK这样的自动化数据库功能 441 16.4.5 最小化SQL跟踪开销 442 16.5 数据库备份 442 16.5.1 增量和事务日志备份频率 442 16.5.2 备份分布 443 16.5.3 备份压缩 444 16.6 小结 444 作者介绍 作者:(美国)弗里奇(Grant Fritchey) (美国)达姆(Sajal Dam) 译者:姚军 弗里奇(Grant Fritchey),为FM Global(一家行业领先的工程和保险公司)工作,担任首席DBA。他使用各种语言(如VB、C#和Java等)开发了许多大规模的应用程序,从版本6.0开始使用SQL Server。他曾经为3家失败的.com公司担任财务和咨询工作,还是Dissecting SQL Server Execution Plans一书的作者。 达姆(Sajal Dam),拥有位于印度班加罗尔的印度理工学院的计算机科学技术硕士学位,并且使用微软技术超过16年。他已经在设计数据库应用和管理软件开发方面拥有了很广泛的背景。Saial还在从前端网页到后端数据库的基于微软技术的应用程序上,具备了故障定位和性能优化的大量经验。他有许多为《财富》500强公司设计可伸缩的数据库解决方案和最大化数据库环境性能的经验。
2022-06-15 05:32:44 57.22MB SQL Server 2008 2010
1
全套课件:SQL Server 2008数据库应用与开发教程 精品ppt
2022-06-07 20:03:33 6.92MB 文档资料 数据库 database