630 likes | 1.16k Views
Oracle 与 .NET : 性能与部署最佳实践. Christian Shay Oracle 首席产品经理. 议题. 优化流程 优化 ODP.NET 性能 连接 数据检索和更新 ODP.NET 数据类型 缓存 ODP.NET 部署. 议题. 从 Visual Studio 中优化 Oracle 数据库性能 SQL Tuning Advisor Oracle Performance Analyzer. Oracle 的 .NET 产品. Oracle Developer Tools for Visual Studio
E N D
Oracle 与 .NET:性能与部署最佳实践 Christian ShayOracle 首席产品经理
议题 • 优化流程 • 优化 ODP.NET 性能 • 连接 • 数据检索和更新 • ODP.NET 数据类型 • 缓存 • ODP.NET 部署
议题 • 从 Visual Studio 中优化 Oracle 数据库性能 • SQL Tuning Advisor • Oracle Performance Analyzer
Oracle 的 .NET 产品 • Oracle Developer Tools for Visual Studio • 是 Visual Studio 2012、2010、2008 一个紧密集成的“插件” • Oracle Data Provider for .NET (ODP.NET) • 符合 ADO.NET 的数据提供程序 • 对 Oracle 数据库进行原生访问 • 利用高级 Oracle 数据库特性 • RAC、性能、安全性、数据类型、XML 等 • 两者都可从以下网址免费下载: • http://otn.oracle.com/dotnet/
Oracle .NET 应用程序性能 — 优化步骤 • .NET 数据访问调优 • 使用 ODP.NET 最佳实践 • SQL 调优 • 在 Visual Studio 中使用 SQL Tuning Advisor • 实际情况下的数据库调优 • Visual Studio 中的 Oracle Performance Analyzer 可检测到您漏掉的问题 • 可能需要根据发现的问题修改应用程序 • 在测试阶段或生产环境中均可使用
连接 • 连接池 (CP) • 默认情况下,OracleConnection包含连接池 • 使用 Windows 性能监视器监视和调优它们 • 显式关闭/清除连接(及所有对象) • 无需依赖垃圾收集器 • 该建议适合于所有 ODP.NET 对象
监视连接 • ODP.NET 性能计数器 • 通过 ODP.NET 11.1.0.6.20 或更高版本提供 • 使用 Windows 性能监视器进行监视 • ODP.NET 跟踪
连接管理 — 集群和备用数据库 • RAC 自动连接负载平衡 • Load Balancing = true • RAC 和 Data Guard 自动转移“坏”连接 • HA Events = true
命令 — 绑定变量 • 防止重新解析频繁执行的语句 • 与SQL 和 PL/SQL 语句一起使用 • 改善后续的命令执行 • 文字型数值更改会强制执行重新解析和重新优化 • 文字型数值应该变为绑定变量 • 已执行的语句存储在 Oracle 共享池中 • 重新解析和重新优化将耗用CPU 并需要共享池锁
命令 — 语句缓存 • 在共享池中保留以前已解析的语句 • 游标在客户端保持打开状态以实现更加快速的重用 • 无需在服务器上执行额外的查找 • 元数据保留在客户端 • 缓存最近使用的语句 • 与SQL 和 PL/SQL 语句一起使用 • 与绑定变量一起使用的效果最好 • 自调优的缓存大小 — 默认情况下启用 • 无需更改代码
命令 — 数据检索 • 控制每次数据库往返所检索的数据量 • 检索太多数据会导致使用过多的客户端内存 • 检索太少数据会导致数据库往返增多 • 使用OracleCommand.RowSize 和 OracleDataReader.FetchSize控制结果的大小 • 在语句执行后填充RowSize • 在运行时动态设置 • 可以将FetchSize设置为RowSize的倍数
演示 FetchSize和RowSize
命令 — 语句批处理 • 使用OracleDataAdapter.UpdateBatchSize批量处理来自DataSet的更新 • 在一次数据库往返中执行多个命令 • 使用匿名 PL/SQL • 对不同的语句或类似的语句很有用
命令 — 使用数组进行大规模数据移动 • PL/SQL 关联数组 • 在 .NET 和数据库之间传递大量具有相同数据类型的数据 • 使用参数数组绑定 • 如果多次执行相同的语句,该方法很有用 • 绑定变量相同,变量值可以不同 • 对绑定数组中的每个元素执行一次 • 切记:PL/SQL 关联数组和参数数组绑定是两个不同的概念
可提升的事务 • 运行时将本地事务提升为分布式事务 • 提高应用程序性能 • 较低资源使用 • 默认情况下启用 • 要求 • 首先连接至 Oracle Database 11g (11.1) 或更高版本 • 随后连接至任何其他版本或数据库
ODP.NET 数据类型 • 避免不必要的数据类型转换 • .NET 与 ODP.NET 类型 • OracleDataReader类型访问器 • OracleParameter.DbType 与 OracleParameter.OracleDbType • 可以选择将 Oracle 数据类型存储在DataSet 中 • OracleDataAdapter.ReturnProviderSpecificTypes = true • 在 ADO.NET 2.0 中提供
REF 游标 • 根据需要检索数据 • 通过FetchSize控制检索的数据 • 仅用 REF 游标结果的一部分填充DataSet • 对检索哪些 REF 游标数据及如何检索进行显式控制 • 将结果集检索延迟至需要时进行 • 将 REF Crusors作为输入存储过程参数返回 • OracleRefCursor 类
SecureFiles 与 LOB • 数据检索选项 • 用 LOB 定位器延迟检索(默认) • 使用OracleCommand.InitialLOBFetchSize立即检索数据 • 使用 Read 方法检索部分数据 • 使用 Search 方法查找要检索的数据
SecureFiles 与 LOB • 更新/插入/删除 • 无需将数据检索到客户端即可修改 LOB • 使用 LOB 定位器 • 在 Oracle Database 11g 中使用 SecureFile 数据类型
Oracle .NET 缓存解决方案 • Oracle .NET 数据库缓存 • 客户端结果缓存 • 连续查询通知 (CQN) • TimesTen 内存数据库 • 在服务器更改时自动更新/警告客户端缓存 • 每个缓存满足各自独立的缓存要求
Oracle 客户端结果缓存 • 自动更新查询结果集的缓存 • 优点 • 易于使用 • 无需更改代码 • 持续生成快照 • 无需用户干预即可刷新缓存 • 更高的可伸缩性和性能 • 从客户端而不是从服务器检索数据 • 没有额外的数据库往返
Oracle 客户端结果缓存更新 • 1. 在数据更改时,客户端收到有关后续数据库往返(或最大延迟)的更改通知 • 在现有客户端数据库往返上搭载失效通知 • 对缓存结果尚无更改 • 2. 缓存等待下次执行以刷新结果 • 不发起独立的数据库往返 • 没有不必要的数据库流量 • 缓存条目不超时 • 使用最近最少使用的算法
Oracle 连续查询通知 (CQN) • 易于使用自动化缓存且具有更强的编程控制 • 也称为数据库更改通知 • 相比客户端结果缓存的优点 • 更好地控制缓存行为 • 多个用户访问相同的结果时会怎么样? • 仅需要部分缓存数据时会怎么样? • 应将查询缓存多长时间? • 刷新缓存时是否要执行额外逻辑?
数据更改 应用程序 Execute() OracleCommand 数据字典 表 通知请求 添加相关性 OnChange OracleDependency 通知 队列 Invalidate() 监听器
Oracle TimesTen 内存数据库 • 功能齐全的关系数据库 • 与 Oracle 兼容的 SQL 和 PL/SQL,具有 ODP.NET • 持久性与持久保存 • 具有 ACID 属性的事务 • 实现持久性的各种灵活选项 • 卓越性能 • 即时响应、高吞吐量、可嵌入 内存优化的关系数据库
ODP.NET 未受控驱动程序 受控 数据库 未受控 ODP.NET 未受控 DLL ODP.NET Oracle.DataAccess.dll NET OCI Oracle
ODP.NET 完全受控 数据库 受控 ODP.NET Oracle.ManagedDataAccess.dll Oracle
受控 ODP.NET • 完全受控的提供程序 • 组合件 • Oracle.ManagedDataAccess.dll • 无需其他 Oracle 客户端文件 • 除非使用分布式事务 • 命名空间 • Oracle.ManagedDataAccess.Client • Oracle.ManagedDataAccess.Types
分布式事务 • 需要额外的受控 DLL(目前) • Oracle.ManagedDataAccessDTC.dll • 如果不使用分布式事务,则无需部署额外的 DLL • 没有直接引用 DLL • 隐式加载 • 具有相同名称的两个版本:32 位和 x64 • 仍须匹配 32 位或 64 位 COM 调用
受控 ODP.NET 网络配置 • 方案 1:单配置文件部署 • .NET 配置文件包含 TNS 和 sqlnet.ora 设置 • 即 Machine.config、web.config、app.config • 方案 2:多文件配置 • .NET 配置文件 • Tnsnames.ora 和 sqlnet.ora • 工作目录下配置文件或 ORA 文件中的 TNS_ADMIN • 方案 3:无配置文件 • 在数据源属性中存储连接信息
受控 ODP.NET 网络配置 • .NET 配置文件中的数据源别名。 • .NET 配置文件中“TNS_ADMIN”所指定位置的 tnsnames.ora 文件中的数据源别名。 • 与 .exe 位于相同目录下的 tnsnames.ora 文件中的数据源别名。 • 位于 %TNS_ADMIN% 下的 tnsnames.ora 文件中的数据源别名 • 位于 %ORACLE_HOME%\network\admin 下的 tnsnames.ora 文件中的数据源别名 优先顺序
演示 部署受控 ODP.NET
ODP.NET 未受控驱动程序 受控 数据库 未受控 ODP.NET 未受控 DLL ODP.NET Oracle.DataAccess.dll NET OCI Oracle
.NET 部署平台目标 • 选择“x86”或“x64” • 取决于平台目标 • 确保 ODP.NET 版本支持该平台 • 不要使用“AnyCPU”(默认) • “AnyCPU”指示组合件在当前 CPU 上本地运行 • x86 或 x64 • 可能安装了非计划的 ODP.NET 平台版本 未受控 ODP.NET
部署:即时客户端 (IC) 优点 • 对安装过程实施控制 • Xcopy • 对安装过程实施细粒度控制 • 非常适合于大规模部署或 ISV 打包 • OUI — 非常适合于小规模部署 • 与标准安装相比,安装大小较小 • Xcopy 安装 — 占用空间最小 • OUI 安装 — 占用空间小 未受控 ODP.NET
在 .NET 中管理多个 Oracle 主目录 • 适用于 ODP.NET 10.2.0.4 和更高版本的解决方案 • ODP.NET 读取 .NET 配置文件来查找未受控的 Oracle DLL • 即使使用了相同的 ODP.NET 受控版本,每个应用程序也都可以使用不同的 Oracle 客户端 DLL 未受控 ODP.NET
在 .NET 中管理多个 Oracle 主目录 • DLL 搜索顺序 • 1. 当前应用程序目录 • 2. 应用程序配置或web.config • 3. Machine.config • 4. Windows 注册表 • HKLM\Software\Oracle\ODP.NET\<版本>\DllPath • 5. Windows 系统PATH设置 未受控 ODP.NET
Visual Studio 中的性能调优— SQL Tuning Advisor • 设计新的 SQL 语句时使用 • 对查询窗口中的即席 SQL 语句进行调优 • 对 Oracle Performance Analyzer 发现的瓶颈 SQL 进行调优 • 当 SQL 运行负载性能低下时使用
SQL Tuning Advisor • 要求 • ADVISOR 权限 • 针对 Oracle Diagnostic Pack 的 Oracle 数据库许可证 • 针对 Oracle Tuning Pack 包的 Oracle 数据库许可证 • 如何运行: • Oracle 查询窗口中的“Tune SQL”按钮 • Oracle Performance Monitor —“Tune SQL”按钮
SQL Tuning Advisor • “Implement Findings”按钮 • 自动解决某些发现类型的问题 • “View Report”按钮 • 查看有关如何解决问题的更详细信息
演示 SQL Tuning Advisor
Visual Studio 中的性能调优 —Oracle Performance Analyzer • 检测运行负载时应用程序使用数据库存在的性能问题 • 要求 • SYSDBA • 针对 Oracle Diagnostic Pack 的 Oracle 数据库许可证 • 可在测试过程中使用 • 也可用于生产应用程序
Oracle Performance Analyzer • 易于使用 • 运行您的应用程序 • 输入要分析的时间量 • 按“Start”启动计时器 • 需要足够的“databasetime”以获得结果 • 查看结果和操作 • 实施所建议的操作
AWR 和 ADDM • 内置于 Oracle Database 10g • 自动负载信息库 (AWR) • 由statspack演变而来 • 内置资料库 • 定期捕捉性能统计信息 • 自动数据库诊断监控器 (ADDM) • 系统地分析捕获到的 AWR 统计信息 • 生成建议