此博客介绍了简单但有用的提示和优化,以提高存储过程的性能。

0.with recompile:重编译

  exec uspGetSalesInfoForDateRange ‘1/1/2009’, 31/12/2009 with recompile

1.使用SET NOCOUNT ON

  SQL Server在运行select或DML操作时返回信息性消息。如果一个过程有许多这样的语句,游标或while循环SQL Server将显示许多此类消息,增加网络流量。可以使用SET NOCOUNT ON来抑制这些消息,并可以通过减少网络流量来提高性能。

2.使用完全限定的程序名称

  完全限定的对象名称是database.schema.objectname。当存储过程作为schemaname.procedurename调用时,SQL Server可以快速查找已编译的计划,而不是在未指定schemaname时查找其他模式中的过程。这可能不会对性能产生很大的推动作用,但应该遵循最佳实践。过程中的所有对象也应该称为schemaname.objectname。

3. sp_executesql而不是Execute用于动态查询

  sp_executesql允许重用缓存计划并防止SQL注入。我们来看一个计划重用的例子。

 
1
2
3
4
5
6
7
8
9
10
DBCC FREEPROCCACHE
GO
Declare
@dynamic_sql varchar(max),
@salesorderid int
SET @salesorderid=43660
 
SET @dynamic_sql=' SELECT * FROM Sales.SalesOrderDetail where SalesOrderID='
+ CAST(@salesorderid AS VARCHAR(100))
EXECUTE(@dynamic_sql)

上面的查询使用EXECUTE命令为salesorderid 43660和43661的两个值执行动态查询。让我们分析缓存的计划。

  如上面的快照所示,两个salesorderids有两个单独的计划。现在让我们使用sp_execute SQL执行相同的查询并分析缓存的计划。

 
1
2
3
DECLARE @dynamic_sql NVARCHAR(100)
SET @dynamic_sql = N'SELECT * FROM Sales.SalesOrderDetail where SalesOrderID=@salesorderid'
EXECUTE sp_executesql @dynamic_sql, N'@salesorderid int', @salesorderid = 43661

  上面的查询使用sp_executesql为2个不同的salesorderid值执行动态查询。我们来分析一下缓存的计划。

  如上面的快照所示,只缓存了一个计划,并用于salesorderid的不同值。

4.使用IF EXISTS AND SELECT

  IF EXISTS用于检查记录,对象等的存在。并且是一个方便的语句,用于提高查询的性能,其中一个只想检查表中记录的存在而不是在查询中使用该记录/行。这样做的时候使用IF EXISTS(来自mytable的SELECT 1)而不是IF EXISTS(从mytable中选择*),因为我们感兴趣的只是检查记录/ s的存在。因此,如果查询返回1,则记录存在,否则不存在。无需返回所有列值。

5.避免将用户存储过程命名为sp_procedurename。

  如果存储过程以sp_开头,则SQL Server首先在master数据库中搜索它,然后在当前用户数据库中搜索它。这可能会导致轻微的性能问题,而且如果master数据库中存在具有相同名称的存储过程,则可能导致错误的结果。

6.尽可能使用基于集合的查询。

  T-SQL是一种基于集合的语言,因此循环在这里不能很好地工作。仅当基于集合的查询要么昂贵或无法制定时,才使用游标和while循环。

7.保持交易简短明快

  事务越长,根据隔离级别保持锁定的时间越长。这可能会导致死锁和阻塞。打开一个新的查询窗口并执行以下查询

 
1
2
3
4
5
6
use AdventureWorks2014
GO
BEGIN TRANSACTION
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
 
SELECT * FROM Sales.SalesOrderDetail

请注意查询的会话ID。打开一个新的查询窗口并执行以下查询。记下查询的会话ID。

 
1
2
3
begin tran
Update Sales.SalesOrderDetail
SET OrderQty=50 WHERE SalesOrderDetailID=1

以上更新查询将等待共享锁上的选择查询。让我们分析这两个会话的锁。

  

如上面的快照所示,会话58更新查询正在等待会话57采取的共享锁。

请遵循这些提示,让我知道它如何提高程序性能。将返回一些更多提示和最佳实践。

