SlideShare ist ein Scribd-Unternehmen logo
1 von 2
存储过程编写经验和优化措施
信息来源:邪恶八进制信息安全团队(www.eviloctal.com)

一、适合读者对象:数据库开发程序员,数据库的数据量很多,涉及到对 SP(存储过程)的优化的项目开发人
员,对数据库有浓厚兴趣的人。

二、介绍:在数据库的开发过程中,经常会遇到复杂的业务逻辑和对数据库的操作,这个时候就会用 SP 来封装数
据库操作。如果项目的 SP 较多,书写又没有 一定的规范,将会影响以后的系统维护困难和大 SP 逻辑的难以理
解,另外如果数据库的数据量大或者项目对 SP 的性能要求很,就会遇到优化的问题,否则速度有 可能很慢,经
过亲身经验,一个经过优化过的 SP 要比一个性能差的 SP 的效率甚至高几百倍。

三、内容:

1、开发人员如果用到其他库的 Table 或 View,务必在当前库中建立 View 来实现跨库操作,最好不要直接使
用“databse.dbo.table_name”,因为 sp_depends 不能显示出该 SP 所使用的跨库 table 或 view,不方便校
验。

2、开发人员在提交 SP 前,必须已经使用 set showplan on 分析过查询计划,做过自身的查询优化检查。

3、高程序运行效率,优化应用程序,在 SP 编写过程中应该注意以下几点:

a)SQL 的使用规范:

i. 尽量避免大事务操作,慎用 holdlock 子句,提高系统并发能力。

ii. 尽量避免反复访问同一张或几张表,尤其是数据量较大的表,可以考虑先根据条件提取数据到临时表中,然
后再做连接。

iii. 尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过 1 万行,那么就应该改写;如果使用了
游标,就要尽量避免在游标循环中再进行表连接的操作。

iv. 注意 where 字句写法,必须考虑语句顺序,应该根据索引顺序、范围大小来确定条件子句的前后顺序,尽可
能的让字段顺序与索引顺序相一致,范围从大到小。

v. 不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索
引。

vi. 尽量使用 exists 代替 select count(1)来判断是否存在记录,count 函数只有在统计表中所有行数时使用,
而且 count(1)比 count(*)更有效率。

vii. 尽量使用“>=”,不要使用“>”。

viii. 注意一些 or 子句和 union 子句之间的替换

ix. 注意表之间连接的数据类型,避免不同类型数据之间的连接。

x. 注意存储过程中参数和数据类型的关系。

xi. 注意 insert、update 操作的数据量,防止与其他应用冲突。如果数据量超过 200 个数据页面(400k),那
么系统将会进行锁升级,页级锁会升级成表级锁。

b)索引的使用规范:
i. 索引的创建要与应用结合考虑,建议大的 OLTP 表不要超过 6 个索引。

ii. 尽可能的使用索引字段作为查询条件,尤其是聚簇索引,必要时可以通过 index index_name 来强制指定索
引

iii. 避免对大表查询时进行 table scan,必要时考虑新建索引。

iv. 在使用索引字段作为条件时,如果该索引是联合索引,那么必须使用到该索引中的第一个字段作为条件时才
能保证系统使用该索引,否则该索引将不会被使用。

v. 要注意索引的维护,周期性重建索引,重新编译存储过程。

c)tempdb 的使用规范:

i. 尽量避免使用 distinct、order by、group by、having、join、cumpute,因为这些语句会加重 tempdb
的负担。

ii. 避免频繁创建和删除临时表,减少系统表资源的消耗。

iii. 在新建临时表时,如果一次性插入数据量很大,那么可以使用 select into 代替 create table,避免 log,提
高速度;如果数据量不大,为了缓和系统表的资源,建议先 create table,然后 insert。

iv. 如果临时表的数据量较大,需要建立索引,那么应该将创建临时表和建立索引的过程放在单独一个子存储过
程中,这样才能保证系统能够很好的使用到该临时表的索引。

