处理大型数据库(Handling large databases)

2019-09-03 23:22发布

我已经在Web项目(asp.net)工作了半年左右。 最终的产品是约去住。 该项目采用SQL Server作为数据库。 我们已经做了性能测试与一些大容量的数据,结果表明,当数据过大,性能会下降,如2万行(超时问题,延迟反应变量等)。 起初我们使用完全normailized数据库,但现在我们把它归部分由于性能问题(以减少联接)。 首先,它是一个正确的决定? 加什么是可能的解决方案时,数据的大小变得非常大,因为没有。 客户在未来的增加?

我想进一步增加:

  • 200万行的实体表,表解决关系有更大的行。
  • 性能会下降,当数据+无。 用户的增加。
  • 非规范化是识别大量使用查询后进行。
  • 我们还利用XML列和XQuery的一些沉重的量。 可这是原因?
  • 割下一点的话题,在我的项目的一些人说,动态SQL查询比存储过程方法更快。 他们已经做了某种性能测试来证明自己的观点。 我认为事实正好相反。 一些频繁使用的查询是dynamicaly创建而大多数其他查询被封装在存储过程。

Answer 1:

在对事物的计划,数百万行是不是格外大型数据库。

假设我们是在谈论一个OLTP数据库,而无需首先确定你的瓶颈的根本原因denormalising是一个非常,非常糟糕的主意

你需要做的第一件事就是配置您的查询工作负载在代表时间,以确定其中大部分工作正在做(例如,使用SQL事件探查器,如果您正在使用SQL Server)。 看的数目逻辑读取的查询执行由执行的次数相乘。 一旦你已经确定的十大表现最差的查询,则需要详细检查查询执行计划。

我要在这里走出去的肢体(因为它通常是这种情况),但如果你的问题不是非此即彼我会感到很惊讶

  1. “正确”的覆盖索引的缺席对于昂贵查询
  2. 配置不当或下指定磁盘子系统

该SO回答描述了如何分析找到工作负载表现最差的查询。



Answer 2:

正如古语有云“正常化,直到它伤害,denormalise直到它的工作原理”。

我喜欢这个! 这通常是那种必须不再被接受的事情。 我可以想像,回到DBASEIII次,在那里你不能同时打开超过4桌(除非改变你的一些AUTOEXEC.BAT参数并重新启动您的计算机,AHAH!...),还有在denormalisation一些利益。

但现在我看到这个解决方案类似园丁等待海啸浇灌坐在草地。 请使用可用喷壶(SQL事件探查器)。

而且不要忘记,每次反规范化数据库的一部分时,你的能力,以进一步适应它减少,如代码增加错误的风险,使得整个系统越来越少可持续的。



Answer 3:

200万行通常不是一个非常大的数据库,这取决于你存储什么样的信息。 Usualy时性能会下降,你应该确认您的索引策略。 SQL Server数据库引擎优化顾问可以帮助那里。



Answer 4:

有可能为一万个理由; 使用SQL事件探查器和查询分析器,以确定为什么您的疑问也越来越之前下降的“架构更改”的道路缓慢。 这不是不可能的,所有你需要做的就是创建一个索引夫妇和计划“更新统计”的......但正如我所说,事件探查器和查询分析器是找出发生了什么事的最佳工具.. 。



Answer 5:

这可能不是正确的决定。 找出所有的数据库交互和独立并将它们归档,然后找到有问题的人,并策略性地有最大限度地提高性能。 在你的数据库的审计日志也转向和挖掘他们可能会提供更好的优化点。



Answer 6:

起初我们使用完全normailized数据库,但现在我们把它部分normailzed由于性能问题(以减少联接)。

正如古语有云“正常化,直到它伤害,denormalise直到它的工作原理”。

这是在大型,重型,使用DBS相当普遍看程度denormalisation援助表现,所以我不会太担心,现在,只要您的表现仍然在那里,你希望它是和你的代码来管理在“去归一化”的字段不会变得过于繁重。

什么是可能的解决方案时,数据的大小变得非常大,因为没有。 客户在未来的增加?

不知道太多关于你的应用的领域,很难说你怎么能适应未来发展的,但分裂出最近使用过的老数据,以单独的表是重贩卖数据库相当普遍的做法 - 如果95%的用户是从过去的30/45天查询自己的数据,其包含,比如说一个“live_data”表中,最后60一天的数据和一个“OLD_DATA”对旧的东西可以帮助你的表现。

一个好的想法是确保您有广泛的性能监控设置,使你可以衡量你的数据库的性能数据和负荷增加。 如果您发现性能明显下降,这可能是时候重新审视你的指标!



Answer 7:

  • 首先确保你的数据库是合理健康的,如果可能的话在其上运行DBCC DBREINDEX,DBCC INDEXDEFRAG和更新统计信息,如果您不能负担的性能损失。

  • 运行探查器中进行合理的采样时间,足以捕捉最典型的功能,但持续时间比一些如10秒内更大的筛选,你不关心的事情,只需要几毫秒的时间,甚至不看那些。

  • 现在,你有你的最长运行查询,调鼻涕出其中; 获取现身最多的人,看在查询分析器中执行计划,需要一些时间来了解他们,添加必要索引检索速度

  • 考虑创建覆盖索引; 如果需要的话,如果它做SELECT改变应用程序* FROM ...当只需要SELECT姓氏,名字....

  • 重复探查取样,用5秒,3秒,等等,直到性能满足您的期望持续时间。



Answer 8:

