模拟大视图的查询以进行基准测试
我们的Windows窗体应用程序通过ADO.NET和SOAP Web服务从SQL Server的视图中提取记录,并在数据网格中显示它们。我们有大约25,000行的多个案例,它们的运行相对平稳,但是潜在客户的单个列表中需要的数量要多很多。
为了弄清楚我们现在的扩展水平以及我们可以实际提高的程度(以及扩展的程度),我想实施一个模拟:让SQL Server而不是显示实际数据,而是发送虚构的随机数据。客户和运输方几乎是相同的;视图(或者至少基础表)当然会以不同的方式工作。用户指定虚拟行的数量(例如100,000)。
目前,我只想知道客户端检索和处理数据需要花费多长时间,并且准备显示它。
我要弄清楚的是:如何使SQL Server发送此类数据?
我要:
- 创建一个必须预先运行才能填充实际表的存储过程?
- 创建一个我指向该视图的函数,从而使服务器生成"实时"数据?
- 以某种方式复制和/或者随机化现有数据?
第一种选择对我来说听起来像是它会产生最接近真实世界的结果。因为数据实际上是"物理存在"的,所以" SELECT"查询在性能上与在真实数据上的查询非常相似。但是,它以其他无意义的操作给服务器加重了负担。假数据也将被备份,因为它们将存在于同一数据库中,除非我在每次运行基准测试后都删除了这些数据。
第二个和第三个选项在运行实际模拟时会加重服务器的负担,因此可能会产生不切实际的缓慢结果。
另外,我不确定如何创建这些行,而无需使用循环或者游标。我可以使用SELECT top <n> random1(),random2(),[] FROM foo如果if foo碰巧有<n>
条目,但是否则(显然)我只会得到尽可能多的行就像foo一样。 GROUP BY newid()
或者类似的东西似乎并不能解决问题。
解决方案
回答
如果我们想要结果,则可以依靠,我们需要使测试方案尽可能切合实际,这是迄今为止最好的选择1. 正如我们指出的那样,如果使用其他选项所获得的结果不够好,我们将无法确定不是由于数据库行为不同而导致的。
如何生成数据将在很大程度上取决于问题域。我们可以从多个客户那里获取数据集并将它们合并为一个大型数据集吗?如果数据是时间序列,则可以在不同的范围内进行复制。
回答
数据通常类似于CRM,即联系人,项目等。只需复制数据就可以了(例如,如果我只有20,000行,我将对其进行五次复制以获得所需的100,000行)。另一方面,由于明显的隐私原因,合并只有在我们从不公开部署基准测试工具的情况下才有效(当然,除非我对每个列都应用一个函数,使原始数据变得无法理解且无法修复?类似于哈希函数) ,只有在不过多修改值的大小的情况下)。
要填充行,也许可以这样做:
WHILE (SELECT count(1) FROM benchmark) < 100000 INSERT INTO benchmark SELECT TOP 100000 * FROM actualData
回答
对于用于测试CRM类型表的数据,我强烈建议使用fakenamegenerator.com,我们可以免费获得40,000个假名称。
回答
我们没有提到是否使用SQL Server2008. 如果使用2008并且使用了数据压缩,请注意,随机数据的行为(速度较慢)与真实数据非常不同。随机数据很难压缩。
用于SQL Server的Quest Toad和Microsoft Visual Studio Data Dude都具有测试数据生成器,可以将伪造的"真实"数据存储在记录中。