v. 如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先 truncate table,然后 drop
table,这样可以避免系统表的较长时间锁定。

vi. 慎用大的临时表与其他大表的连接查询和修改,减低系统表负担,因为这种操作会在一条语句中多次使用
tempdb 的系统表。

d)合理的算法使用:

根据上面已提到的 SQL 优化技术和 ASE Tuning 手册中的 SQL 优化内容,结合实际应用,采用多种算法进行比较,
以获得消耗资源最少、效率最高的方法。具体可用 ASE 调优命令:set statistics io on, set statistics time on
, set showplan on 等。

Weitere ähnliche Inhalte

Ähnlich wie 存储过程编写经验和优化措施

How to build data warehouse
How to build data warehouseHow to build data warehouse
How to build data warehousejasonfuoo
 
《数据库发展研究报告-解读(2023年)》.pdf
《数据库发展研究报告-解读(2023年)》.pdf《数据库发展研究报告-解读(2023年)》.pdf
《数据库发展研究报告-解读(2023年)》.pdfmarkmind
 
Mysql HandleSocket技术在SNS Feed存储中的应用
Mysql HandleSocket技术在SNS Feed存储中的应用Mysql HandleSocket技术在SNS Feed存储中的应用
Mysql HandleSocket技术在SNS Feed存储中的应用iammutex
 
自助工具助Dba提升效率
自助工具助Dba提升效率自助工具助Dba提升效率
自助工具助Dba提升效率Chao Zhu
 
数据库系统设计漫谈
数据库系统设计漫谈数据库系统设计漫谈
数据库系统设计漫谈james tong
 
腾讯大讲堂25 企业级搜索托管平台介绍
腾讯大讲堂25 企业级搜索托管平台介绍腾讯大讲堂25 企业级搜索托管平台介绍
腾讯大讲堂25 企业级搜索托管平台介绍areyouok
 
腾讯大讲堂25 企业级搜索托管平台介绍
腾讯大讲堂25 企业级搜索托管平台介绍腾讯大讲堂25 企业级搜索托管平台介绍
腾讯大讲堂25 企业级搜索托管平台介绍areyouok
 
腾讯大讲堂25 企业级搜索托管平台介绍
腾讯大讲堂25 企业级搜索托管平台介绍腾讯大讲堂25 企业级搜索托管平台介绍
腾讯大讲堂25 企业级搜索托管平台介绍topgeek
 
查礼 -大数据技术如何用于传统信息系统
查礼 -大数据技术如何用于传统信息系统查礼 -大数据技术如何用于传统信息系统
查礼 -大数据技术如何用于传统信息系统hdhappy001
 
基于 MySQL 的B2C电商系统前端数据层架构
基于 MySQL 的B2C电商系统前端数据层架构基于 MySQL 的B2C电商系统前端数据层架构
基于 MySQL 的B2C电商系统前端数据层架构Sky Jian
 
2015-05-20 製造業生產歷程全方位整合查詢與探勘的規劃心法
2015-05-20 製造業生產歷程全方位整合查詢與探勘的規劃心法2015-05-20 製造業生產歷程全方位整合查詢與探勘的規劃心法
2015-05-20 製造業生產歷程全方位整合查詢與探勘的規劃心法Jazz Yao-Tsung Wang
 
Big data, big challenge- splunk 幫你解決 big data 議題帶來的挑戰
Big data, big challenge- splunk 幫你解決 big data 議題帶來的挑戰Big data, big challenge- splunk 幫你解決 big data 議題帶來的挑戰
Big data, big challenge- splunk 幫你解決 big data 議題帶來的挑戰Ching-Lin Tao
 
Hadoop con 2015 hadoop enables enterprise data lake
Hadoop con 2015   hadoop enables enterprise data lakeHadoop con 2015   hadoop enables enterprise data lake
Hadoop con 2015 hadoop enables enterprise data lakeJames Chen
 
