请教一个SQL SERVER 2012大并发量的问题,谢谢

ekingxu 2016-10-06 12:21:42
根据目前我公司系统需求,需要SQL SERVER 数据库每秒处理执行20000次操作,2万次操作中包含更新、插入、查询,均为单表单条记录操作,单表总记录控制在200万以内,请教如

何设计和部署数据库得以实现?

目前采用的技术是SQL SERVER 2012 + ASP.NET 4.0 + REDIS缓存服务器,对数据库分布式暂时还没弄。

据我本地测试,单表270万条记录(47个字段,int,varchar(200),nvarchar(50),varchar(255),bit,datetime类型都有,但没有text,image,二进制类型字段,每个字段都塞满满的

),每秒平均最多能执行4000次左右的操作,问题是目前要求要能执行2万次操作/秒,剩余请求过来的16000个操作怎么办?如何得以实现?

再请教:SQL SERVER 2012在目前硬件(Intel i7-3770,8GB DDR3 RAM,1TB SATA HDD)的前提下能处理的最大并发数(独立线程并发连接后带数据库操作,具体操作就是我最上面说的

那些操作)是多少?I/O性能又如何?


感谢大家!!!

以下是小弟用.NET(C#)插入数据记录和大并发请求操作的一些代码,不知道这种测试方式是否科学和正确。在此之前我向数据库写入了270万条测试记录。




using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;

namespace TestConnection
{
class Program
{
static void Main(string[] args)
{
DateTime t1 = DateTime.Now;

for (int i = 0; i < 20001; i++)
{
MyConnection myy = new MyConnection();
myy.Open();

if (i % 3 == 0)
{
myy.Update();
}
else if (i % 3 == 2)
{
myy.Query();
}
else
{
myy.AddRows();
}

//myy.;
Console.WriteLine(i.ToString());
}
DateTime t2 = DateTime.Now;
TimeSpan ts = t2.Subtract(t1);
Console.WriteLine(ts.TotalMilliseconds.ToString());
//myy.Close();
Console.ReadLine();

}
}

public class MyConnection
{
public SqlConnection con = null;
public MyConnection()
{
con = new SqlConnection("data source=IDC\\SQL2012;uid=sa;pwd=123456;initial catalog=hhhhh;pooling=true;connection lifetime=0;min pool size = 1;max

pool size=40000");
}

public void Open()
{
con.Open();
}

public void Close()
{
con.Close();
con.Dispose();
}

public void Query()
{
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandType = CommandType.Text;
cmd.CommandText = "select top 1 * from UserInfo where id=" + new Random().Next(1, 2700000) + "";
SqlDataReader reader = cmd.ExecuteReader();
if (reader.Read())
{
string s = reader[0].ToString();
}
reader.Close();
cmd.Dispose();

}

public void Update()
{

SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandType = CommandType.Text;
cmd.CommandText = "update userInfo set Balance=8886.99,Rebot=1,updateDate=getdate() where id=" + new Random().Next(1, 2700000) + " ";
cmd.ExecuteNonQuery();
cmd.Dispose();
}

public void AddRows()
{
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandType = CommandType.Text;


String stSQL = " INSERT INTO [dbo].[UserInfo]([Name],[Sex],[Intro],[AddDate],[UpdateDate],[IsUpdate],[IsLogin],[Balance],[Mobile],[QQ],[Email],

[Address],[Pid]";
stSQL += ",[PostT],[GetT],[ReturnT],[BornT],[FilePath],[Vip],[Daili],[Question],[Answer],[RegIP],[LoginIP],[LastLogin],[OnlineTime],[NickName],

[UserName]";
stSQL += " ,[IsSay],[IsSayDate],[Md5Phone],[Rebot],[IsTestUser],[FromUser],[FromUserStatus])";
stSQL += " values('美女好人','1',N'爱立信将在瑞典裁掉3000名员工和900名顾问爱立信宣布的这一消息证实了瑞典媒体此前的报道。瑞典媒体早在7月就报道称,

由于市场行情艰难,爱立信将采取一些措施来提高效率。爱立信在2014年时就宣布了一项成本削减计划,削减目标为90亿瑞典克朗',";
stSQL += "getdate(),getdate(),1,0," + new Random().Next(1, 100000) + ",'13348195578','26336165899','ddddddd@hotmail.com',N'河南三闯火海救火英雄王

锋遗体告别仪式在京举行','22689',200,300,400,999.35,'/library/asdfa/asdfdasf/adsfads/asdf',";
stSQL += "'isvipandno',1,'我爱什么','喜欢爱啦','218.25.66.189','61.139.2.77',getdate(),'adfsfsfsfdsfdsfds','为爱的信子','aaaahonglan',1,getdate

(),'dddddddddddddddddddddddddddddddd',0,0,'lihaibokkkk','0'";
stSQL += ")";
cmd.CommandText = stSQL;
cmd.ExecuteNonQuery();
cmd.Dispose();
}

public void Insert()
{

SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandType = CommandType.Text;
cmd.CommandText = "insert into testTable2(username,reuserName,setUserName,isLeft) values('a','b','c',1)";
cmd.ExecuteNonQuery();
cmd.Dispose();
}
}
}



...全文
1037 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
julie star 2019-09-17
  • 打赏
  • 举报
回复
我遇到一个需求是要实现按小时历史数据追溯,原始需求单表每天3万,一个月90万,一年1000万。我想问下Redis服务器怎么搭建?
段传涛 2017-04-30
  • 打赏
  • 举报
回复
记录一下,其实问题不能单单测试你的数据库,IIS 和Net 都killed 你的很多性能。
专注or全面 2016-10-07
  • 打赏
  • 举报
回复
但问题应该不在程序,因为数据库操作需要时间,所以才导致2万次几秒运行完成;读写分离也应该解决不了高并发吧? 最起码开线程用多线程跑吧,哪个压力测试不用多线程? 读写分离为什么解决不了高并发,最起码可以在一定程度上解决锁这个问题吧,即便是你允许脏读,读写分离也能分别减轻写服务器的负载和读服务器的负载,提高响应时间吧
ekingxu 2016-10-07
  • 打赏
  • 举报
回复
1,楼主既然是做.net的,应该知道参数SQL吧,可以减少sqlserver对sql语句的硬解析,减少CPU和内存的使用?看你拼的一串串SQL就忍不住想吐槽,现在毕业生都知道用参数化SQL了 这个确实是测试用的哈,另外我对SQL也不够专业,提出的建议非常接受,感谢
ekingxu 2016-10-07
  • 打赏
  • 举报
回复
那在数据库的消息队列中,每个队列执行一个简单的SQL应该很快吧?我现在就想达到1秒能综合执行2万次操作,压力很大 roy_88提到的:SQL2012微软采用的为列存储、查询时都好用脏读防阻塞、DML更新操作时都好加上行版本控制这些概念都不同,别说玩了,听都没听过哈 x_wy46提到的:首先你确保你的软件(测试程序)目前只能做到4000次,但问题应该不在程序,因为数据库操作需要时间,所以才导致2万次几秒运行完成;读写分离也应该解决不了高并发吧? 问题在于这个高并发的操作,数据库分布式啥的都还没用,因为目前单套(组)服务器硬件的极限都还没到,只是设计上的缺陷导致很多问题。
中国风 2016-10-07
  • 打赏
  • 举报
回复
单表设计可行,SQL2012微软采用的为列存储,主要的你的硬件要跟上,硬件不行讲再多也实现不了 在这样的情况要尽量减少事务时长,查询时都好用脏读防阻塞 DML更新操作时都好加上行版本控制,防止并发 比如硬件跟不上,防问量大出现并发是一定的
专注or全面 2016-10-07
  • 打赏
  • 举报
回复
1,楼主既然是做.net的,应该知道参数SQL吧,可以减少sqlserver对sql语句的硬解析,减少CPU和内存的使用?看你拼的一串串SQL就忍不住想吐槽,现在毕业生都知道用参数化SQL了 2,首先你确保你的软件(测试程序)可以做到每秒钟20000次操作,如果做不到,那能说是sqlserver的问题 3,你说的每秒处理执行20000次操作,根本不是sqlserver的极限,取决于你怎么设计和硬件环境,一个足够烂的设计可完全没有说服力,如果你硬件支持不到那么大的符合,怪不了软件吧 4,即便在sqlserver层面,也有优化的方案,比如做读写分离之类的,你不能所有稻草都往一个骆驼身上压
ekingxu 2016-10-07
  • 打赏
  • 举报
回复
只要1秒完成2万次操作就啥都好办了,问题目前只是在本地测试,在外网实际环境中数据库、IIS、REDIS网络通信开销很大!!!!
ekingxu 2016-10-07
  • 打赏
  • 举报
回复
嗯嗯,读写分离这个挺好,也研究了半天
ekingxu 2016-10-06
  • 打赏
  • 举报
回复



 INSERT INTO [dbo].[UserInfo]([Name],[Sex],[Intro],[AddDate],[UpdateDate],[IsUpdate],[IsLogin],[Balance],[Mobile],[QQ],[Email],[Address],[Pid],[PostT],[GetT],[ReturnT],[BornT],[FilePath],[Vip],[Daili],[Question],[Answer],[RegIP],[LoginIP],[LastLogin],[OnlineTime],[NickName],[UserName] ,[IsSay],[IsSayDate],[Md5Phone],[Rebot],[IsTestUser],[FromUser],[FromUserStatus]) values('美女好人','1',N'爱立信将在瑞典裁掉3000名员工和900名顾问爱立信宣布的这一消息证实了瑞典媒体此前的报道。瑞典媒体早在7月就报道称,由于市场行情艰难,爱立信将采取一些措施来提高效率。爱立信在2014年时就宣布了一项成本削减计划,削减目标为90亿瑞典克朗',getdate(),getdate(),1,0,18470,'13348195578','26336165899','ddddddd@hotmail.com',N'河南三闯火海救火英雄王锋遗体告别仪式在京举行','22689',200,300,400,999.35,'/library/asdfa/asdfdasf/adsfads/asdf','isvipandno',1,'我爱什么','喜欢爱啦','218.25.66.189','61.139.2.77',getdate(),'adfsfsfsfdsfdsfds','为爱的信子','aaaahonglan',1,getdate(),'dddddddddddddddddddddddddddddddd',0,0,'lihaibokkkk','0')


ekingxu 2016-10-06
  • 打赏
  • 举报
回复


USE [hhhhh]
GO

/****** Object:  Table [dbo].[UserInfo]    Script Date: 2016/10/6 12:23:31 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[UserInfo](
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[Name] [nvarchar](50) NULL,
	[Sex] [bit] NULL,
	[Intro] [nvarchar](500) NULL,
	[AddDate] [datetime] NULL,
	[UpdateDate] [datetime] NULL,
	[IsUpdate] [bit] NULL,
	[IsLogin] [bit] NULL,
	[Balance] [decimal](18, 4) NULL,
	[Mobile] [nvarchar](50) NULL,
	[QQ] [varchar](50) NULL,
	[Email] [varchar](255) NULL,
	[Address] [nvarchar](255) NULL,
	[Pid] [int] NULL,
	[PostT] [decimal](18, 4) NULL,
	[GetT] [decimal](18, 4) NULL,
	[ReturnT] [decimal](18, 4) NULL,
	[BornT] [decimal](18, 4) NULL,
	[FilePath] [varchar](255) NULL,
	[Vip] [varchar](50) NULL,
	[Daili] [bit] NULL,
	[Question] [nvarchar](50) NULL,
	[Answer] [nvarchar](50) NULL,
	[RegIP] [varchar](50) NULL,
	[LoginIP] [varchar](50) NULL,
	[LastLogin] [datetime] NULL,
	[OnlineTime] [nvarchar](50) NULL,
	[NickName] [nvarchar](50) NULL,
	[UserName] [varchar](50) NULL,
	[IsSay] [bit] NULL,
	[IsSayDate] [datetime] NULL,
	[Md5Phone] [varchar](50) NULL,
	[Rebot] [bit] NULL,
	[IsTestUser] [bit] NULL,
	[FromUser] [varchar](50) NULL,
	[FromUserStatus] [bit] NULL,
 CONSTRAINT [PK_UserInfo] PRIMARY KEY CLUSTERED 
(
	[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO






22,294

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