您能否详细说明您打算如何/如何使用这 900 万 (+1) 个数字?
如果唯一目的是将数字流发送回客户端,在我看来,让客户端应用程序生成 9m 个数字会更有效。
有很多方法可以使用基于少量较小表的笛卡尔积的单个查询生成数字序列(参见 RMH 的 base-10 示例),但所有这些解决方案都需要:
- 首先,要在 tempdb 中构建整个笛卡尔积
- 然后,要对整个笛卡尔积进行排序(在内存和 tempdb 中)
- 然后才将所需的数字发送回客户端
无论您是要生成一小组数字(1 到 10)还是一大组数字(1 到 9,000,000),同一个“生成器”查询都需要这种开销。
显然,需要使用更好、更高效、轻量级的方法来避免占用数据服务器资源(例如,想象几个用户/应用程序试图生成 9,000,000 个数字……所有这些都使用大量 tempdb 空间以及 cpu 资源... egad ...期待来自 DBA 的愤怒电子邮件/电话!)。
另一个想法是使用循环构造来生成所需的数字...
declare @counter bigint, @max bigint
select @counter=0, @max=9000000
while @counter <= @max
begin
select @counter
select @counter=@counter+1
end
...虽然这将消除 tempdb 开销,但您仍将使用循环 900 万次的适量 cpu 资源。额外的性能损失可能来自生成 900 万个 1 行结果集的开销,特别是您可能会看到在数据服务器和客户端应用程序之间流动的网络数据包数量过多。
虽然我们可以通过使最终结果看起来像单个结果集来减少网络数据包的数量,但这需要将上述循环结构转换为存储过程,确保您定义了一个环回服务器,然后创建一个引用所述过程的代理表;然后,您将查询代理表以获取看起来像包含所需数字集的单个结果集。
'当然,在这一点上,为了让数据服务器(以某种有效的方法)生成一系列数字作为单个结果集,我们现在不得不跳过几个环节。
Sybase/ASE 可以通过其他方式生成一系列数字(例如,创建/填充带有标识列的表),但都需要 a) 大量数据服务器资源或 b)一些复杂的代码(例如,应用程序上下文函数、插件 Java 代码)...... 执行一些可能由客户端/前端应用程序更有效地处理的事情。