如何测试数据库的性能

时间:2014-01-26 17:29:23

标签: sql sql-server database database-design relational-database

我创建了一个数据库,其中包含用户活动的下表:

user_id        |  INTEGER  |  user being notified
actor_id       |  INTEGER  |  user performing the action
activity_type  |  STRING   |  classname/type of the object being notified
activity_id    |  INTEGER  |  id of the object being notified
context_type   |  STRING   |  classname/type of the object's parent
context_id     |  INTEGER  |  id of the object's parent
read/view_at   |  DATETIME |  timestamp of when user saw it

我不知道这种设计在性能方面是否合适。所以我想以某种方式测试它。 我可以使用大量数据填充数据库并打开我需要从此表中获取数据的页面,但我不知道这是否是相关测试。

当Feed表中有10.000个用户和50.000.000条记录时,是否有一种很好的方法可以了解此设计的效果?

我不知道这是否有用,但我正在使用MS SQL Server

3 个答案:

答案 0 :(得分:0)

关于绩效,没有假设是安全的。您应该按照以下步骤操作:

  • 定义有关负载和响应时间的性能目标。您应该确定特定数据加载的已接受响应时间。

  • 定义资源。并非每台机器配置都表现相同。您应该使用目标配置构建虚拟机。

  • 执行load testing。您可以使用SQL Server load generator等工具来完成此操作。

希望这有帮助!

答案 1 :(得分:0)

到目前为止,这对我有用:

  1. 识别性能至关重要的查询集。 1
  2. 设计数据库,以便DBMS可以对上面确定的查询使用快速执行计划。 2
  3. 使用代表性数量的测试数据填充数据库,并确保实际使用上面预期的查询执行计划(并且每个查询的性能都令人满意)。
  4. 对您软件的整个“垂直堆栈”进行基准测试。到现在为止,不应该有太多不好的意外。
  5. 如您所见,数据库设计不仅仅是满足业务需求。实际上,理解客户打算如何访问数据是设计过程中不可或缺的一部分。

    换句话说,传统上虽然“逻辑设计”是不够的 - 在逻辑和物理设计之间需要有一条“双向的街道”。

      

    当Feed表中有10.000个用户和50.000.000条记录时,是否有一种很好的方法可以了解此设计的执行情况?

    该句子中没有足够的信息可供回答。

    首先告诉您如何访问数据,然后我们可以帮助您(重新)设计数据库以有效地支持该特定访问模式。


    1 例如,如果“加载页面”对于用户体验(通常是这样)至关重要,请创建通常在该过程中执行的查询列表。

    2 其中包括“物理”技术,如索引,聚类,分区等,但也可以包括传统上作为“逻辑”设计的一些方面,例如键和关系的设计。如果您了解典型DBMS使用的基础数据结构,您将能够预测大多数设计决策的性能结果。 Use The Index, Luke!是关于该主题的精彩介绍。

答案 2 :(得分:0)

如果性能至关重要,则需要将其构建到开发管道中。

我对性能至关重要的项目所做的事情:

  • 创建性能测试数据集;您的情况下,我会在一张表中加载100M条测试记录,以便对数据的分布做出最好的猜测。
  • 编写应用程序将用于查询该数据的查询
  • 编写一个可以执行那些查询的测试脚本;我喜欢Gatling
  • 猜测一下我的测试硬件与生产套件之间的关系。理想情况下,它是相同的-但实际上,这可能太昂贵了。您必须根据观察生产行为时所看到的结果来改善这种猜测。
  • 猜测流量模式-如果用户采用良好且均匀分布的模式(10K / 24小时/ 60分钟/ 60秒=每秒少于1个请求),那么10K用户就不算多。如果它们都在完全相同的时间出现,则您有问题。我通常有3种负载模式:
    • 逐步提高(这是“最佳情况”),
    • 积极的提升(这反映了您在繁忙时段的期望,例如,如果您的用户倾向于在1小时内访问),
    • 最坏的情况(反映出病毒视频峰值或类似情况会发生什么情况)
  • 安排我的选通测试至少每天运行一次,理想情况下是每次签到的一部分
  • 设置性能目标,例如“ 90%的查询在500毫秒或更短时间内完成”;当测试超出这些目标时,请花费时间和精力进行改进
  • 一旦您可以访问实时基础架构,请运行测试
  • 一旦有访客,监视查询性能,调整负载测试和目标