Big Data, NoSQL, and MongoDB
Big Data, NoSQL, and MongoDBBig Data, NoSQL, and MongoDB
Big Data, NoSQL, and MongoDBMonster Supreme
 
数据仓库及Olap
数据仓库及Olap数据仓库及Olap
数据仓库及Olapfelixcui
 
Introduction to postgresql community
Introduction to postgresql communityIntroduction to postgresql community
Introduction to postgresql communityGaly Lee
 
1242982374API2 upload
1242982374API2 upload1242982374API2 upload
1242982374API2 upload51 lecture
 
Data Analyse Black Horse - ClickHouse
Data Analyse Black Horse - ClickHouseData Analyse Black Horse - ClickHouse
Data Analyse Black Horse - ClickHouseJack Gao
 
Building the Production Ready EB level Storage Product from Ceph - Dongmao Zhang
Building the Production Ready EB level Storage Product from Ceph - Dongmao ZhangBuilding the Production Ready EB level Storage Product from Ceph - Dongmao Zhang
Building the Production Ready EB level Storage Product from Ceph - Dongmao ZhangCeph Community
 

Ähnlich wie 存储过程编写经验和优化措施 (20)

How to build data warehouse
How to build data warehouseHow to build data warehouse
How to build data warehouse
 
《数据库发展研究报告-解读(2023年)》.pdf
《数据库发展研究报告-解读(2023年)》.pdf《数据库发展研究报告-解读(2023年)》.pdf
《数据库发展研究报告-解读(2023年)》.pdf
 
Mysql HandleSocket技术在SNS Feed存储中的应用
Mysql HandleSocket技术在SNS Feed存储中的应用Mysql HandleSocket技术在SNS Feed存储中的应用
Mysql HandleSocket技术在SNS Feed存储中的应用
 
自助工具助Dba提升效率
自助工具助Dba提升效率自助工具助Dba提升效率
自助工具助Dba提升效率
 
数据库系统设计漫谈
数据库系统设计漫谈数据库系统设计漫谈
数据库系统设计漫谈
 
腾讯大讲堂25 企业级搜索托管平台介绍
腾讯大讲堂25 企业级搜索托管平台介绍腾讯大讲堂25 企业级搜索托管平台介绍
腾讯大讲堂25 企业级搜索托管平台介绍
 
腾讯大讲堂25 企业级搜索托管平台介绍
腾讯大讲堂25 企业级搜索托管平台介绍腾讯大讲堂25 企业级搜索托管平台介绍
腾讯大讲堂25 企业级搜索托管平台介绍
 
腾讯大讲堂25 企业级搜索托管平台介绍
腾讯大讲堂25 企业级搜索托管平台介绍腾讯大讲堂25 企业级搜索托管平台介绍
腾讯大讲堂25 企业级搜索托管平台介绍
 
查礼 -大数据技术如何用于传统信息系统
查礼 -大数据技术如何用于传统信息系统查礼 -大数据技术如何用于传统信息系统
查礼 -大数据技术如何用于传统信息系统
 
基于 MySQL 的B2C电商系统前端数据层架构
基于 MySQL 的B2C电商系统前端数据层架构基于 MySQL 的B2C电商系统前端数据层架构
基于 MySQL 的B2C电商系统前端数据层架构
 
2015-05-20 製造業生產歷程全方位整合查詢與探勘的規劃心法
2015-05-20 製造業生產歷程全方位整合查詢與探勘的規劃心法2015-05-20 製造業生產歷程全方位整合查詢與探勘的規劃心法
2015-05-20 製造業生產歷程全方位整合查詢與探勘的規劃心法
 
Altibase介绍
Altibase介绍Altibase介绍
Altibase介绍
 
Big data, big challenge- splunk 幫你解決 big data 議題帶來的挑戰
Big data, big challenge- splunk 幫你解決 big data 議題帶來的挑戰Big data, big challenge- splunk 幫你解決 big data 議題帶來的挑戰
Big data, big challenge- splunk 幫你解決 big data 議題帶來的挑戰
 