(4.26)sql server存储过程优化的更多相关文章

  1. SQL SERVER全面优化-------写出好语句是习惯

    前几篇文章已经从整体提供了诊断数据库的各个方面问题的基本思路...也许对你很有用,也许你觉得离自己太远.那么今天我们从语句的一些优化写法及一些简单优化方法做一个介绍.这对于很多开发人员来说还是很有用的 ...

  2. SQL Server 存储过程(转载)

    SQL Server 存储过程 Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这 ...

  3. SQL SERVER全面优化

    今天我们从语句的一些优化写法及一些简单优化方法做一个介绍.这对于很多开发人员来说还是很有用的!为了方便阅读给出前文链接: SQL SERVER全面优化-------Expert for SQL Ser ...

  4. 14、SQL Server 存储过程

    SQL Server 存储过程 存储过程类似函数,可以重复使用.相对于函数,存储过程拥有更强大的功能和更高的灵活性. 存储过程中可以包含逻辑控制语句和数据操作语句,可以接受参数,输出参数,返回单个值或 ...

  5. (摘录)SQL Server 存储过程

    文章摘录:http://www.cnblogs.com/hoojo/archive/2011/07/19/2110862.html SQL Server 存储过程 Transact-SQL中的存储过程 ...

  6. SQL Server 性能优化之——系统化方法提高性能

    SQL Server 性能优化之——系统化方法提高性能 阅读导航 1. 概述 2. 规范逻辑数据库设计 3. 使用高效索引设计 4. 使用高效的查询设计 5. 使用技术分析低性能 6. 总结 1. 概 ...

  7. SQL Server性能优化(6)查询语句建议

    1. 如果对数据不是工业级的访问(允许脏读),在select里添加 with(nolock) ID FROM Measure_heat WITH (nolock) 2. 限制结果集的数据量,如使用TO ...

  8. SQL Server 存储过程,带事务的存储过程(创建存储过程,删除存储过程,修改存储过

    存储过程 创建存储过程 use pubs --pubs为数据库 go create procedure MyPRO --procedure为创建存储过程关键字,也可以简写proc,MyPRO为存储过程 ...

  9. SQL SERVER性能优化综述

    SQL SERVER性能优化综述 一个系统的性能的提高,不单单是试运行或者维护阶段的性能调优的任务,也不单单是开发阶段的事情,而是在整个软件生命周期都需要注意,进行有效工作才能达到的.所以我希望按照软 ...

随机推荐

  1. tronado学习

    请求处理程序和请求参数: 原创首发:http://www.cnblogs.com/zxlovenet/p/4128644.html 程序将URL映射到tornado.web.RequestHandle ...

  2. Mysql 查看连接数,状态 最大并发数 && 怎么设置才合理

    show status like '%max_connections%'; ##mysql最大连接数 set global max_connections=1000 ##重新设置 show varia ...

  3. adb shell dumpsys 命令

    Android开发中,常常可以用adb shell dumpsys这条命令来dump出系统运行时的状态信息,例如可以这样来察看某个应用的内存使用信息 adb shell dumpsys meminfo ...

  4. 完全卸载MySQL

    1.先停止mysql服务,cmd模式下输入net stop mysql; 或者在图形服务面板停止mysql服务 2.进入控制面板卸载mysql; 3.windows+R运行“regedit”文件,打开 ...

  5. [Tensorflow] Cookbook - Retraining Existing CNNs models - Inception Model

    From: https://github.com/jcjohnson/cnn-benchmarks#alexnet 先大概了解模型,再看如果加载pre-training weight. 关于retai ...

  6. ThinkingInJava 学习 之 0000001 一切都是对象

    -- -- -- -- -- -- -- -- -- 大杂烩 -- Java内存布局[图]以及java各种存储区[详解] -- -- -- -- -- -- -- -- -- 1. 用引用操纵对象 在 ...

  7. SVN 命令行的使用

    大多数时候我们用TortoiseSVN作为客户端,其实SVN提供了强大的客户端命令行工具,和Git差不不多. 1. 查看工作副本修改的整体状况. $ svn status ? scratch.c A ...

  8. 【netcore基础】wwwroot下静态资源文件访问权限控制

    本文参考如下博问 https://q.cnblogs.com/q/107836 业务要求 上传的资源文件(.mp3 .mp4等)只有购买了之后才能有权限访问,所以对上传的资源文件目录进行访问权限控制 ...

  9. 微信小游戏 RES版本控制+缓存策略 (resplugin和ResSplitPlugin插件使用)

    参考: RES版本控制 使用 AssetsManager 灵活定制微信小游戏的缓存策略 一.我们的目标 目标就是让玩家快速进入游戏,然后根据游戏的进度加载相应的资源,并可对资源进行版本控制.本地缓存. ...

  10. nodejs的koa2框架

    官网文档 cnpm i --save-dev koa2 koa-router koa-body koa-static request npm install --save koa2 const koa ...