数据库调优过程(二):找到IO不存在问题,而是sqlserver单表写入IO瓶颈
- 物理机上测试IO是否为瓶颈:
使用一个死循环insert into测试数据库最大写入速度:
use [iTest]; declare @index int;
set @index=0; while @index>=0
begin
set @index=@index+1;
INSERT into [g].[MR]
([TimeStamp],[RTime],[STime],[ETime],[Period],[ObjID],[SID],[CID]
,[Ueid],[GId],[Code],[ScEarfcn],[ScPCI],[ScRSRP],[ScRSRQ]
,[ScRTTD],[ScPHR],[ScAOA],[ScSinrUL],[ScRIP])
VALUES
(GETDATE(),GETDATE(),GETDATE(),GETDATE()
,1,11,22,33,44,44,'',22,33
,44,55,66,77,88,99,00,111,null);
end
GO
结果发现一个问题,写入数据库iTest.mdf的速度只有几百千字节每秒,而写入iTest_log.ldf的速度也是几百字千节每秒,但是写入日志的速度要要多于数据库文件的速度,约在4倍的速度。他们两个之和才有将近1M字节每秒。
而在客户机上,我们采用生成一个文件基本速度也是5M每秒的速度,不管是大文件考别还是小文件拷贝,基本上的速度都是保持在0-70M每秒的速度,显然磁盘在上边测试磁盘的写入速度基本上没有达到饱和程度。
初步判断是sqlserver的内部控制的机制,导致单个表写入有限制,没有使得单个表的写入速度达到系统级别的极限。
- 测试:
xp_cmdshell 怎么开启
http://www.cnblogs.com/atree/p/SQL_SERVER_xp_cmdshell.html
sp_configure 'show_advanced options',1;
reconfigure
go
sp_configure 'xp_cmdshell',1;
reconfigure
go
bcp 总结:http://rsljdkt.iteye.com/blog/1147707
bcp需要登录账户,数据库服务器\数据库实例信息: http://blog.sina.com.cn/s/blog_7ed5a808010140sl.html
创建格式化文件 (SQL Server):https://msdn.microsoft.com/zh-cn/library/ms191516.aspx
bcp工具使用MSDN文档:https://msdn.microsoft.com/zh-cn/library/ms162802.aspx
使用 BULK INSERT 或 OPENROWSET(BULK...) 导入大容量数据(SQL Server)MSDN文档:https://msdn.microsoft.com/zh-cn/library/ms175915.aspx
use iTest;
exec master..xp_cmdshell 'BCP itest.g.mr out c:/mr.txt -c -S.\work -UN_p_r -PN2' --begin transaction x1
truncate table itest.g.mr;
select top 1 * from itest.g.mr;
exec master..xp_cmdshell 'bcp itest.g.mr in c:/mr.txt -c -S.\work -UN_p_r -PN2'
select top 1 * from itest.g.mr;
--rollback transaction x1;
单个这样的批量入库一版情况下能达到5m每秒速度,30W的记录,入库主表g.mr记录为10W,IO就这样子似乎变得很难提高。
如果是4个这样的批量入库,就可达到16m每秒的速度,确实把入库io占用速度提高了上来。
- 别人建议:
表分片特性:
1、一个逻辑表;
2、物理文件是多个文件。
比较核查的结果是,sqlserver中基本上是没有分片这一个功能,基本上使用的类似技术包含以下几个:
- a、表分区(真正意义的分区):partition,这些功能是sqlserver2005以后的版本中出现的功能,在之前的版本是没有该功能的,他的原理就是把一个逻辑上的表分为多个物理文件存储;
- b、表分区(非真正意义的分区):同一个服务器同一个数据库实例上:把一个逻辑表分为多个物理表,具体实现就是把一个逻辑表在物理上体现为多个表,之后使用union all把这些表合并在一起,作为一个视图的返回结果;
- c、表切片(分真正意义的切片技术):可以是同一个服务器也可以是不同服务器在不同的数据库实例上:把一个逻辑意义相同的表分布在不同的服务器或者同一个服务器不同的数据库实例上,之后通过sp_addlinkedserver添加远程连接数据库的表,之后把这些表使用union all连接起来,作为一个视图的返回结果。这个应用感觉怪怪的。如果分表就是数量大,当数据量大时,这个技术方案是行不通的,具体未验证过!!!可能会有一些特定的业务需要吧。
备注:
a/b方案详细讲解:http://www.cnblogs.com/zhuawang/archive/2012/07/15/2592368.html
a方案使用讲解:http://wenku.baidu.com/link?url=sEX5NRzEcvjOMYNnE7_5ro9rUwh6cKtJfNTb6iyNM4NycuOThmyOJVyZSs4JhALi2VOU-OYih7YyYYJNj7lnj48CDGNvGy40e48svSg6ao3
a方案赵洁真实使用经验及忠告:http://blog.zhaojie.me/2010/03/sharding-by-id-characteristic.html
a方案使用介绍:http://www.cnblogs.com/knowledgesea/p/3696912.html
b方案msdn讲解:(Creating Distributed Partitioned Views)https://msdn.microsoft.com/en-us/library/ms188299.aspx
-----b方案特别说明:Bulk importing into a partitioned view is not supported by the bcp command, or the BULK INSERT statement, or the INSERT ... SELECT * FROM OPENROWSET(BULK...) statement. However, you can insert multiple rows into a partitioned view by using an INSERT statement.
b方案具体使用实例1:http://blog.csdn.net/kk185800961/article/details/46482769
b方案具体使用实例2:http://www.veryhuo.com/a/view/9534.html
info中提到sqlserver会有真正的切片技术:http://www.infoq.com/cn/news/2011/02/SQL-Sharding,可是所谓的切片就是分区+索引限制吗?
实现快速复制:
可以通过数据管道和外部表也可以实现数据库间的快速复制。
sqlserver类似技术:订阅,推送,和我们要解决数据库写入瓶颈的量级级别不在一个要求水准上。
数据库调优过程(二):找到IO不存在问题,而是sqlserver单表写入IO瓶颈的更多相关文章
- 记一次数据库调优过程(IIS发过来SQLSERVER 的FETCH API_CURSOR语句是神马?)
记一次数据库调优过程(IIS发过来SQLSERVER 的FETCH API_CURSOR语句是神马?) 前几天帮客户优化一个数据库,那个数据库的大小是6G 这麽小的数据库按道理不会有太大的性能问题的, ...
- 数据库调优过程(一):SqlServer批量复制(bcp)[C#SqlBulkCopy]性能极低问题
背景 最近一段给xx做项目,这边最头疼的事情就是数据库入库瓶颈问题. 环境 服务器环境:虚拟机,分配32CPU,磁盘1.4T,4T,5T,6T几台服务器不等同(转速都是7200r),内存64G. 排查 ...
- 数据库调优(二)Inner Join Merge Join Hash Match
T-SQL 的编码习惯以及规范,影响的是查询优化器对执行计划的选择 健壮的SQL语句,更稳定.更高效 SELECT 几个部分: - 查询的数据来自什么表 - 需要查询表中哪些字段 (尽量不使用类似于 ...
- Mysql数据库调优和性能优化的21条最佳实践
Mysql数据库调优和性能优化的21条最佳实践 1. 简介 在Web应用程序体系架构中,数据持久层(通常是一个关系数据库)是关键的核心部分,它对系统的性能有非常重要的影响.MySQL是目前使用最多的开 ...
- MySQL面试必考知识点:揭秘亿级高并发数据库调优与最佳实践法则
做业务,要懂基本的SQL语句: 做性能优化,要懂索引,懂引擎: 做分库分表,要懂主从,懂读写分离... 数据库的使用,是开发人员的基本功,对它掌握越清晰越深入,你能做的事情就越多. 今天我们用10分钟 ...
- [转]10分钟梳理MySQL知识点:揭秘亿级高并发数据库调优与最佳实践法则
转:https://mp.weixin.qq.com/s/RYIiHAHHStIMftQT6lQSgA 做业务,要懂基本的SQL语句: 做性能优化,要懂索引,懂引擎: 做分库分表,要懂主从,懂读写分离 ...
- JVM调优(二)——基于JVisualVM的可视化监控
JVM调优(二)--基于JVisualVM的可视化监控 工具路径://java/jdk1.8xxx/bin/JVisuaVM.exe 监控本地的Tomcat 监控远程Tomcat 监控普通的JAVA进 ...
- Mysql数据库调优和性能优化
1. 简介 在Web应用程序体系架构中,数据持久层(通常是一个关系数据库)是关键的核心部分,它对系统的性能有非常重要的影响.MySQL是目前使用最多的开源数据库,但是mysql数据库的默认设置性能非常 ...
- JVM调优(二)经验参数设置
调优设置具体解析 堆大小设置 JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制:系统的可用虚拟内存限制:系统的可用物理内存限制.32位系统下,一般限制在1.5 ...
随机推荐
- thinkphp开发技巧经验分享
thinkphp开发技巧经验分享 www.111cn.net 编辑:flyfox 来源:转载 这里我给大家总结一个朋友学习thinkphp时的一些笔记了,从变量到内置模板引擎及系统变量等等的笔记了,同 ...
- 【IOS笔记】Gesture Recognizers
Gesture Recognizers Gesture recognizers convert low-level event handling code into higher-level acti ...
- 【IOS笔记】View Programming Guide for iOS -1
原文:View Programming Guide for iOS View and Window Architecture Views and windows present your applic ...
- System.Data.OracleClient.OracleConnection已过时
解决办法如下: 1.把原来的using System.Data.OracleClient;去掉 2.在oracle安装目录下找到Oracle.DataAccess.dll 添加引用:using Ora ...
- mysql之触发器trigger 详解
为了梦想,努力奋斗! 追求卓越,成功就会在不经意间追上你 mysql之触发器trigger 触发器(trigger):监视某种情况,并触发某种操作. 触发器创建语法四要素:1.监视地点(table) ...
- Defining Stored Programs
ok DROP PROCEDURE IF EXISTS truncate_insert_rank_month; DELIMITER /w/ CREATE PROCEDURE truncate_inse ...
- find principles
Computer Science An Overview _J. Glenn Brookshear _11th Edition In this chapter we explore the probl ...
- 区分总结innerHeight与clientHeight、innerWidth与clientWidth、scrollLeft与pageXOffset等属性
window对象: (1)innerHeight属性:窗口中文档显示区域的高度,不包括菜单栏.工具栏等部分.该属性可读可写. IE不支持该属性,IE中body元素的clientHeight属性与该属性 ...
- Sublime Text3 protobuf syntax file(语法文件)
将以下两个文件放置在X:XXX\Sublime Text 3x64\Data\Packages\User目录下,就可以为sublime3添加protobuf文件的语法高亮规则. 文件名:Protobu ...
- cdecl和stdcall调用约定-汇编演示
. .model flat, stdcall .stack ExitProcess PROTO, dwExitCode:DWORD .data val2 sdword result dword ? . ...