优化数据库访问策略

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
FROM Sales.Customer AS c CROSS APPLY Sales.GetLastOrdersForCustomer(c.CustomerID,3) AS glofc ORDER BY c.CustomerID,glofc.SalesOrderID;
STATIC
DYNAMIC
函数不能修改数据库中的数据
✓ 确定函数类型 ✓ 一个任务一个函数 ✓ 在函数中使用限定名称 ✓ 在打算使用函数时考虑对性能的影响 ✓ 考虑SQL Server是否能够对函数结果进行索引 ✓ 函数不能包含结构化的错误处理
SELECT soh.CustomerID, soh.SalesOrderID
浏览树状层次结构
SQL Server 2005以后可以使用CTE 不必使用
逐行处理
可以考虑使用.net存储过程在应用程 序服务器上完成处理
有时使用
FROM Sales.SalesOrderHeader AS soh WHERE soh.SalesOrderID =
dbo.GetLatestBulkOrder(soh.CustomerID) ORDER BY soh.CustomerID, soh.SalesOrderID;
SELECT c.CustomerID, c.AccountNumber, glofc.SalesOrderID, glofc.OrderDate
OPTION 或者 TABLESAMPLE 子句 • 创建全文索引定义和查询 • 在临时表创建视图
比较得到的性能和成本开销
使用索引视图来改进报表查询的性能
创建索引视图的需求条件
• 在视图中使用的函数必须是确定性的 • ANSI_NULLS 和 QUOTED_IDENTIFIER 选项必须设置为 ON • 在CREATE或者ALTER视图语句中使用 SCHEMABINDING 子句
反正规划连接数据
一般使用游标来计算较为直观,但也 有时使用 可以考虑使用基于集合的计算
建立透视分析,或称之为Cross-table 查询
在SQL Server 2000以后可以使用 CASE WHEN语法,SQL Server 2005以后可以使用PIVOT
不必使用
累计,移动平Biblioteka Baidu求和
一般使用相关子查询也可以完成计算, 总是使用 但是通常比游标性能还差
设计 T-SQL 存储过程来重用查询 最小化重编译任务 T-SQL 存储过程 使用表变量取代临时表 使用 EXEC ... WITH RECOMPILE 使用 CREATE PROCEDURE ... WITH RECOMPILE
✓ 标量函数 ✓ 表值函数 ✓ 嵌入式和多语句表值函数 ✓ 系统函数
KEYSET
FAST_FORWARD
17
18
开发者建立游标的六个原因
问题类型 复杂的商业逻辑
建议方式
尽量重新设计商业逻辑的计算方式, 测试是否可以使用CASE WHEN语法 来完成计算 利用一系列的集合运算,搭配临时表 和表变量来完成逻辑运算
是否使用游标 很少情况
动态的组织SQL语法的执行
依照特定的逻辑,搭配数据来动态组 总是使用 织DCL语句完成操作
✓ 在存储过程内使用限定名称 ✓ 保持一致的 SET 选项 ✓ 使用一致的命名标准(无 sp_ 前缀) ✓ Use @@nestlevel 来查看当前的嵌套级别(最大32) ✓ 一个任务一个存储过程
使用 T-SQL 存储过程来直接访问所有数据表
使用基于集合的操作而不使用游标
使用自带的T-SQL构造器来取代临时表
设计视图
您可以
• 使用视图隐藏连接 • 使用视图隐藏敏感数据 • 仅在当前数据库创建视图 • 保证视图名字在每一个架构下都是唯一
的 • 将INSTEAD OF触发器关联到视图 • 保证视图的嵌套不超过32层
您不可以
• 关联DEFAULT定义到视图 • 关联AFTER触发器到视图 • 包括COMPUTE, COMPUTE BY, ORDER BY,
相关文档
最新文档