当前位置: 首页 > 面试题库 >

创建和填充数字表的最佳方法是什么?

任伟
2023-03-14
问题内容

我已经看到了许多不同的方法来创建和填充数字表。但是,创建和填充一个的最佳方法是什么?从“最重要”到“最不重要”定义“最佳”:

用最佳索引创建的表
产生最快的行
用于创建和填充的简单代码


问题答案:

这是一些从网上获取的代码示例,以及对该问题的解答。

对于每种方法,我都修改了原始代码,因此每种方法都使用相同的表和列:NumbersTest和Number,具有10,000行或尽可能接近的行。另外,我提供了到原产地的链接。

方法1在这里是一种非常慢的循环方法,平均13.01秒
运行了3次最高移除,这是几秒钟的时间:12.42,13.60

DROP TABLE NumbersTest
DECLARE @RunDate datetime
SET @RunDate=GETDATE()
CREATE TABLE NumbersTest(Number INT IDENTITY(1,1)) 
SET NOCOUNT ON
WHILE COALESCE(SCOPE_IDENTITY(), 0) < 100000
BEGIN 
    INSERT dbo.NumbersTest DEFAULT VALUES 
END
SET NOCOUNT OFF
-- Add a primary key/clustered index to the numbers table
ALTER TABLE NumbersTest ADD CONSTRAINT PK_NumbersTest PRIMARY KEY CLUSTERED (Number)
PRINT CONVERT(varchar(20),datediff(ms,@RunDate,GETDATE())/1000.0)+' seconds'
SELECT COUNT(*) FROM NumbersTest

方法2从这里循环的速度要快得多,
平均1.1658秒,
最高去除了11次,这是几秒钟的时间:1.117、1.140、1.203、1.170、1.173、1.156、1.203、1.153、1.173、1.170

DROP TABLE NumbersTest
DECLARE @RunDate datetime
SET @RunDate=GETDATE()
CREATE TABLE NumbersTest (Number INT NOT NULL);
DECLARE @i INT;
SELECT @i = 1;
SET NOCOUNT ON
WHILE @i <= 10000
BEGIN
    INSERT INTO dbo.NumbersTest(Number) VALUES (@i);
    SELECT @i = @i + 1;
END;
SET NOCOUNT OFF
ALTER TABLE NumbersTest ADD CONSTRAINT PK_NumbersTest PRIMARY KEY CLUSTERED (Number)
PRINT CONVERT(varchar(20),datediff(ms,@RunDate,GETDATE())/1000.0)+' seconds'
SELECT COUNT(*) FROM NumbersTest

方法3这是一个基于此代码的单个INSERT,其中
平均488.6毫秒的
最高运行时间是11倍,这里是毫秒的时间:686、673、623、686,343,343,376,360,343,453

DROP TABLE NumbersTest
DECLARE @RunDate datetime
SET @RunDate=GETDATE()
CREATE TABLE NumbersTest (Number  int  not null)  
;WITH Nums(Number) AS
(SELECT 1 AS Number
 UNION ALL
 SELECT Number+1 FROM Nums where Number<10000
)
insert into NumbersTest(Number)
    select Number from Nums option(maxrecursion 10000)
ALTER TABLE NumbersTest ADD CONSTRAINT PK_NumbersTest PRIMARY KEY CLUSTERED (Number)
PRINT CONVERT(varchar(20),datediff(ms,@RunDate,GETDATE()))+' milliseconds'
SELECT COUNT(*) FROM NumbersTest

方法4这里是“半循环”的方法从这里 平均348.3毫秒(这是很难获得,因为在代码中间的“走出去”的好时机,有什么建议,将不胜感激)
跑了11次来除去最高的,在这里以毫秒为单位的时间:356、360、283、346、360、376、326、373、330、373

DROP TABLE NumbersTest
DROP TABLE #RunDate
CREATE TABLE #RunDate (RunDate datetime)
INSERT INTO #RunDate VALUES(GETDATE())
CREATE TABLE NumbersTest (Number int NOT NULL);
INSERT NumbersTest values (1);
GO --required
INSERT NumbersTest SELECT Number + (SELECT COUNT(*) FROM NumbersTest) FROM NumbersTest
GO 14 --will create 16384 total rows
ALTER TABLE NumbersTest ADD CONSTRAINT PK_NumbersTest PRIMARY KEY CLUSTERED (Number)
SELECT CONVERT(varchar(20),datediff(ms,RunDate,GETDATE()))+' milliseconds' FROM #RunDate
SELECT COUNT(*) FROM NumbersTest

方法5这是Philip Kelley的回答中的一次INSERT,
平均92.7毫秒
最高去除了11次,这是毫秒数:80、96、96、93、110、110、110、80、76、93、93

