优化SQL Server上的数字表创建?

Sno*_*owy 6 insert sql-server-2008

运行SQL Server Express 2008.我为某些实用程序功能创建了"数字表".由于表填充是自动构建的一部分,因此每次部署时都会花费过多的时间.

冒着"过度优化"的风险,有人可以评论我如何能够尽快实现这一目标吗?也许玩索引填充因子或创建PK时?

IF EXISTS (SELECT *  FROM dbo.sysobjects 
WHERE id = OBJECT_ID(N'Numbers') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
BEGIN
drop TABLE [Numbers]
end

CREATE TABLE [Numbers]
(
      [Number] [int]
    , CONSTRAINT [Index_Numbers] PRIMARY KEY CLUSTERED
        (
            [number] ASC
        ) ON [PRIMARY]
) 
ON [PRIMARY]
Declare @cnt int
Select @cnt=0
SET NOCOUNT ON
while (@cnt<10000)
BEGIN
INSERT INTO NUMBERS(NUMBER) SELECT @cnt
SELECT @cnt=@cnt+1

end
Run Code Online (Sandbox Code Playgroud)

Mik*_*son 12

SQL, Jeff Moden的辅助数字表.这是最快的

--===== Itzik's CROSS JOINED CTE method
   WITH E00(N) AS (SELECT 1 UNION ALL SELECT 1),
        E02(N) AS (SELECT 1 FROM E00 a, E00 b),
        E04(N) AS (SELECT 1 FROM E02 a, E02 b),
        E08(N) AS (SELECT 1 FROM E04 a, E04 b),
        E16(N) AS (SELECT 1 FROM E08 a, E08 b),
        E32(N) AS (SELECT 1 FROM E16 a, E16 b),
   cteTally(N) AS (SELECT ROW_NUMBER() OVER (ORDER BY N) FROM E32)
 SELECT N
   INTO #Tally4
   FROM cteTally
  WHERE N <= 1000000;
GO
Run Code Online (Sandbox Code Playgroud)


Ben*_*ein 0

您可以做的一件简单的事情是推迟索引的创建,直到填充所有数字之后。换句话说,将其从 CREATE TABLE 中删除并在循环后添加 CREATE INDEX 语句。这将防止每次插入时更新索引。