Hadoop con 2015 hadoop enables enterprise data lake
Hadoop con 2015   hadoop enables enterprise data lakeHadoop con 2015   hadoop enables enterprise data lake
Hadoop con 2015 hadoop enables enterprise data lake
 
Big Data, NoSQL, and MongoDB
Big Data, NoSQL, and MongoDBBig Data, NoSQL, and MongoDB
Big Data, NoSQL, and MongoDB
 
数据仓库及Olap
数据仓库及Olap数据仓库及Olap
数据仓库及Olap
 
Introduction to postgresql community
Introduction to postgresql communityIntroduction to postgresql community
Introduction to postgresql community
 
1242982374API2 upload
1242982374API2 upload1242982374API2 upload
1242982374API2 upload
 
Data Analyse Black Horse - ClickHouse
Data Analyse Black Horse - ClickHouseData Analyse Black Horse - ClickHouse
Data Analyse Black Horse - ClickHouse
 
Building the Production Ready EB level Storage Product from Ceph - Dongmao Zhang
Building the Production Ready EB level Storage Product from Ceph - Dongmao ZhangBuilding the Production Ready EB level Storage Product from Ceph - Dongmao Zhang
Building the Production Ready EB level Storage Product from Ceph - Dongmao Zhang
 

Mehr von wensheng wei

CentOS5 apache2 mysql5 php5 Zend
CentOS5 apache2 mysql5 php5 ZendCentOS5 apache2 mysql5 php5 Zend
CentOS5 apache2 mysql5 php5 Zendwensheng wei
 
Happiness is a Journey
Happiness is a JourneyHappiness is a Journey
Happiness is a Journeywensheng wei
 
Java JNI 编程进阶
Java JNI 编程进阶     Java JNI 编程进阶
Java JNI 编程进阶 wensheng wei
 
Linux Shortcuts and Commands:
Linux Shortcuts and Commands:Linux Shortcuts and Commands:
Linux Shortcuts and Commands:wensheng wei
 
Java正则表达式详解
Java正则表达式详解Java正则表达式详解
Java正则表达式详解wensheng wei
 
Linux Security Quick Reference Guide
Linux Security Quick Reference GuideLinux Security Quick Reference Guide
Linux Security Quick Reference Guidewensheng wei
 
Android模拟器SD Card映像文件使用方法
Android模拟器SD Card映像文件使用方法Android模拟器SD Card映像文件使用方法
Android模拟器SD Card映像文件使用方法wensheng wei
 
如何硬盘安装ubuntu8.10
如何硬盘安装ubuntu8.10如何硬盘安装ubuntu8.10
如何硬盘安装ubuntu8.10wensheng wei
 
数据库设计方法、规范与技巧
数据库设计方法、规范与技巧数据库设计方法、规范与技巧
数据库设计方法、规范与技巧wensheng wei
 
揭秘全球最大网站Facebook背后的那些软件
揭秘全球最大网站Facebook背后的那些软件揭秘全球最大网站Facebook背后的那些软件
揭秘全球最大网站Facebook背后的那些软件wensheng wei
 
mysql的字符串函数
mysql的字符串函数mysql的字符串函数
mysql的字符串函数wensheng wei
 
入门-Java运行环境变量的图文教程
入门-Java运行环境变量的图文教程入门-Java运行环境变量的图文教程
入门-Java运行环境变量的图文教程wensheng wei
 
LINUX Admin Quick Reference
LINUX Admin Quick ReferenceLINUX Admin Quick Reference
LINUX Admin Quick Referencewensheng wei
 
Cool Object Building With PHP
Cool Object Building With PHPCool Object Building With PHP
Cool Object Building With PHPwensheng wei
 
100 Essential Web Development Tools
100 Essential Web Development Tools100 Essential Web Development Tools
100 Essential Web Development Toolswensheng wei
 