DROP TABLE NumbersTest
DECLARE @RunDate datetime
SET @RunDate=GETDATE()
CREATE TABLE NumbersTest (Number  int  not null)  
;WITH
  Pass0 as (select 1 as C union all select 1), --2 rows
  Pass1 as (select 1 as C from Pass0 as A, Pass0 as B),--4 rows
  Pass2 as (select 1 as C from Pass1 as A, Pass1 as B),--16 rows
  Pass3 as (select 1 as C from Pass2 as A, Pass2 as B),--256 rows
  Pass4 as (select 1 as C from Pass3 as A, Pass3 as B),--65536 rows
  --I removed Pass5, since I'm only populating the Numbers table to 10,000
  Tally as (select row_number() over(order by C) as Number from Pass4)
INSERT NumbersTest
        (Number)
    SELECT Number
        FROM Tally
        WHERE Number <= 10000
ALTER TABLE NumbersTest ADD CONSTRAINT PK_NumbersTest PRIMARY KEY CLUSTERED (Number)
PRINT CONVERT(varchar(20),datediff(ms,@RunDate,GETDATE()))+' milliseconds'
SELECT COUNT(*) FROM NumbersTest

方法6这里是来自Mladen Prajdic的单个INSERT,
平均82.3毫秒的
最高清除时间是11倍,这里是毫秒的时间:80、80、93、76、93、63、93、76、93、76

DROP TABLE NumbersTest
DECLARE @RunDate datetime
SET @RunDate=GETDATE()
CREATE TABLE NumbersTest (Number  int  not null)  
INSERT INTO NumbersTest(Number)
SELECT TOP 10000 row_number() over(order by t1.number) as N
FROM master..spt_values t1 
    CROSS JOIN master..spt_values t2
ALTER TABLE NumbersTest ADD CONSTRAINT PK_NumbersTest PRIMARY KEY CLUSTERED (Number);
PRINT CONVERT(varchar(20),datediff(ms,@RunDate,GETDATE()))+' milliseconds'
SELECT COUNT(*) FROM NumbersTest

方法7在这里是基于从代码的单个INSERT这里
平均56.3毫秒
跑11次来除去最高,这里有以毫秒为单位的时间:63,50,63,46,60,63,63,46,63,46

DROP TABLE NumbersTest
DECLARE @RunDate datetime
SET @RunDate=GETDATE()
SELECT TOP 10000 IDENTITY(int,1,1) AS Number
    INTO NumbersTest
    FROM sys.objects s1       --use sys.columns if you don't get enough rows returned to generate all the numbers you need
    CROSS JOIN sys.objects s2 --use sys.columns if you don't get enough rows returned to generate all the numbers you need
ALTER TABLE NumbersTest ADD CONSTRAINT PK_NumbersTest PRIMARY KEY CLUSTERED (Number)
PRINT CONVERT(varchar(20),datediff(ms,@RunDate,GETDATE()))+' milliseconds'
SELECT COUNT(*) FROM NumbersTest

看完所有这些方法后,我真的很喜欢方法7,这是最快的方法,代码也很简单。



 类似资料:
  • 我正在创建一个订单服务,这是RestServices世界的新功能。 我需要将订单模型读入并在DB中持久化。 为此,我有以下方法: 一切正常,但我对目前的设计有顾虑: 我正在读取输入到DTO 要存储对象,我将转换为订单对象,它将由Hibernate保存 再次发送响应回来,我正在将实际的订单对象转换为DTO。 最后,我将创建每个请求4-5个对象,如果我的应用程序得到100个请求,它可能会遇到内存问题。

  • 我正试图清理并重新创建用于集成测试的数据块增量表。 我想在 DevOps 代理上运行测试,所以我正在使用 JDBC (辛巴驱动程序),但它说语句类型“DELETE”不受支持。 当我使用DBFS API“rm -r”清理基础DBFS位置时,它会清理表,但下次重新创建后读取会给出错误 - 找不到事务日志中引用的文件。当已从文件系统中手动删除数据而不是使用表 语句时,会发生这种情况。 此外,如果我只是对

  • 问题内容: 当前,我们的开发团队使用这种模式,但是我不禁想知道是否存在更快或更有效的html方式来完成同一任务。 的HTML 这是Javascript: 问题答案: 这是我为此编写的函数。我不确定它是否比jQuery Templates更快。 它一次创建并附加一个Option元素,这可能比Templates慢 。我怀疑Templates会构建整个HTML字符串,然后一次创建所有DOM元素。那可能更

  • 问题内容: 我有一百万行.txt格式的数据。格式很简单。对于每一行: 你知道我的意思。对于每个用户,它可能出现很多次,或者只出现一次(您永远不会知道)。我需要找出每个用户的所有值。因为用户可能会随机出现,所以我使用了Hashmap来做到这一点。即:HashMap(键:字符串,值:ArrayList)。但是要向arrayList添加数据,我必须不断使用HashMap get(key)来获取array

  • 问题内容: 据我所知,在python中,至少有3到4种方法可以创建和初始化给定大小的列表: 简单循环: 简单循环: 清单理解: 列表和整数乘法: 在这些示例中,考虑到列表仅包含50个元素,我认为不会有任何性能差异,但是如果我需要一百万个元素的列表怎么办?使用make会有所改善吗?在python中创建和初始化列表的首选/最快方法是哪种? 问题答案: 让我们使用进行一些时间测试* : 从上面可以看到,