开发人员需要具备的DBA技术
背景
在一些小公司或者部门里,通常很少有专门的DBA职位。这时候就需要我们这些程序员充当业余DBA的作用,去监测和维护数据库性能。本文的目的是帮助非DBA专业的开发人员如何定位和解决日常出现数据库问题,并提供一些相关有用的工具。
大部分项目一开始的数据库都是很小的,但随着时间的推进,数据库变得越来越庞大,访问性能也越来越慢。因此优化数据库在所难免,数据库优化的三大核心:保持系统稳定、确保数据完整性和高质量、性能。
了解你的数据库
在开始优化数据库的时候,我们必须要了解自己所使用的数据库的结构和用途以及如下一些基本信息。
- 首先,平时要进行适度的备份和还原数据库,对备份的数据进行检测,可以在不影响当前数据库的情况下,进行一些输入性质的检测操作。
- 区分数据来源、哪张表拥有最多数据、运行速度。运行一些脚本去了解你的数据库。哪些表经常变化、哪些表需要建索引
- 找出表之间的关系依赖
- 找出数据是如何进来以及何时失效的
- 调查数据如何以及为什么要进行状态的转换
- 做记录
- 使用内置的数据库报表
如何让你的数据库更健壮
当与数据交道时,健壮的代码至关重要。需要注意的是事务、error捕获和日志的使用。当设计数据库结构和架构时,都会面临存储过程的选择。存储过程是预先写好的数据库脚本,能够被命令取消。当使用C#或者JavaScript前端写代码时,允许某些地方使用错误的处理和日志记录哪些错误操作。但存储过程就不一样了,因为相比于网站前端,它很少与用户有交互。在使用存储过程时,有三点需要留意:
1. 如果允许,请把脚本写于事务块里面
2. 使用try...catch...监测捕获错误信息
3. 记录错误信息
当错误捕获后,需要记录,你可以使用MS SQL内置的日志系统记录,但这又涉及到权限,可能你没有办法访问。你也可以创建一张日志表记录错误信息。
性能问题
通常我们都会遇到访问速度的问题。速度慢无非就是数据量过大、处理脚本执行效率低、索引创建不合理、硬件或者系统配置等问题。索引是解决性能的优先选择,但是如果拥有太多的索引就会造成性能问题。其次是字段的类型,尽量使用varchar替代nvarchar
使用索引
1. 正确使用索引
2. 使用SQL 索引提示
其他性能问题
1. 非数据库引起的性能问题
一般情况下,更多造成性能问题的是我们不规范和不合理的写法导致的。例如一下2个例子
用between语法比和比较来的快
通过foreach遍历循环查找单条数据,显然效率也会大打折扣。取而代之,可以使用join表关联来查找你要的结果
2. 查询复杂来源的数据消耗太多时间
a. 前期预加载和规范
一般情况下,添加索引、优化查询语句到目前为止能够很好的优化性能。还有一种情况,由于访问数据量很大,且这些大数据是从其他数据量也很大的地方集合过来的,因此它消耗的时间就很长。最好的方式就是预先读取这些数据或者去规范化这些数据。如果你的查询来源是一个pivot表,那么他可能来自一系列的关联数据、视图、存储过程,好的解决方式就是创建一个新的存储过程去搜集这些需要的数据,然后把他们存入一个更规范的数据表中方便阅读和查询。先规范化你的数据,也能够帮你省去很多宝贵的实践,不仅仅在加载数据前,也包括格式排版。比如你访问的数据需要整理成JSON格式的时候,你无需在访问的时候才做格式化操作,完全可以预先加载这些数据整理成JSON格式。
b. 多线程执行存储过程
有时候一些存储过程确实需要花费一些时间去执行,而这些执行过程并不是你所关心的。当你访问这些存储过程并等待时,就可能会面临超时的错误出现。解决方式,就是开始执行存储过程的时候,去检查他是否已经执行完毕而不是卡着线程等待它的结果。这些存储过程通常发生在一个脚本本来执行很快,但随着数据量的增加,他消耗的时间越来越久导致超时。你需要做的就是使用SqlCommand.BeginExecuteNonQuery()方法。这个方法在后台线程执行存储过程,而不影响你当前线程执行其他事情,无需等待。
如何导入数据
数据的导入也是开发人员需要具备的技能。MS SQL提供了内置的导入功能,可以通过text文件\数据库文件、csv或者xml。这里不做细聊
推荐常用的工具
1. DBCC
Database console commands 能够检查数据库级别或者表级别数据的完整性,重建索引的表,执行一系列的维护工作。
DBCC CheckDB: 检查数据库的逻辑和物理的完整性
DBCC CheckTable(‘TableName’) :检查表或者视图的结构完整性
DBCC ShrinkDatabase(‘DatabaseName’): 压缩数据库的物理大小
2. SP_WHO和SP_WHO2
有2个内置的系统存储过程比较有用。SP_WHO和SP_WHO2.这两个脚本可以提供当前sql连接的详细信息,包括连接该数据库的不同应用、连接类型、进程锁定的详细信息。
exec sp_who2的用法
下面2张图可以清晰地看出谁连接了数据库、当前的活动和状态,BlkBy代表进程被谁锁定了
3. SQL Server Profiler的使用
Sql Server Profiler可以实时监测你的数据库,既可以跟踪执行过的语句,也可以查看EF/Linq的语法生成后的sql语句。
4. RedGate SQL Search
安装后sql会有提示功能,可以快速丁文你的数据库、表、触发器、存储过程、索引等。相当好用
5. Brent Ozar
包含一些脚本文件,可以检测数据库的性能、索引分析、计算出最影响查询性能的地方。它还包括一些有用的检查清单。
6. Server monitor
数据库服务器的监控,在发生问题时,会抢先一步客户通过邮件通知你。
绝大部分资料来源:http://www.codeproject.com/Articles/1060867/DBA-Skills-for-developers
开发人员需要具备的DBA技术的更多相关文章
- [置顶] think in java interview-高级开发人员面试宝典(一)
“生死六重门” 无论你是在职,非在职,高级工程师,工程师,架构师,如果你正在面试阶段,请看完此文! 相信这篇文章对你的职业生涯和阶值观会造成重大的改变! 如果你是一名PM或者是管理者正在物色合适的开发 ...
- think in java interview-高级开发人员面试宝典(一)
"生死六重门" 无论你是在职,非在职,高级工程师,工程师,架构师,如果你正在面试阶段,请看完此文! 相信这篇文章对你的职业生涯和阶值观会造成重大的改变! 如果你是一名PM或者是管理 ...
- 30K iOS程序员的简述:如何快速进阶成为高级开发人员
前言: 本篇文章适用于所有在这个行业已经有了几年时间后想要在职业生涯中取得突破的开发人员,编程人员和程序员(或者你可能刚刚开始,但希望你能看到你的路径) 本文适合那些有着简单愿望的人:你想成为一名高级 ...
- 成为杰出Java开发人员的10个步骤
在优锐课的学习分享中,讨论了如果你是Java开发人员并且对技术充满热情,则可以按照以下十个步骤进行操作,这可以使你成为杰出的Java开发人员. 1.具有扎实的基础和对OO原理的理解 对于Java开发人 ...
- JavaScript开发人员必知的10个关键习惯
还在一味没有目的的编写JavaScript代码吗?那么你就OUT了!让我们一起来看看小编为大家搜罗的JavaScript开发人员应该具备的十大关键习惯吧! 随着新技术的不断发展,JavaScript已 ...
- PHP开发工程师应该具备那些技术能力
根据各大招聘网站的数据分析,2017年IT行业,其中从事软件开发和数据分析的毕业生的月薪最高.究其原因是因为随着互联网的不断发展,岗位人才稀缺,需求量大.那么如何快速的成为软件开发人员,比如PHP开发 ...
- SQL点滴17—使用数据库引擎存储过程,系统视图查询,DBA,BI开发人员必备基础知识
原文:SQL点滴17-使用数据库引擎存储过程,系统视图查询,DBA,BI开发人员必备基础知识 在开发过程中会遇到需要弄清楚这个数据库什么时候建的,这个数据库中有多少表,这个存储过程长的什么样子等等信息 ...
- 如何有效快速提高Java服务端开发人员的技术水平?
我相信很多工作了3-5年的开发人员都会经常问自己几个问题: 1.为什么总是感觉技术没有质的提高? 2.如何能够有效和快速的提高自身的技术水平? 3.如何进入到一个牛逼的大公司,认识牛逼的人? 这篇文章 ...
- 【CTO辩论会】移动开发人员忠于技术or 背离技术
第一期CTO辩论会结束后,大家在微信群中讨论,学什么编程语言好.有位官人直呼"劳力者治于人,苦差,不学也罢". 在IT.科技变革世界的今天,移动开发人员成为一个很时髦的工种. 就连 ...
随机推荐
- Array的push与unshift方法性能比较分析
从原理就可以知道,unshift的效率是较低的.原因是,它每添加一个元素,都要把现有元素往下移一个位置.但到底效率差异有多大呢?下面来测试一下. 测试环境的主要硬件:CPU T7100(1.8G):内 ...
- Shader 结构体中语义的理解
Shader编写通常会遇到语义 1 float4 vert(float4:POSITION):SV_POSITION 2 { 3 return mul(UNITY_MATRIX_MVP,v); 4 } ...
- 【BZOJ3331】[BeiJing2013]压力 Tarjan求点双
[BZOJ3331][BeiJing2013]压力 Description 如今,路由器和交换机构建起了互联网的骨架.处在互联网的骨干位置的核心路由器典型的要处理100Gbit/s的网络流量.他们每天 ...
- 九度OJ 1326:Waiting in Line(排队) (模拟)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:220 解决:64 题目描述: Suppose a bank has N windows open for service. There is ...
- mybatis generator的用法
1 自动生成代码 配置数据库 自动生成三个文件: 第一,java bean文件: 第二,java bean对应的dao文件,但是这里的dao只是一个接口: 第三,mybatis需要的Mapper文件: ...
- Mac标识物理位置算法 import Levenshtein mac列表特征值
mac 字符串 与 基准字符串的 Levenshtein 距离,考虑 mac信号强度的时序性,60秒内若干次变化 不引入强度 mac字符串的唯一性 如何排序 基准字符串的选取 同一尺度 都按强度 ...
- Mybatis sql注入问题
预编译方式,即PreparedStatement,可以防注入:#{id} <select id="getBlogById" resultType="Blog&quo ...
- 【Android】开发优化之——调优工具:dump hprof file 查看内存情况,找到内存泄露
虽说知道一般性的开发android应用须要注意的问题,但是也有水平參差不齐的情况.特别是维护代码,假设内存占用大,内存溢出严重,又怎么解决呢? -- 通过DDMS把heap抓出来分析 1.打开DD ...
- hdoj 1455 Sticks 【dfs】
题意:找最短的木棍可以组成的长度, hdoj 1518 的加强版 代码: #include <stdio.h> #include <string.h> #include &l ...
- JVM性能优化, Part 5 Java的伸缩性
很多程序员在解决JVM性能问题的时候,花开了很多时间去调优应用程序级别的性能瓶颈,当你读完这本系列文章之后你会发现我可能更加系统地看待这类的问题.我说过JVM的自身技术限制了Java企业级应用的伸缩性 ...