JavaScript高级程序设计(中文优化版)
JavaScript高级程序设计(中文优化版)JavaScript高级程序设计(中文优化版)
JavaScript高级程序设计(中文优化版)wensheng wei
 
世界上最健康的作息时间表
世界上最健康的作息时间表世界上最健康的作息时间表
世界上最健康的作息时间表wensheng wei
 

Mehr von wensheng wei (20)

CentOS5 apache2 mysql5 php5 Zend
CentOS5 apache2 mysql5 php5 ZendCentOS5 apache2 mysql5 php5 Zend
CentOS5 apache2 mysql5 php5 Zend
 
Happiness is a Journey
Happiness is a JourneyHappiness is a Journey
Happiness is a Journey
 
Java JNI 编程进阶
Java JNI 编程进阶     Java JNI 编程进阶
Java JNI 编程进阶
 
Linux Shortcuts and Commands:
Linux Shortcuts and Commands:Linux Shortcuts and Commands:
Linux Shortcuts and Commands:
 
Java正则表达式详解
Java正则表达式详解Java正则表达式详解
Java正则表达式详解
 
Linux Security Quick Reference Guide
Linux Security Quick Reference GuideLinux Security Quick Reference Guide
Linux Security Quick Reference Guide
 
issue35 zh-CN
issue35 zh-CNissue35 zh-CN
issue35 zh-CN
 
Android模拟器SD Card映像文件使用方法
Android模拟器SD Card映像文件使用方法Android模拟器SD Card映像文件使用方法
Android模拟器SD Card映像文件使用方法
 
Subversion FAQ
Subversion FAQSubversion FAQ
Subversion FAQ
 
如何硬盘安装ubuntu8.10
如何硬盘安装ubuntu8.10如何硬盘安装ubuntu8.10
如何硬盘安装ubuntu8.10
 
数据库设计方法、规范与技巧
数据库设计方法、规范与技巧数据库设计方法、规范与技巧
数据库设计方法、规范与技巧
 
揭秘全球最大网站Facebook背后的那些软件
揭秘全球最大网站Facebook背后的那些软件揭秘全球最大网站Facebook背后的那些软件
揭秘全球最大网站Facebook背后的那些软件
 
mysql的字符串函数
mysql的字符串函数mysql的字符串函数
mysql的字符串函数
 
入门-Java运行环境变量的图文教程
入门-Java运行环境变量的图文教程入门-Java运行环境变量的图文教程
入门-Java运行环境变量的图文教程
 
Java学习路径
Java学习路径Java学习路径
Java学习路径
 
LINUX Admin Quick Reference
LINUX Admin Quick ReferenceLINUX Admin Quick Reference
LINUX Admin Quick Reference
 
Cool Object Building With PHP
Cool Object Building With PHPCool Object Building With PHP
Cool Object Building With PHP
 
100 Essential Web Development Tools
100 Essential Web Development Tools100 Essential Web Development Tools
100 Essential Web Development Tools
 
JavaScript高级程序设计(中文优化版)
JavaScript高级程序设计(中文优化版)JavaScript高级程序设计(中文优化版)
JavaScript高级程序设计(中文优化版)
 
世界上最健康的作息时间表
世界上最健康的作息时间表世界上最健康的作息时间表
世界上最健康的作息时间表
 

