当前位置: 首页 > 编程日记 > 正文

一、数据库设计与性能优化--概述

前言

我1998年第一次接触SQL Server 6.5 for Windows NT 4.0,当时的感觉就认为SQL Server只是一个功能强大的Excel文件。现在回想起来,当年抱着这样一种态度,我开发的那些应用程序应该是非常幼稚的,其性能可想而知。记得那时候随便查询一笔记录就要花费十几秒,已是司空见惯。当时作为程序员(“码农”)兼DBA,我似乎只会抱怨这个数据库系统的“低级”、“质量差”,或者向boss提议升级服务器的硬件。由于一切都靠自学,我就没有反省过自身的数据库技术水平。

2003年“非典”期间,我冒着生命危险去参加MCDBA2000的培训课程。XF Kong老师通过系统讲解,使我对SQL Server 2000的了解和掌握不再停留在肤浅的表面。随着逐步深入走向SQL Server底层技术,我对数据库的应用访问和日常运维终于摆脱了低级阶段。之后,各种性能问题的表症和对策也就逐清晰起来。

最近几年看过Microsoft两位数据库“大拿”Howard Yin、Max Shen的文章,借助两位专家的研究成果,并参考一些技术书籍,借51CTO的这块风水宝地,我陆续会将SQL Server 性能优化的一系列心得与体会整理并发布出来。



一、概述

《一、数据库设计与性能优化--概述》,即本文。http://jimshu.blog.51cto.com/3171847/1250066

根据我的理解,OLTP的性能优化主要在于2个方面:

(1)系统架构和设计优化

要在SQL Server方案中实现最优的性能,最关键的是要有一个很好的数据库设计方案。在实际工作中,许多SQL Server方案往往是由于数据库设计得不好导致性能很差。

系统架构的设计对系统的性能有着直接的影响,如果设计不当,甚至将面临推倒重来的严重局面。一些大型软件企业或正规的软件开发团队一般都有专职的数据库架构专家参与设计系统架构,而且这个过程可能非常漫长。而“码农”们兼职在设计时往往忽略一些重要问题,或者因为开发周期太短而根本时间没有考虑这些因素,例如,没有考虑到未来3~5年的数据增长量,没有考虑到访问压力,等等。

在设计数据库、表、索引、视图等对象时,不仅要熟悉这些对象的逻辑工作原理,更要了解这些对象可能存在的瓶颈,争取在设计阶段就实现优化。

在数据库系统的维护阶段,需要通过一些工具对性能进行监视。


(2)查询优化

SQL Server数据库查询速度慢的原因有很多,除了系统架构设计方面的问题,查询效率也值得重视。


我首先将重点放在系统架构和设计优化方面,以下分别从软件生命周期的角度、从理解瓶颈的角度进行详细论述。


二、从软件生命周期的角度

根据软件工程瀑布模型(Waterfall Model),软件的生命周期由多个部分组成。数据库的优化应当从设计阶段就开始,并贯穿整个软件生命周期。

075711413.jpg


1、设计

建议由专职的数据库架构专家参与设计。

需求分析时要具有前瞻性,至少要规划未来3~5年数据增长量。

《二、服务器优化(1)实现负载平衡》 http://jimshu.blog.51cto.com/3171847/1250070

《二、服务器优化(2)性能评测与负载预估》 http://jimshu.blog.51cto.com/3171847/1251142

《二、服务器优化(3)服务器端优化措施》 http://jimshu.blog.51cto.com/3171847/1251545

《二、服务器优化(4)资源调控器管理工作负荷》 http://jimshu.blog.51cto.com/blog/3171847/1251546

《二、服务器优化(5)数据库版本的选型》 http://jimshu.blog.51cto.com/3171847/1251547

《二、服务器优化(6)WSRM管理多个实例》 http://jimshu.blog.51cto.com/3171847/1252417


2、开发

查询优化,索引优化

