创建一个用于速度测试的大型数据集

时间:2010-01-31 19:23:00

标签: sql-server

我需要一个Microsoft SQL Server 2005或更高版本的存储过程,它将创建大量行(例如:一百万),这样我就可以尝试各种各样的事情,例如看看SELECT *与选择每个字段相比有多慢名称,或从从另一个视图中选择的视图中选择,而不是直接从表中选择。 这有意义吗?

3 个答案:

答案 0 :(得分:6)

如果它只是您想要的行数,并且您不介意在每行中具有相同的内容,那么您可以轻松地在SQL Server Management Studio中执行此操作。编写插入语句以插入单行,然后使用:

GO 1000000

这将执行批处理GO语句后指定的次数。

如果每行需要不同的数据(或因索引等而无法复制数据),那么SQL Data Generator等工具会有所帮助。它们使您能够定义生成的数据类型,以便工具生成实际数据。

答案 1 :(得分:5)

我现在可以告诉你,执行SELECT *而不是SELECT specific_column_names的速度有多慢。如果您选择的列未被任何索引覆盖,则几乎不会产生任何差异;如果您通常选择的列被索引覆盖,并且该表包含任何大量数据,则它将慢一个数量级,可能更糟。

这是一个快速而肮脏的例子。首先创建测试模式和数据:

CREATE TABLE #TestTable
(
    ID int NOT NULL IDENTITY(1, 1) PRIMARY KEY CLUSTERED,
    Name varchar(50) NOT NULL,
    Age int NOT NULL
)

INSERT #TestTable (Name, Age)
    SELECT 'John', s1.number % 10 + 25
    FROM master.dbo.spt_values s1
    CROSS JOIN master.dbo.spt_values s2
    WHERE s1.type = 'P' AND s2.type = 'P'
    AND s2.number < 20

CREATE INDEX IX_#TestTable_Age ON #TestTable (Age)

现在在SSMS中运行此查询并启用实际执行计划:

SELECT ID
FROM #TestTable
WHERE Age = 30

SELECT *
FROM #TestTable
WHERE Age = 30

第一个SELECT作为索引搜索执行,在我的机器上占总费用的7%。在第二个查询中,优化器确定IX_#TestTable_Age索引不值得并且进行聚簇索引扫描,占总成本的93%,或者非{{1}的13倍。版本。

如果我们强制执行嵌套循环键查找,以模仿聚集索引或非常大的聚簇索引的缺失,则会更糟糕:

SELECT *

这比覆盖查询的时间长100多倍。与第一个查询相比,成本只是天文数字。


为什么我不愿写所有信息:

在开始外出并“测试”事情之前,你需要摆脱常见的误解,即你编写查询语句的确切顺序,或者从其他视图中选择视图等不相关的因素,实际上会产生任何明显的差别。您的数据库甚至是远程优化的。

索引是数据库性能方面的首要问题。你如何使用它们是第二件重要的事情。编写查询的方式可能很重要 - 例如当SELECT * FROM #TestTable WITH (INDEX(IX_#TestTable_Age)) WHERE Age = 30 条件出现在聚簇索引以外的任何内容时执行SELECT *,或者使用非可搜索的函数就像WHERE条件中的DATEPART一样,但在大多数情况下,将一堆随机数据放入表格而不认真考虑如何实际使用表格会给你带来无意义的结果在表现方面。

当您计划大型项目并需要执行可伸缩性测试时,数据生成器非常有用。如果你只是在尝试,试图从抽象意义上理解不同类型的查询之间的性能差异,那么我不得不说你最好只抓取 Northwind 或<的副本em> AdventureWorks 数据库并在那个数据库上敲打它 - 它已经被规范化并编入索引,你将能够在实际中收集有关查询性能的有意义的信息生产数据库。

但更重要的是,在您开始思考关于SQL数据库中的性能之前,您需要实际开始阅读有关性能的内容并了解哪些因素会影响性能。正如我所提到的,首要因素是索引。其他因素包括排序顺序,选择性,连接类型,游标类型,计划缓存等。不要只是开始愚弄,认为你将学习如何最好地优化数据库。

教育自己,然后摸索。我将从Microsoft模式和实践中稍微过时但仍然全面的Improving SQL Server Performance文章开始。另请阅读Indexing BasicsCovering Indexes。然后转到像SQL Server Performance这样的网站,尝试从文章中吸收任何内容。

然后,只有 然后,你应该开始使用大规模的测试数据。如果您仍然不能完全确定为什么WHERE会影响性能,那么运行测试的时间太短

答案 2 :(得分:2)

看看http://databene.org/databene-benerator。它是免费的,快速的,提供逼真的数据,您可以选择使用自己的插件。