存储过程编写经验和优化措施

  • 1. 存储过程编写经验和优化措施 信息来源:邪恶八进制信息安全团队(www.eviloctal.com) 一、适合读者对象:数据库开发程序员,数据库的数据量很多,涉及到对 SP(存储过程)的优化的项目开发人 员,对数据库有浓厚兴趣的人。 二、介绍:在数据库的开发过程中,经常会遇到复杂的业务逻辑和对数据库的操作,这个时候就会用 SP 来封装数 据库操作。如果项目的 SP 较多,书写又没有 一定的规范,将会影响以后的系统维护困难和大 SP 逻辑的难以理 解,另外如果数据库的数据量大或者项目对 SP 的性能要求很,就会遇到优化的问题,否则速度有 可能很慢,经 过亲身经验,一个经过优化过的 SP 要比一个性能差的 SP 的效率甚至高几百倍。 三、内容: 1、开发人员如果用到其他库的 Table 或 View,务必在当前库中建立 View 来实现跨库操作,最好不要直接使 用“databse.dbo.table_name”,因为 sp_depends 不能显示出该 SP 所使用的跨库 table 或 view,不方便校 验。 2、开发人员在提交 SP 前,必须已经使用 set showplan on 分析过查询计划,做过自身的查询优化检查。 3、高程序运行效率,优化应用程序,在 SP 编写过程中应该注意以下几点: a)SQL 的使用规范: i. 尽量避免大事务操作,慎用 holdlock 子句,提高系统并发能力。 ii. 尽量避免反复访问同一张或几张表,尤其是数据量较大的表,可以考虑先根据条件提取数据到临时表中,然 后再做连接。 iii. 尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过 1 万行,那么就应该改写;如果使用了 游标,就要尽量避免在游标循环中再进行表连接的操作。 iv. 注意 where 字句写法,必须考虑语句顺序,应该根据索引顺序、范围大小来确定条件子句的前后顺序,尽可 能的让字段顺序与索引顺序相一致,范围从大到小。 v. 不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索 引。 vi. 尽量使用 exists 代替 select count(1)来判断是否存在记录,count 函数只有在统计表中所有行数时使用, 而且 count(1)比 count(*)更有效率。 vii. 尽量使用“>=”,不要使用“>”。 viii. 注意一些 or 子句和 union 子句之间的替换 ix. 注意表之间连接的数据类型,避免不同类型数据之间的连接。 x. 注意存储过程中参数和数据类型的关系。 xi. 注意 insert、update 操作的数据量,防止与其他应用冲突。如果数据量超过 200 个数据页面(400k),那 么系统将会进行锁升级,页级锁会升级成表级锁。 b)索引的使用规范:
  • 2. i. 索引的创建要与应用结合考虑,建议大的 OLTP 表不要超过 6 个索引。 ii. 尽可能的使用索引字段作为查询条件,尤其是聚簇索引,必要时可以通过 index index_name 来强制指定索 引 iii. 避免对大表查询时进行 table scan,必要时考虑新建索引。 iv. 在使用索引字段作为条件时,如果该索引是联合索引,那么必须使用到该索引中的第一个字段作为条件时才 能保证系统使用该索引,否则该索引将不会被使用。 v. 要注意索引的维护,周期性重建索引,重新编译存储过程。 c)tempdb 的使用规范: i. 尽量避免使用 distinct、order by、group by、having、join、cumpute,因为这些语句会加重 tempdb 的负担。 ii. 避免频繁创建和删除临时表,减少系统表资源的消耗。 iii. 在新建临时表时,如果一次性插入数据量很大,那么可以使用 select into 代替 create table,避免 log,提 高速度;如果数据量不大,为了缓和系统表的资源,建议先 create table,然后 insert。 iv. 如果临时表的数据量较大,需要建立索引,那么应该将创建临时表和建立索引的过程放在单独一个子存储过 程中,这样才能保证系统能够很好的使用到该临时表的索引。 v. 如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先 truncate table,然后 drop table,这样可以避免系统表的较长时间锁定。 vi. 慎用大的临时表与其他大表的连接查询和修改,减低系统表负担,因为这种操作会在一条语句中多次使用 tempdb 的系统表。 d)合理的算法使用: 根据上面已提到的 SQL 优化技术和 ASE Tuning 手册中的 SQL 优化内容,结合实际应用,采用多种算法进行比较, 以获得消耗资源最少、效率最高的方法。具体可用 ASE 调优命令:set statistics io on, set statistics time on , set showplan on 等。