《三、索引优化(1)堆上的非聚集索引》http://jimshu.blog.51cto.com/3171847/1252419

《三、索引优化(2)聚集索引》 http://jimshu.blog.51cto.com/3171847/1252420

《三、索引优化(3)聚集索引上的非聚集索引》 http://jimshu.blog.51cto.com/3171847/1252421

《三、索引优化(4)索引碎片》 http://jimshu.blog.51cto.com/3171847/1254954

《三、索引优化(5)索引设计指南》 http://jimshu.blog.51cto.com/3171847/1254956

《三、索引优化(6)筛选索引》 http://jimshu.blog.51cto.com/3171847/1254965


《查询优化(1)。。。》 、《查询优化(n)。。。》 将列入下一个专题。


3、测试、部署

数据库物理优化,例如,数据库存储位置的设计。系统资源的优化。

《四、物理优化(1)范式化》 http://jimshu.blog.51cto.com/3171847/1257298

《四、物理优化(2)索引视图》http://jimshu.blog.51cto.com/3171847/1257306

《四、物理优化(3)计算列及其索引》 http://jimshu.blog.51cto.com/3171847/1257310

《四、物理优化(4)分区视图》 http://jimshu.blog.51cto.com/3171847/1258453

《四、物理优化(5)表和索引分区》 http://jimshu.blog.51cto.com/3171847/1258459

《四、物理优化(6)数据库引擎优化顾问》 http://jimshu.blog.51cto.com/3171847/1258469

《四、物理优化(7)查看索引使用情况》 http://jimshu.blog.51cto.com/blog/3171847/1258817


4、日常运维

数据库性能监测,资源优化。

《五、性能监视(1)事件探查器》 http://jimshu.blog.51cto.com/3171847/1259089

《五、性能监视(2)Windows性能日志》 http://jimshu.blog.51cto.com/3171847/1259091

《五、性能监视(3)SQL 跟踪》 http://jimshu.blog.51cto.com/3171847/1259093

《五、性能监视(4)扩展事件》 http://jimshu.blog.51cto.com/blog/3171847/1259321

《五、性能监视(5)管理数据仓库》 http://jimshu.blog.51cto.com/3171847/1259322

《五、性能监视(6)数据库审核》 http://jimshu.blog.51cto.com/3171847/1259323

《五、性能监视(7)SQLDIAG》 http://jimshu.blog.51cto.com/3171847/1262406



三、从理解瓶颈的角度

从数据库原理和实践经验来看,影响SQL Server有主要瓶颈有以下3项:

164230647.png


1、CPU

《六、CPU优化(1)CPU技术分类》 http://jimshu.blog.51cto.com/3171847/1265166

《六、CPU优化(2)超线程》 http://jimshu.blog.51cto.com/3171847/1265237

《六、CPU优化(3)处理器组》 http://jimshu.blog.51cto.com/3171847/1265438

《六、CPU优化(4)NUMA架构》http://jimshu.blog.51cto.com/3171847/1266977

《六、CPU优化(5)最大并行度》 http://jimshu.blog.51cto.com/3171847/1266978

《六、CPU优化(6)DMV与计数器》 http://jimshu.blog.51cto.com/3171847/1269174


2、内存

《七、内存优化(1)启用AWE》 http://jimshu.blog.51cto.com/3171847/1269942

《七、内存优化(2)动态内存分配》 http://jimshu.blog.51cto.com/3171847/1270005

《七、内存优化(3)使用DMV》 http://jimshu.blog.51cto.com/3171847/1270018

《七、内存优化(4)内存计数器》 http://jimshu.blog.51cto.com/3171847/1271576

《七、内存优化(5)内存压力分析》

《七、内存优化(6)SQL Server 2012内存管理的革新》


3、磁盘I/O

《八、IO优化(1)磁盘簇》 http://jimshu.blog.51cto.com/3171847/1298514

