10.4.2 出来了,有没有人用?

过客猫2022 2021-03-04 12:36:30
10.4.2 出来了,有没有人用?
...全文
882 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 7 楼 titan_ysl 的回复:
10.4.2这个版本的UnicodeString类型搞怪,在它的说明里,
String indexes are 1-based in desktop platforms and 0-based in mobile platforms.
但是在android下,你写 UnicodeString test,test1; test="12345"; test1=test[0];,调试时,查看这个变量的值是可以访问的,在运行过test1=test[0];这个代码就会出越界错误,只能从1开始访问。而在10.2.3版本中却没这个问题,是正常的!


应该是帮助没有更新。从10.4开始,Delphi编译器有一些比较大的调整,移动版编译器的内存管理模型改成和桌面版一致,对象的ARC(Automatic Reference Counting)取消了,和桌面版一样,对象需要手动释放。而且移动版的string下标改成和桌面版一致,默认从1开始(两者都可以通过编译开关切换)。可以使用条件编译检查当前编译器设置:
Delphi: {$IFDEF ZEROBASEDSTRINGS}
C++Builder: #ifdef _DELPHI_STRING_ONE_BASED
Delphi中还可以使用编译开关{$ZEROBASEDSTRINGS ON}、{$ZEROBASEDSTRINGS OFF}随时切换两种下标起点,不过不建议在一个程序中使用两种下标起点,本来就够乱的了。还有一点需要注意,不管哪版的编译器,也不管编译开关如何,System中的几个字符串函数,Copy、Insert、Delete、Pos等等,永远使用下标1起点,这是为了兼容Turbo Pascal代码的缘故。总之,Delphi编译器已经被历代编译器设计者玩坏了~
titan_ysl 2021-03-12
  • 打赏
  • 举报
回复
10.4.2这个版本的UnicodeString类型搞怪,在它的说明里, String indexes are 1-based in desktop platforms and 0-based in mobile platforms. 但是在android下,你写 UnicodeString test,test1; test="12345"; test1=test[0];,调试时,查看这个变量的值是可以访问的,在运行过test1=test[0];这个代码就会出越界错误,只能从1开始访问。而在10.2.3版本中却没这个问题,是正常的!
过客猫2022 2021-03-08
  • 打赏
  • 举报
回复
引用 3 楼 vc_dreamver 的回复:
如果不用clang作用不大。另外FMX在高清屏下感觉又出现了新BUG,如果桌面放缩了,FORM位置都不正常,TPopupMenu也显示不出来,挖掘了半天发现在程序设置里有选项,high DPI都不正常。不过有了Twincompile编译速度可以提高不少,但是code insight依然很差。还是有进步的:D
它最大的梗就是代码提示。
  • 打赏
  • 举报
回复
感觉不应该有这么明显的BUG,高DPI支持从10.0 Seattle开始就有了(2015年),经过这么多版的发展,已经比较完善了
ooolinux 2021-03-05
  • 打赏
  • 举报
回复
引用 3 楼 vc_dreamver 的回复:
如果不用clang作用不大。另外FMX在高清屏下感觉又出现了新BUG,如果桌面放缩了,FORM位置都不正常,TPopupMenu也显示不出来,挖掘了半天发现在程序设置里有选项,high DPI都不正常。不过有了Twincompile编译速度可以提高不少,但是code insight依然很差。还是有进步的:D

Form貌似有个Scaled 属性
vc_dreamver 2021-03-05
  • 打赏
  • 举报
回复
如果不用clang作用不大。另外FMX在高清屏下感觉又出现了新BUG,如果桌面放缩了,FORM位置都不正常,TPopupMenu也显示不出来,挖掘了半天发现在程序设置里有选项,high DPI都不正常。不过有了Twincompile编译速度可以提高不少,但是code insight依然很差。还是有进步的:D
ooolinux 2021-03-04
  • 打赏
  • 举报
回复
不知道改进大不大
  • 打赏
  • 举报
