![]() |
1
119
下面是一些代码示例,摘自Web和这个问题的答案。 对于每个方法,我都修改了原始代码,因此每个方法都使用相同的表和列:numberstest和number,其中有10000行或尽可能接近这一行。此外,我还提供了到原产地的链接。
方法1
这里有一个非常缓慢的循环方法
here
方法2
这是一个更快的循环从
here
方法3
这是一个基于代码的插入
here
方法4
这里有一个“半循环”方法
here
平均348.3毫秒(很难获得好的时间,因为代码中间有“go”,任何建议都会受到赞赏)
方法5
这里有一个插页
Philip Kelley's answer
方法6
这里有一个插页
Mladen Prajdic answer
方法7
这是一个基于代码的插入
在这里
在研究了所有这些方法之后,我真的很喜欢方法7,它是最快的,代码也相当简单。 |
![]() |
2
49
我用的这个速度和地狱一样快:
|
![]() |
3
17
如果只是在SQL Server Management Studio或sqlcmd中执行此操作,则可以使用批处理分隔符来重复批处理:
这将向
很慢。它与@km'答案中的方法1进行了比较,后者是示例中最慢的。然而,它是关于作为代码光,因为它得到。通过在插入批处理之后添加主键约束,可以稍微加快速度。 |
![]() |
4
10
我从下面的模板开始,它是从itzik ben gan的例程的大量打印中派生出来的:
“where n<=1000000”条款将输出限制为100万到100万,并且可以轻松地调整到所需的范围。 因为这是一个WITH子句,所以可以将其转换为一个insert…选择…像这样:
在表构建之后索引它将是索引它的最快方法。 哦,我会把它称为“计数”表。我认为这是一个常见的术语,你可以通过谷歌搜索找到大量的技巧和例子。 |
![]() |
5
4
对于任何寻找Azure解决方案的人
源于SQL Azure团队博客 http://azure.microsoft.com/blog/2010/09/16/create-a-numbers-table-in-sql-azure/ |
![]() |
6
2
我主要使用数字表来模拟BIRT中的报告,而不必乱弄记录集的动态创建。 我对日期也做了同样的事情,有一个从过去10年到未来10年的表格(以及一天中的几个小时来进行更详细的报告)。这是一个很好的技巧来获得价值 全部的 日期,即使您的“真实”数据表没有数据。 我有一个脚本,我用它来创建这些,比如(这是从内存中得到的):
每行的行数加倍,因此生成真正巨大的表不需要太多。 我不确定我是否同意你的观点,快速创造是很重要的,因为你只创造了一次。它的成本分摊到所有访问它的路径上,这使得时间相当微不足道。 |
![]() |
7
2
以下是一些额外的方法:
方法2
方法3
方法4 ,取自 Defensive Database Programming 亚历克斯·库兹涅佐夫的书
方法5 ,取自 Arrays and Lists in SQL Server 2005 and Beyond 文章作者:Erland Sommarskog
总结:
|
![]() |
8
2
我知道这个线程已经过时了,可以回答,但是有一种方法可以从方法7中挤出一点额外的性能: 而不是这样(基本上是方法7,但有一些易于使用的抛光剂):
试试这个:
在我的服务器上,与从sys.objects中选择时的~16-20 ms相比,这需要~10 ms。它还具有不依赖于sys.objects中有多少个对象的额外好处。虽然它相当安全,但从技术上讲,它是一种依赖关系,而另一种依赖关系则会更快。我认为,如果你改变速度,速度提升会下降到使用位:
到:
它会给服务器上的总时间增加~8-10毫秒。也就是说,当您扩展到1000000条记录时,bigint和bigint对我的查询不再有明显的影响,但它仍然会从sys.objects运行大约680ms对730ms。 |
![]() |
9
1
一些建议的方法基于系统对象(例如“sys.objects”)。他们假设这些系统对象包含足够的记录来生成我们的数字。 我不会以任何不属于我的申请和我没有完全控制权的东西为基础。例如:这些sys表的内容可能会更改,这些表在新版本的SQL等中可能不再有效。 作为解决方案,我们可以用记录创建自己的表。然后我们使用这个对象来代替这些与系统相关的对象(如果我们事先知道范围的话,那么所有数字的表都应该是可以的,否则我们可以使用这个对象来进行交叉连接)。 基于CTE的解决方案工作正常,但它有与嵌套循环相关的限制。 |
![]() |
10
1
这里有一个简短而快速的内存解决方案,我想出了利用 Table Valued Constructors 在SQL Server 2008中介绍:
请注意,这可以快速计算,或者(甚至更好)存储在永久表中(只需添加一个
|
![]() |
11
0
这是一个接受答案的重新包装-但以一种让你自己比较它们的方式-前三种算法被比较(和注释解释为什么其他方法被排除),你可以运行在你自己的设置,看看它们如何与你想要的序列大小执行。
|
![]() |
ybou · 需要帮助从SQL 2005查询中删除过时的=*连接运算符 7 年前 |
![]() |
Robert · 将多个分隔符分隔的字段视为不同的行 8 年前 |
![]() |
hud · 执行存储过程会导致错误 8 年前 |
![]() |
Gonzalo · 如何将存储过程的结果插入到新表中? 9 年前 |