sql - 如何加速创建大型字母数字代码表的 SQL 脚本

标签 sql sql-server query-optimization

我有以下脚本,它生成 1.75 亿(!)个格式为“ABC-1234”的唯一字母数字代码,范围从 AAA-0000 到 ZZZ-9999。

在我专用的 MS SQL 2016 机器上按原样运行此脚本需要 20 个小时。加快速度的最佳方法是什么?从脚本中可以看出,我的 SQL 技能有些欠缺!

有一个标识 (int) 列、ID 和 CODE (nvarchar(20)) 本身的列。两列组成主键:

CREATE TABLE [dbo].[ORDERED_CODES](
[ID] [int] NOT NULL,
[Code] [nvarchar](20) NOT NULL,
CONSTRAINT [PK_ORDERED_CODES] PRIMARY KEY CLUSTERED 
(
[ID] ASC,
[Code] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,                 
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

脚本:

DECLARE @Alpha1 INT;
DECLARE @Alpha2 INT;
DECLARE @Alpha3 INT;
DECLARE @Num INT;

-- alpha elements 'ABC'
SET @Alpha1 = 65;
SET @Alpha2 = 65;
SET @Alpha3 = 65;

-- number element '9999'
SET @Num = 0;

-- temporary holders
DECLARE @FINALCODE Nvarchar(50);
DECLARE @CODE1 Nvarchar(50);
DECLARE @CODE2 Nvarchar(50);
DECLARE @CODE3 Nvarchar(50);

WHILE @Alpha1 < 91
BEGIN
   SET @CODE1 = CHAR(@Alpha1)
       WHILE @Alpha2 < 91
        BEGIN
       SET @CODE2 = @CODE1 + CHAR(@Alpha2)
       SET @Alpha2 = @Alpha2 +1
            WHILE @Alpha3 < 91
                BEGIN
                   SET @CODE3 = @CODE2 + CHAR(@Alpha3)
                   SET @Alpha3 = @Alpha3 +1
                        WHILE @Num < 10000
                            BEGIN
                               SET @FINALCODE = RIGHT('0000'+ CAST(@Num as nvarchar(4)),4) + CHAR(45) + @CODE3        
                               SET @Num = @Num +1
                               INSERT INTO ORDERED_CODES (CODE) VALUES (@FINALCODE)
                            END
                        SET @FINALCODE = null
                        SET @Num = 0
                END
            SET @Alpha3 = 65
    END
    SET @Alpha2 = 65

    SET @Alpha1 = @Alpha1 +1   
END;

任何和所有的想法都非常感谢!

最佳答案

我会这样做:

with alphas as (
      select v.ch
      from (values ('A'), ('B'), . . .
           ) v(ch)
     ),
     digits as (
      select v.ch
      from values ('0'), ('1'), . . .
     )
select (a1.ch + a2.ch + a3.ch + d1.ch + d2.ch + d3.ch + d4.ch) as code
from alphas a1 cross join
     alphas a2 cross join
     alphas a3 cross join
     digits d1 cross join
     digits d2 cross join
     digits d3 cross join
     digits d4;

。 . . 用于您想要的有效字符。如果您愿意,可以使用 values 以外的方法生成值。

关于sql - 如何加速创建大型字母数字代码表的 SQL 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45692746/

相关文章:

java - 使用 Oracle JDBC 的大型结果集,我可以关闭游标获取吗? (获取大小问题)

sql - MySQL查询建议

mysql - 如何从两个表中选择并计算数据?

sql - 出现在多个配置文件中的帐号数量的不同计数

MySQL - 我应该如何索引这个表?

oracle - 在 PARALLEL QUERY/DML/DDL 中使用 FORCE、ENABLE、DISABLE 关键字有什么区别

mysql - 如何根据前一行在接下来的几行中插入值

mysql - 如何将 mySql SQL 脚本转换为 MS SQL 脚本?

SQL 使用内连接将不存在的行的聚合值设为 0

mysql - 无法优化 mySQL 查询