回复
@Kallen
完整清晰版 PDF ,有目录。共 270MB,分为 2 个分卷 中文版Excel 2007 高级VBA编程 宝典 OFFICE2007 中文版Excel 2007高级VBA编程宝典 原价:99.99元 作者:(美)沃肯巴赫(Walkenbach,J) 著;冯飞,焦瑜净 译 出版社:清华大学出版社 出版日期:2009-2-1 ISBN:9787302194675 字数:1294000 页码:872 编辑推荐 -------------------------------------------------------------------------------- “电子表格先生”潜心力作,世界级Excel畅销书。   “千锤百炼”的Excel畅销书    没有人比“电子表格先生”更了解Excel 2007。本书涵盖了使用VBA 扩展Excel 功能的方法、提示和思想。Excel 2007 还有一些绝秘的新技巧,John Walkenbach 将帮助您掌握它们。 本书的作者John Walkenbach 是享有国际美誉的“电子表格先生”。他在书中分享了自己15 年来使用Excel 的经验,毫无保留地传授了学习和使用Excel 的所有知识,为读者掌握Excel 提供了绝佳的途径。本书的前两个版本均已获得巨大成功,在前两版的基础上,本书升华了已有的精华,并结合Excel 2007 的全新特性,是一部技术含量高、实践性强的经典著作。 本书将介绍如何定制Excel 用户窗体、开发新实用程序、用VBA 处理图表及数据透视表,以及创建事件处理应用程序。还将介绍如何使用VBA 子过程和函数过程、与其他应用程序轻松交互、构建用户友好的工具栏、菜单和帮助系统等。 内容提要 -------------------------------------------------------------------------------- 这本全能的手册适合对Excel感兴趣的所有人群,不但内容丰富、权威,且条理清晰、结构合理。本书的作者是当之无愧的世界级Excel电子表格专家,他为读者倾心打造了这本专著,书中汇聚他15年来使用Excel的所有经验,涵盖Excel应用和VBA编程涉及的方方面面,是经典著作Excel 2003 Power Programming with VBA的全新升级版。 目录 -------------------------------------------------------------------------------- 第Ⅰ部分 Excel基础知识  第1章 Excel 2007的起源   1.1 电子表格软件的简史    1.1.1 最初的起源:VisiCalc    1.1.2 Lotus 1-2-3     1.1.3 Quattro Pro   1.1.4 Microsoft Excel   1.2 Excel 对开发人员的重要性   1.3 Excel在Microsoft 战略中的角色  第2章 Excel概述   2.1 关于对象   2.2 工作簿    2.2.1 工作表    2.2.2 图表工作表    2.2.3 XLM宏工作表    2.2.4 Excel 5/95对话框编辑表   2.3 Excel的用户界面    2.3.1 功能区的引入    2.3.2 快捷菜单    2.3.3 对话框    2.3.4 键盘快捷键    2.3.5 智能标记    2.3.6 任务窗格   2.4 自定义屏幕显示   2.5 数据录入   2.6 公式、函数和名称   2.7 选择对象   2.8 格式    2.8.1 数字格式    2.8.2 样式格式   2.9 保护选项    2.9.1 保护公式以防被重写    2.9.2 保护工作簿的结构    2.9.3 运用密码来保护工作簿    2.9.4 使用密码来保护VBA代码   2.10 图表   2.11 形状和SmartArt   2.12 数据库访问    2.12.1 工作表数据库    2.12.2 外部数据库   2.13 Internet特性   2.14 分析工具    2.14.1 分级显示    2.14.2 分析工具库    2.14.3 数据透视表    2.14.4 Solver    2.14.5 XML特性   2.15 加载项   2.16 宏和编程   2.17 文件格式   2.18 Excel的帮助系统  第3章 公式的使用技巧   3.1 公式概述   3.2 计算公式   3.3 单元格和单元格区域引用    3.3.1 为什么使用不是相对的引用    3.3.2 R1C1表示法    3.3.3 引用其他的工作表或工作簿   3.4 使用名称    3.4.1 命名单元格和单元格区域    3.4.2 将名称应用于现有的引用    3.4.3 交叉名称    3.4.4 命名列和行    3.4.5 名称的作用范围    3.4.6 命名常量    3.4.7 命名公式    3.4.8 命名对象   3.5 公式错误   3.6 数组公式    3.6.1 一个数组公式的例子    3.6.2 数组公式日历    3.6.3 数组公式的优缺点   3.7 计数和求和技巧    3.7.1 计数公式的示例    3.7.2 求和公式的示例    3.7.3 其他计数工具   3.8 使用日期和时间    3.8.1 输入日期和时间    3.8.2 使用1900年之前的日期   3.9 创建大公式  第4章 理解Excel的文件   4.1 启动Excel   4.2 文件类型    4.2.1 Excel文件格式    4.2.2 文本文件格式    4.2.3 数据库文件格式    4.2.4 其他文件格式   4.3 模板文件的处理    4.3.1 查看模板    4.3.2 创建模板    4.3.3 创建工作簿模板   4.4 Excel文件的内部情况    4.4.1 仔细分析一个文件    4.4.2 为什么文件格式很重要   4.5 QAT文件   4.6 XLB文件   4.7 加载宏文件   4.8 Excel在注册表中的设置    4.8.1 关于注册表    4.8.2 Excel的设置 第Ⅱ部分 Excel应用程序开发  第5章 电子表格应用程序的内涵   5.1 电子表格应用程序   5.2 开发人员和终端用户    5.2.1 谁是开发人员    5.2.2 电子表格应用程序用户的分类    5.2.3 电子表格应用程序的客户   5.3 用Excel解决问题   5.4 基本的电子表格应用程序类型    5.4.1 快捷但质量不高的电子表格应用程序    5.4.2 自己创作、自己使用的电子表格应用程序    5.4.3 单用户电子表格应用程序    5.4.4 意大利面条式电子表格应用程序    5.4.5 实用电子表格应用程序    5.4.6 包含工作表函数的加载宏电子表格    5.4.7 单元块预算式电子表格应用程序    5.4.8 假设分析模型式电子表格应用程序    5.4.9 数据存储和访问电子表格应用程序    5.4.10 数据库前端电子表格应用程序    5.4.11 统包式电子表格应用程序  第6章 电子表格应用程序开发的基础   6.1 确定用户需求   6.2 规划满足用户需求的应用程序   6.3 确定最合适的用户界面    6.3.1 创建自定义的功能区    6.3.2 创建自定义的快捷菜单    6.3.3 创建快捷键    6.3.4 创建自定义的对话框    6.3.5 在工作表上使用ActiveX控件    6.3.6 执行开发的成果   6.4 使自己关心终端用户    6.4.1 测试应用程序    6.4.2 尽量完善应用程序的安全性    6.4.3 让应用程序变得美观和直观    6.4.4 创建用户帮助系统    6.4.5 将开发工作进行归档    6.4.6 将电子表格应用程序分发给用户    6.4.7 在需要的时候更新电子表格应用程序   6.5 其他开发问题    6.5.1 用户安装的Excel版本    6.5.2 语言问题    6.5.3 系统速度    6.5.4 视频模式 第Ⅲ部分 理解VBA  第7章 VBA概述   7.1 BASIC的一些基本背景   7.2 关于VBA    7.2.1 对象模型    7.2.2 VBA与XLM的对比   7.3 VBA的基础知识   7.4 Visual Basic编辑器概述    7.4.1 显示Excel的“开发工具”选项卡    7.4.2 激活VBE    7.4.3 VBE窗口   7.5 使用“工程资源管理器”窗口    7.5.1 添加新的VBA模块    7.5.2 移除VBA模块    7.5.3 导出和导入对象   7.6 使用“代码”窗口    7.6.1 窗口的最小化和最大化    7.6.2 VBA代码的存储    7.6.3 VBA代码的输入   7.7 VBE环境的定制    7.7.1 使用“编辑器”选项卡    7.7.2 使用“编辑器格式”选项卡    7.7.3 使用“通用”选项卡    7.7.4 使用“可连接的”选项卡   7.8 宏录制器    7.8.1 宏录制器实际记录哪些内容    7.8.2 相对模式还是绝对模式    7.8.3 选项的录制    7.8.4 整理己录制的宏   7.9 关于对象和集合    7.9.1 对象层次结构    7.9.2 关于集合    7.9.3 对象的引用   7.10 属性和方法    7.10.1 对象的属性    7.10.2 对象的方法   7.11 Comment对象示例    7.11.1 查看有关Comment对象的帮助    7.11.2 Comment对象的属性    7.11.3 Comment对象的方法    7.11.4 Comments集合    7.11.5 关于Comment属性    7.11.6 Comment对象中的对象    7.11.7 确定单元格中是否含有Comment对象    7.11.8 添加新的Comment对象   7.12 一些有用的应用程序属性   7.13 Range对象的使用    7.13.1 Range属性    7.13.2 Cells属性    7.13.3 Offset属性   7.14 关于对象的更多信息    7.14.1 需要牢记的基本概念    7.14.2 学习有关对象和属性的更多信息  第8章 VBA编程基础   8.1 VBA语言元素概览   8.2 注释   8.3 变量、数据类型和常量    8.3.1 数据类型的定义    8.3.2 声明变量    8.3.3 变量的作用域    8.3.4 常量的使用    8.3.5 字符串的使用    8.3.6 日期的使用   8.4 赋值语句   8.5 数组    8.5.1 数组的声明    8.5.2 多维数组的声明    8.5.3 动态数组的声明   8.6 对象变量   8.7 用户定义数据类型   8.8 内置函数   8.9 对象和集合的处理    8.9.1 With-End With构造    8.9.2 For Each-Next构造   8.10 代码执行的控制    8.10.1 GoTo语句    8.10.2 If-Then构造    8.10.3 Select Case构造    8.10.4 指令的循环块  第9章 VBA的Sub过程   9.1 关于过程    9.1.1 Sub过程的声明    9.1.2 过程的作用域   9.2 执行Sub过程    9.2.1 通过“运行子过程/用户窗体”命令执行过程    9.2.2 从“宏”对话框执行过程    9.2.3 用Ctrl 快捷键组合执行过程    9.2.4 从功能区执行过程    9.2.5 从自定义快捷菜单中执行过程    9.2.6 从另一个过程执行过程    9.2.7 通过单击对象执行过程    9.2.8 在事件发生时执行过程    9.2.9 从“立即窗口”执行过程   9.3 向过程中传递参数   9.4 错误处理技术    9.4.1 捕获错误    9.4.2 错误处理示例   9.5 使用Sub过程的实际例子    9.5.1 目标    9.5.2 工程需求    9.5.3 已经了解的信息    9.5.4 着手处理    9.5.5 需要了解哪些信息    9.5.6 初步的录制工作    9.5.7 初始设置    9.5.8 代码的编写    9.5.9 排序过程的编写    9.5.10 更多的测试    9.5.11 修复问题    9.5.12 实用程序的可用性    9.5.13 对工程进行评估  第10章 创建Function过程   10.1 Sub过程与Function过程的对比   10.2 为什么创建自定义的函数   10.3 介绍性的函数示例    10.3.1 一个自定义函数    10.3.2 在工作表中使用函数    10.3.3 在VBA过程中使用函数    10.3.4 分析自定义函数   10.4 Function过程    10.4.1 声明函数    10.4.2 函数的作用域    10.4.3 执行Function过程   10.5 Function过程的参数   10.6 函数示例    10.6.1 无参数的函数    10.6.2 带有一个参数的函数    10.6.3 带有两个参数的函数    10.6.4 使用数组作为参数的函数    10.6.5 带有可选参数的函数    10.6.6 返回VBA数组的函数    10.6.7 返回错误值的函数    10.6.8 带有不定数量的参数的函数   10.7 模拟Excel的SUM函数   10.8 函数的调试   10.9 使用“插入函数”对话框    10.9.1 指定函数类别    10.9.2 添加函数说明   10.10 使用加载宏存储自定义的函数   10.11 使用Windows API    10.11.1 Windows API示例    10.11.2 确定Windows目录    10.11.3 检测Shift键    10.11.4 了解更多有关API 函数的信息  第11章 VBA编程示例和技巧   11.1 处理单元格区域    11.1.1 复制单元格区域    11.1.2 移动单元格区域    11.1.3 复制大小可变的单元格区域    11.1.4 选中或者识别各种类型的单元格区域    11.1.5 提示输入单元格中的值    11.1.6 在下一个空单元格中输入一个值    11.1.7 暂停宏的运行以便获得用户选中的单元格区域    11.1.8 计算选中的单元格的数目    11.1.9 确定选中的单元格区域的类型    11.1.10 有效地遍历选中的单元格区域    11.1.11 删除所有空行    11.1.12 任意次数地复制行    11.1.13 确定单元格区域是否包含在另一个单元格区域内    11.1.14 确定单元格的数据类型    11.1.15 读写单元格区域    11.1.16 在单元格区域中插入值的更好方法    11.1.17 传递一维数组中的内容    11.1.18 将单元格区域传递给Variant类型的数组    11.1.19 按数值选择单元格    11.1.20 复制非连续的单元格区域   11.2 处理工作簿和工作表    11.2.1 保存所有工作簿    11.2.2 保存和关闭所有工作簿    11.2.3 隐藏除选区之外的区域    11.2.4 同步工作表   11.3 VBA技巧    11.3.1 切换布尔类型的属性值    11.3.2 确定打印页面的数量    11.3.3 显示日期和时间    11.3.4 获得字体列表    11.3.5 对数组进行排序    11.3.6 处理一系列文件   11.4 使用在代码中的一些有用的函数    11.4.1 FileExists函数    11.4.2 FileNameOnly函数    11.4.3 PathExists函数    11.4.4 RangeNameExists函数    11.4.5 SheetExists函数    11.4.6 WorkbookIsOpen函数    11.4.7 检索已经关闭的工作簿中的值   11.5 一些有用的工作表函数    11.5.1 返回单元格的格式信息    11.5.2 会说话的工作表    11.5.3 显示在保存或打印文件时的时间    11.5.4 理解对象的父亲    11.5.5 计算值介于两个值之间的单元格数目    11.5.6 计算单元格区域中可见单元格的数目    11.5.7 确定行或列中最后一个非空的单元格    11.5.8 字符串与模式匹配    11.5.9 从字符串中提取第n个元素    11.5.10 多功能的函数    11.5.11 SheetOffset函数    11.5.12 返回所有工作表中数据的最大值    11.5.13 返回没有重复的随机整数元素的数组    11.5.14 随机化单元格区域   11.6 Windows API调用    11.6.1 确定文件的关联性    11.6.2 确定磁盘驱动器信息    11.6.3 确定默认打印机的信息    11.6.4 确定视频显示器的信息    11.6.5 为应用程序添加声音    11.6.6 读写注册表 第Ⅳ部分 用户窗体  第12章 多种自定义对话框的方法   12.1 创建用户窗体之前需要了解的内容   12.2 使用输入框    12.2.1 VBA的InputBox函数的使用    12.2.2 Excel的InputBox方法   12.3 VBA的MsgBox函数   12.4 Excel的GetOpenFilename方法   12.5 Excel的GetSaveAsFilename方法   12.6 提示输入目录名称    12.6.1 使用Windows API函数选中目录    12.6.2 使用FileDialog对象选中目录   12.7 显示Excel的内置对话框    12.7.1 关于Dialogs集合    12.7.2 执行功能区命令   12.8 显示数据记录单    12.8.1 使得数据记录单变得可以访问    12.8.2 通过使用VBA来显示数据记录单  第13章 用户窗体概述   13.1 Excel如何处理自定义对话框   13.2 插入新的用户窗体   13.3 向用户窗体添加控件   13.4 “工具箱”中的控件    13.4.1 复选框    13.4.2 组合框    13.4.3 命令按钮    13.4.4 框架    13.4.5 图像    13.4.6 标签    13.4.7 列表框    13.4.8 多页    13.4.9 选项按钮    13.4.10 RefEdit    13.4.11 滚动条    13.4.12 数值调节钮    13.4.13 TabStrip    13.4.14 文本框    13.4.15 切换按钮   13.5 调整用户窗体的控件   13.6 调整控件的属性    13.6.1 使用“属性”窗口    13.6.2 共同属性    13.6.3 更多属性的信息    13.6.4 适应键盘用户的需求   13.7 显示和关闭用户窗体    13.7.1 显示用户窗体    13.7.2 关闭用户窗体    13.7.3 关于事件处理程序   13.8 创建用户窗体的示例    13.8.1 创建用户窗体    13.8.2 编写代码显示对话框    13.8.3 测试对话框    13.8.4 添加事件处理程序    13.8.5 验证数据的有效性    13.8.6 完成的对话框作品   13.9 理解用户窗体的事件    13.9.1 了解事件    13.9.2 用户窗体的事件    13.9.3 数值调节钮的事件    13.9.4 数值调节钮与文本框配对   13.10 引用用户窗体的控件   13.11 自定义“工具箱”    13.11.1 更改图标或提供文本    13.11.2 添加新页    13.11.3 自定义或组合控件    13.11.4 添加新的ActiveX控件   13.12 创建用户窗体的模板   13.13 用户窗体检验表  第14章 用户窗体示例  第15章 用户窗体的高级技巧 第Ⅴ部分 高级编程技巧  第16章 用VBA开发Excel实用程序  第17章 使用数据透视表  第18章 使用图表  第19章 理解Excel的事件  第20章 与其他应用程序的交互  第21章 创建和使用加载宏 第Ⅵ部分 开发应用程序  第22章 使用功能区  第23章 使用快捷菜单  第24章 为应用程序提供帮助  第25章 开发面向用户的应用程序 第Ⅶ部分 其他主题  第26章 兼容性问题  第27章 用VBA处理文件  第28章 使用Visual Basic组件  第29章 理解类模块  第30章 使用颜色  第31章 有关Excel编程的常见问题 第Ⅷ部分 附录
书名: 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强公司设计可伸缩的数据库解决方案和最大化数据库环境性能的经验。

551

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 茶馆
社区管理员
  • 茶馆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