在我的工作中,我们有一个小型的数据库(如二百表,也许共行的万左右)。
我一直希望它是相当快的每秒数千插入几十顺序和与一旦建立连接querys采取毫秒。
恰恰相反,我们有一些性能问题,所以,我们只能得到几百插入每秒querys,即使是最简单的人会采取永远。
我不enterly知道这是在STANDAR行为/性能或我们正在做一些错误的。 例如,1500个querys这意味着上的一个键柱接合4个表需要大约10秒。 它使用简单的插入件不违反任何约束需要3分钟,加载数据的300K以XML格式到数据库中。
该数据库是SQL Server 2005和具有丰富的关系依赖模型,这意味着很多对数据关系和分类,以及为分类代码和其他几件事情全套的检查约束。
是那个时代吗? 如果不是,这可能是影响性能? (所有查询在索引列完成)
为了有一个粗略的比较:在SQL Server的TPC-C基准测试记录是大约每分钟1.2万的交易,并没有像现在这样在过去的4年左右(由64 CPU OS限制斗篷)。 这东西在每秒16K〜事务的balpark。 这是关于超高端机,64个CPU,大量的RAM,每个NUMA节点affinitized客户端和(各主轴的1-2%仅使用大约等)一个serverly短剥离I / O系统。 请记住,这些都是TPC-C交易,因此它们由几个操作的(我认为是4-5读取和1-2平均写入各)。
现在,你应该行硬件此之上缩减到您的实际部署,并会得到看球在哪里设置你的全部测试OLTP事务处理的预期。
对于数据上传当前的世界纪录是约1TB在30分钟内 (如果仍然是当前...)。 数万每秒插入的是相当庞大,但可以实现的,当严重的硬件做好。 在链接的文章包含了ETL高吞吐量的技巧和窍门(例如,使用多个载流,并将它们affinitize到NUMA节点)。
您的具体情况,所以你找出瓶颈,然后提出具体的问题,如何解决具体botlenecks我会建议首先测量 。 一个很好的出发点是等待和队列白皮书 。
索引是一个主要因素在这里,当处理得当,它们可以加快Select语句相当不错,但请记住,指数将陷入瘫痪的刀片以及不仅更新数据的服务器,但该指标为好。 这里的技巧是:
1)确定,是真正的速度要求严格,这些查询应具有最佳索引他们的查询。
2)填充因子是非常重要的在这里。 这提供了空的空间索引页面后填写。 当一个索引页满(足够的行插入),一个新的页面,需要创建还采取更多的时间。 然而空页占用的磁盘空间。
我的诀窍是这样的,因为我设置优先级如下每个应用程序:
1)读取速度(SELECT,UPDATE一些,有些DELETE) - 较高的这个优先,更多的索引创建
2)写入速度(INSERT,一些更新,有些DELETE) - 较高的这个优先,越少的索引创建
3)磁盘空间效率 - 高这一优先,高我的填充因子
注意这方面的知识,一般适用于SQL Server,您的里程可能在不同的数据库管理系统有所不同。
SQL语句的评价可以帮助这里也一样,但是这需要一个真正的专业,细心的WHERE和JOIN分析可以帮助确定瓶颈和您的查询的痛苦。 打开SHOWPLAN和查询计划,评估你所看到的和相应的计划。
也期待在SQL Server 2008中,索引加入!
“富关系依赖”的模式,不利于快速插入速度。 每个约束(主键,值检查,特别是外键),必须检查每一个插入的记录。 那是不是一个“简单的插入”更多的工作。
而且它不mtter您插入没有违反约束,时间可能会是在所有检查你的外键。 除非你有触发器还,因为他们是雪上加霜。
当然是有可能,这是错误的唯一的事情是,你插入表是家长FK一个必须拥有的子女” FK关系的另一个表THA忘了添加索引的FK孩子,FK侧关系(这不是自动的,常常被遗忘)。当然,这只是希望能得到幸运。:-)
约束增加一个小的性能损失。 它也有更新,每插入索引。 如果你不把多个插入到一个事务,数据库服务器必须执行每一次插入一个新的,独立的交易,进一步减缓下来。
150个查询/秒连接4和表音正常,虽然我不知道很多关于你的数据。
“我总是希望它是相当快于每秒,并以毫秒为单位,一旦连接建立querys数千插入几十顺序。”
(一)数据库性能的99%依赖于物理I / O量(除非你是在一些小网站使用内存数据库,它可以无害能力推迟所有的物理I / O,直到一天结束后) 。 (二)数据库I / O不仅涉及实际的物理I / O的数据文件,而且还物理I / O坚持期刊/日志/ ...(和日记常常即使在双模式下进行(即两次),因为说的二十年左右)。 (三)以什么方式“的插入量”对应于“物理I / O的量”,完全是由数据库设计者多少选择具有可用于优化物理设计决定的。 只有一两件事可以在一般这个说:SQL系统大多失败(提供必要的改造“的插入数以万计”的选项,只是也许“一对夫妇数百个”物理I / O的)。 这意味着“插入数以万计的”通常也意味着“千物理I / O的”,这通常意味着“几秒钟”。
这就是说,你的消息似乎来表达一种期望,在某种程度上“刀片是非常快的(”数万每秒“)”,而“查询速度较慢”(“每个查询毫秒”,这意味着“小于每秒1000个查询”) 。 这种期望是荒谬的。