模拟大视图查询以进行基准测试

Posted

技术标签:

【中文标题】模拟大视图查询以进行基准测试【英文标题】:Simulating queries of large views for benchmarking purposes 【发布时间】:2010-09-07 09:48:03 【问题描述】:

我们的 Windows 窗体应用程序通过 ADO.NET 和 SOAP Web 服务从 SQL Server 的视图中提取记录,并在数据网格中显示它们。我们有几个案例,大约 25,000 行,工作相对顺利,但潜在客户需要在一个列表中包含很多倍。

为了弄清楚我们现在的扩展程度,以及我们可以实际改进的程度(和程度),我想实现一个模拟:让 SQL Server 发送虚构的随机数据,而不是显示实际数据。客户端和传输端基本相同;视图(或至少是基础表)当然会以不同的方式工作。用户指定虚构行的数量(例如 100,000)。

目前,我只想知道客户端检索和处理数据需要多长时间,并且即将显示它。

我想弄清楚的是:如何让 SQL Server 发送此类数据?

我:

    创建一个必须预先运行才能填充实际表的存储过程? 创建一个我将视图指向的函数,从而让服务器“实时”生成数据? 以某种方式复制和/或随机化现有数据?

在我看来,第一个选项会产生最接近真实世界的结果。因为数据实际上是“物理存在的”,所以SELECT 查询在性能方面与真实数据非常相似。但是,它会通过其他无意义的操作对服务器征税。假数据也会被备份,因为它会存在于同一个数据库中——当然,除非我在每次运行基准测试后删除数据。

第二个和第三个选项在运行实际模拟时对服务器征税,因此可能会产生不切实际的缓慢结果。


此外,我不确定如何创建这些行,除非使用循环或游标。如果foo 实际上恰好有<n> 条目,我可以使用SELECT top <n> random1(), random2(), […] FROM foo,否则我将(显然)只得到与foo 恰好有一样多的行。 GROUP BY newid() 或类似名称似乎无法解决问题。

【问题讨论】:

【参考方案1】:

如果您想要可以信赖的结果,则需要使测试场景尽可能真实,这使得选项 1 是迄今为止您的最佳选择。正如您所指出的,如果您使用其他选项获得的结果不够好,您将无法确定这不是由于不同的数据库行为造成的。

如何生成数据在很大程度上取决于问题域。你能从多个客户那里获取数据集并将它们合并成一个大型数据集吗?如果数据是时间序列,那么它可能可以在不同的范围内复制。

【讨论】:

【参考方案2】:

数据通常类似于 CRM,即联系人、项目等。只需复制数据就可以了(例如,如果我只有 20,000 行,我将复制它们五次以获得所需的 100,000 行)。另一方面,合并只有在我们从不公开部署基准测试工具的情况下才会起作用,出于明显的隐私原因(当然,除非我对每一列应用一个函数,使原始数据无法修复而无法理解?类似于散列函数, 只是没有过多地修改值的大小)。

要填充行,也许可以这样做:

WHILE (SELECT count(1) FROM benchmark) < 100000
  INSERT INTO benchmark
  SELECT TOP 100000 * FROM actualData

【讨论】:

【参考方案3】:

用于测试CRM类型表的数据,我强烈推荐fakenamegenerator.com,你可以免费获得40000个假名字。

【讨论】:

【参考方案4】:

您没有提到您是否使用 SQL Server 2008。如果您使用 2008 并使用数据压缩,请注意随机数据的行为与真实数据的行为非常不同(更慢)。随机数据更难压缩。

Quest Toad for SQL Server 和 Microsoft Visual Studio Data Dude 都有测试数据生成器,可以为您将假的“真实”数据放入记录中。

【讨论】:

以上是关于模拟大视图查询以进行基准测试的主要内容,如果未能解决你的问题,请参考以下文章

MySQL基准测试--方法

Mysql基准测试

使用 Django 单元测试进行自动基准测试

Laravel 4 对我的查询进行基准测试

SPDY Web 服务器基准测试工具

在不使用操作的情况下对 Spark 进行基准测试