我们一直在尝试使用的数据库是接近“真实世界”的可能发展。 这样,你避免了许多疑难杂症的像这样的,因为任何醇”开发商会去心理,如果他保持的连接调试期间超时。 来调试SQL性能问题的最好办法是IMO米奇什么建议小麦; 简介发现有问题的脚本,并与他们开始。 优化脚本可以带你,然后你需要看看指标。 另外,还要确保您SQL Server有足够多的马力,尤其是IO(磁盘)是很重要的。 而且不要忘了; 缓存为王。 内存很便宜; 买多点。 :)



Answer 9:

你是正确的做力所能及的工作。
...只要你意识到有可能是一个价格后支付。 这听起来像你无论如何都会想着这个。

检查事项:

死锁

  • 访问是在同一顺序表中的所有进程?

缓慢

  • 任何做表扫描查询?
    • 检查连接大(超过4个表)
    • 检查您的indeces

见我的表现一般提示其他职位:

  • 你如何优化特定的查询表?
  • 喜欢的性能优化技巧


Answer 10:

有分析索引和查询之后,你可能只是更多的硬件需要。 RAM的几个演出可能做的伎俩。



Answer 11:

我认为它最好是保持非规范化,以防止越来越“污染”的核心数据的OLTP类型的数据。 这会咬你在路上。

如果瓶颈是因为报告或只读的需要,我个人认为没有问题,已非规范化的报告,除了归“生产”表的表; 创建一个进程,卷起你需要查询活泼的任何级别。 一个简单的SP或每晚的过程,周期性地卷起和denormalizes只用在一个只读的方式往往能在用户体验的巨大差异表。

毕竟,有什么好处呢,如果要没有人愿意使用你的系统,因为它是减缓有一个理论上干净,完全归一组数据?



Answer 12:

有趣的......很多在这里的答案..

是的RDBMS / OS版本的64位?

在我看来,在性能下降是几折。 部分原因当然是由于索引。 你有没有考虑一些分区的表的方式,与如何将数据存储一致? 意思是,创建一个基于数据如何去在分区(基于顺序)。 这会给你一个很大的性能提升,因为大多数指标都是静态的。

另一个问题是XML数据。 你使用XML索引? 从书就行了(2008)“使用主XML索引,以下类型的辅助索引的支持:路径,价值和性能。”

最后,在系统设计目前运行/执行了很多动态SQL的? 如果是的话,你会从一个存储perspecive degregation作为计划需要生成,重新生成,很少resued。 我把这种记忆流失或内存抖动。

HTH



Answer 13:

几百万的记录是一个很小的数据库到SQL Server。 它能够处理的数据T字节有很多的连接,无汗。 你可能有一个设计问题还是非常写得不好的查询。

性能测试的荣誉,你去住了。 这是一个很多难以解决这个东西,你已经在生产数月或数年后。

你所做的可能是一个不错的选择。 如果你非规范化,您需要设置触发器,以确保数据保持同步。 是你做的吗? 它花了多少增加你的插入和更新的时间?

我的第一个猜测是,你没有把指数的外键。

其他的猜测,什么可能是错误的包括的东西,如过度使用:相关子查询调用的观点光标EAV表的标量函数的观点缺乏sargability使用select *相关

可怜的表设计也可以使它很难有好的表现。 举例来说,如果你的表是太宽,访问它们会慢一些。 如果你经常以使用将数据转换成另一种数据类型,那么你就错误地存储,这将永远是系统上的阻力。

动态SQL可能比一个存储过程更快,也可能不是。 有没有一个正确的答案在这里的表现。 对于内部安全(你不必设置在表级别的权限),缓解在更改的数据库,存储的特效都比较好。

你需要运行探查并确定最慢的查询是什么。 另外,也要看看是非常频繁运行的所有查询。 一个小小的改变可以还清大whenteh查询每天运行thosands次。

您还shoudl去获得性能优化的一些书籍。 这些将帮助您完成整个过程的性能问题可能是由于很多事情:数据库设计查询设计硬件索引等。

有没有一个快速解决和非规范化随机可以让你在不比,如果你不保持数据的完整性比较麻烦。



Answer 14:

首先是许多人说过几百万行并不大。 我工作的当前应用程序有几个表中的所有拥有超过一亿行的这些都是标准化的。

我们也从一些表现不佳遭受但是这是通过使用默认表统计信息设置引起的。 相对于插入到表的总规模小的数字记录,即插入一百万条记录到含有100+万条记录的表没有造成表统计的自动更新,所以我们会得到它表现出来,可怜的查询计划作为串行查询正在生产的,而不是平行。

至于是否对denormalise正确的决定,取决于你的架构。 你有定期进行深查询即负载的加入让在您经常需要访问,如果是这样那么部分denormaisation可能是前进的道路数据。

但在此之前您检查索引和表统计的战略。
请检查您使用明智的,结构良好的查询和您的加入很好地形成。 检查您的查询计划,您的疑问实际上是解析你所期望的方式。

正如其他人所说的SQL事件探查器/数据库引擎优化顾问做实际上做它的一个好工作。

对我来说denormalisation通常接近我要做的事情列表的底部。

如果你还有问题,请检查您的服务器软件和硬件安装。

  • 是你的数据库,并使用单独的控制器单独的物理磁盘日志文件?
  • 是否有足够的内存?
  • 是设置为自动增长日志文件? 如果是的话是自动增长的限制低,即是它不断增长的经常。


文章来源: Handling large databases