《八、IO优化(2)SQLIO工具》 http://jimshu.blog.51cto.com/3171847/1298515

《八、IO优化(3)稀疏列》 http://jimshu.blog.51cto.com/3171847/1298558

《八、IO优化(4)数据压缩》 http://jimshu.blog.51cto.com/3171847/1299047

《八、IO优化(5)文件组》 http://jimshu.blog.51cto.com/3171847/1299170

《八、IO优化(6)tempdb》 http://jimshu.blog.51cto.com/3171847/1299175

《八、IO优化(7)减少IO竞争》 http://jimshu.blog.51cto.com/3171847/1299191


四、结语

《九、OLTP 性能调整与优化--结语》 http://jimshu.blog.51cto.com/3171847/1300717


相关文章:

第四范式戴文渊:AI落地,为什么不能照搬教科书?

“年少成名”、“天才”,在中国 AI 行业里用这两个词同时形容一个人的牛人不多,第四范式创始人戴文渊位列其中。在上海交通大学就读本科期间,戴文渊就带领三人团队夺得了 2005 年 ACM 的世界冠军和三个亚洲冠军,并担任ACM竞赛教练…

Kong Api 网关使用 docker 部署

Kong 镜像: https://hub.docker.com/_/kong 官网给定的用户安装手册上并没有设置 PG 的密码,导致如下问题无法启动 nginx: [error] init_by_lua error: /usr/local/share/lua/5.1/kong/init.lua:277: [PostgreSQL error] failed to >retrieve server_version_num…

Windows7中搭建Android x86_64及armv8-a操作步骤

1. 从https://developer.android.com/tools/sdk/ndk/index.html 下载android-ndk-r10d-windows-x86_64.exe 和 android-ndk-r10d-linux-x86_64.bin; 2. 在Ubuntu1404 64位中通过终端安装ndkr10d:./android-ndk-r10d-linux-x86_64.bin ; 3.…

ContentResolver.query()—buildQueryString()

Cursor cursor context.getContentResolver().query(Sms.CONTENT_URI, new String[]{"thread_id from sms where type 3 group by thread_id—"}, // 可以这样使用。 null, null, null); 07-17 10:55:17.084: E/AndroidRuntime(30157): FATAL EX…

Room Database完全使用手册

前言 Android数据持久层直接使用SQLite很麻烦,Google官方推出了Room, Google对Room的定义: The Room persistence library provides an abstraction layer over SQLite to allow fluent database access while harnessing the full power of …

wiki的使用

Wiki一词来源于夏威夷语的”weekee wee kee”,被译为”维基”或”维客”。Wiki是一种多人协作的写作编辑平台。在Wiki网站上,访问者可以修改、完善已经存在的页面,或者创建新内容。 可以利用”维基百科:沙盒”来练习如何编辑&…

GAMIT安装备忘

2019独角兽企业重金招聘Python工程师标准>>> 系统环境: VMware Workstation9 ubuntu 10.04 操作 1.安装VMware Workstation 参考: VMware Workstation下载:http://pan.baidu.com/share/link?shareid407480&uk258569718…

FreeType简介及在vs2010的编译使用

FreeType库是一个开源、高质量、可扩展、可定制、可移植的字体引擎,它提供统一的接口来访问多种字体格式文件,包括点阵字、TrueType、OpenType、Type1、CID、CFF、Windows FON/FNT、X11 PCF等。 FreeType有两个License,一个是BSD-stype&…

firefox下的调试工具

2019独角兽企业重金招聘Python工程师标准>>> vue-devtools https://addons.mozilla.org/en-US/firefox/user/13100848/ 转载于:https://my.oschina.net/u/3371661/blog/3003299

NLP为RPA带来了什么价值?

什么是 RPA(Robotic Process Automation)?机器人流程自动化(RPA)是一种自动化工具,用于创建软件机器人的虚拟劳动力,从而优化和降低企业中端到端业务流程的成本。RPA 可以翻译成机器人流程自动化…

从原理到代码,轻松深入逻辑回归模型!

整理 | Jane出品 | AI科技大本营(ID:rgznai100)【导语】学习逻辑回归模型,今天的内容轻松带你从0到100!阿里巴巴达摩院算法专家、阿里巴巴技术发展专家、阿里巴巴数据架构师联合撰写,从技术原理、算法和工程…

JVM内存管理学习总结(一)

I.JVM进程的生命周期 JVM实例的生命周期和java程序的生命周期保持一致,即一个新的程序启动则产生一个新的JVM进程实例,程序结束则JVM进程实例伴随着消失。那么程序启动和程序终止就是JVM实例生命周期的两个边界,两个边界点可以这么理解&#…

开源库Simd在vs2010中的编译及简单使用

Simd是开源的图像处理库,它提供了很多高性能的算法,这些优化算法主要由SIMD指令来实现,包括SSE、SSE2、SSSE3、SSE4.1、SSE4.2、AVX等,此库可以应用在windows/linux 32bit/64bit等系统中。此库更新较频繁。此库的license是MIT。下…

Dubbo2.6.5+Nacos注册中心(代替Zookeeper)

在上一节的小栗子的基础上&#xff0c;只需要更改两个地方 第一个&#xff1a;父工程的pom依赖增加 <!-- Dubbo Nacos registry dependency --><dependency><groupId>com.alibaba</groupId><artifactId>dubbo-registry-nacos</artifactId>…

Nginx(二) 配置与调试

nginx 主配置文件在安装目录下的conf中&#xff0c;名字为nginx.conf&#xff1a;主配置文件主要分为4部分&#xff1a;main&#xff08;全局设置&#xff09;、server&#xff08;主机设置&#xff09;、upstream&#xff08;负载均衡服务器设置&#xff09;和location&#x…

AI编程语言图鉴

作者 | 元宵大师责编 | 胡巍巍来源 | CSDN&#xff08;CSDNnews&#xff09;当前最炙手可热的领域非“人工智能”&#xff08;Artificial Intelligence&#xff09;莫属。其实&#xff0c;“人工智能”的火热并非一蹴而就&#xff0c;早在1956年“人工智能”概念就已经被提出了…

C++动态二维数组演示的代码

将代码过程中经常用到的代码珍藏起来&#xff0c;下边资料是关于C动态二维数组演示的代码。 #include <iostream> #include <string>using namespace std;{for( int i 0; i < x; i ){List[i] new int[y];for( int j 0; j < y; j ){List[i][j] 0;}}for( i…

linux发送email错误 501 Syntax: HELO hostname

2019独角兽企业重金招聘Python工程师标准>>> 查看你的hostname hostnamecentos58 然后vi /etc/hosts 添加hostname对应的ip 103.24.3.171 centos58 参考http://blog.csdn.net/tammy_zhu/article/details/5563383 转载于:https://my.oschina.net/u/257088/bl…

redux-thunk使用教程

从无到有一步一步创建一个react-redux、redux-thunk使用教程&#xff1a;本教程GitHub地址&#xff1a;https://github.com/chunhuigao/react-redux-thunk创建react工程在电脑上找一个文件夹&#xff0c;在命令窗使用create-react-app 创建我的react工程&#xff1b;这一步应该…

VLC SDK在VS2010中的配置及简单使用举例

1. 从http://www.videolan.org/vlc/download-windows.html下载vlc-2.2.0-win32.7z&#xff0c;解压缩&#xff1b;2. 新建一个VLCtest控制台工程&#xff1b;3. 将/vlc-2.2.0-win32/vlc-2.2.0/sdk/include添加到工程属性中&#xff0c;C/C -->General …

百万奖金悬赏AI垃圾分类,就问你来不来?

也许我们从来没有想过&#xff0c;看似简单的垃圾分类居然给“聪明”的人类带来如此大的困扰2019年7月1日&#xff0c;史称“最严格的垃圾分类法”《上海市生活垃圾管理条例》正式开始施行一夜之间上海人最常用的见面语从“侬好”变成了“侬是什么垃圾&#xff1f;”虽然只有可…

资质申报 - 系统集成企业资质等级评定条件(2012年修定版)

关于发布《计算机信息系统集成企业资质等级评定条件&#xff08;2012年修定版&#xff09;》的通知工信计资&#xff3b;2012&#xff3d;6号各省、自治区、直辖市、计划单列市工业和信息化主管部门、新疆生产建设兵团工业和信息化委员会、各级资质评审机构&#xff0c;各有关单…

@HostListener 可接收的事件列表

下面有一个文档详细介绍Angular 中的事件列表&#xff1a; https://github.com/angular/angular/blob/master/packages/compiler/src/schema/dom_element_schema_registry.ts#L78。 星号代表的是事件 (no prefix): property is a string.*: property represents an event.!: pr…

GraphSAGE: GCN落地必读论文

作者 | William L. Hamilton, Rex Ying, Jure Leskovec来源 | NIPS17导读&#xff1a;图卷积网络&#xff08;Graph Convolutional Network&#xff0c;简称GCN&#xff09;最近两年大热&#xff0c;取得不少进展。作为 GNN 的重要分支之一&#xff0c;很多同学可能对它还是一知…

Ubuntu14.04 32位上编译VLC2.2.0源码操作步骤

1. 首先安装必须的依赖软件&#xff0c;打开终端&#xff0c;执行&#xff1a;sudo apt-get install git libtool build-essential pkg-config autoconf2. 从 http://www.videolan.org/vlc/download-sources.html 下载vlc-2.2.0源码&#xff0c;将其存放到/home/spring/VLC目录…

根据PromiseA+规范实现Promise

Promise是ES6出现的一个异步编程的一个解决方案&#xff0c;改善了以往回调函数的回调地狱(虽然写起来也挺像的)。不会Promise的可以移步阮一峰的Promise&#xff0c;这里讲的非常清晰。 就现在的发展情况而言&#xff0c;Promise这种解决方案频繁的在我们的代码中出现&#xf…

黄浴:基于深度学习的超分辨率图像技术发展轨迹一览

作者 | 黄浴转载自知乎导读&#xff1a;近年来&#xff0c;使用深度学习技术的图像超分辨率&#xff08;SR&#xff09;取得了显著进步。本文中&#xff0c;奇点汽车自动驾驶首席科学家黄浴对基于深度学习技术的图像超分辨率技术进行了一次全面的总结&#xff0c;分析了这门技术…

Qt简介、安装及在Ubuntu14.04 32位上简单使用举例

Qt是一个跨平台的C图形用户界面应用程序开发框架。它既可以开发GUI程序&#xff0c;也可用于开发非GUI程序。Qt是面向对象的框架&#xff0c;很容易扩展。Qt是一个C工具包&#xff0c;它由几百个C类构成&#xff0c;你在程序中可以使用这些类。Qt具有OOP的所有优点。 跨平台的…

FOSCommentBundle功能包:设置Doctrine ODM映射(投票)

原文出处&#xff1a;12b-mapping_mongodb.md原文作者&#xff1a;FriendsOfSymfony授权许可&#xff1a;创作共用协议翻译人员&#xff1a;FireHare校对人员&#xff1a;适用版本&#xff1a;FOSCommentBundle 2.0.5文章状态&#xff1a;草译阶段Step 12b: Setup MongoDB mapp…

Python最大堆排序实现方法

Python最大堆排序实现方法&#xff0c;具体代码如下&#xff1a; # -*- coding: utf-8 -*- def merge_sort(seq, cmpcmp, sentinelNone): """合并排序&#xff0c;伪码如下&#xff1a; MERGE(A, p, q, r) 1 n1 ← q - p 1 // 前个子序列长度 2 …