在部署某些互动娱乐平台时,我们通常需要运行一个名为 标识生成.sql
的脚本,用于预先生成平台运行所需的标识 ID。这些 ID 会作为用户编号、房间号或其他逻辑编号的唯一标识使用。
但很多人第一次运行时会发现一个“疑似Bug”的现象:
控制台数据显示生成到 335 后就不动了,好像卡住了一样。
其实,这并不是出错,而是脚本已完成关键写入动作,只是因为循环写入量大(默认 10 万),SQL 的执行线程还在等待资源释放。下面我们将讲清楚原理,并说明如何通过参数调整自定义生成数量。
一、“卡在 335”是完成标志,不是故障
生成标识卡在335时的控制台截图
上图所示,当标识 ID 一直打印到 335 停止,说明数据库插入操作已经全部完成,剩下的只是 SQL 脚本中的“休眠等待”或缓存写入部分。
这一阶段如果你强行关闭窗口,数据不会丢,但建议等候10~20分钟后再手动关闭控制台,确保事务提交完毕。
二、脚本默认配置说明
在 标识生成.sql
脚本中,通常会有如下变量声明:
默认脚本设置
SET @ReserveEnd = 100000
SET @BeginGameID = 1
SET @EndGameID = 999999
含义如下:
-
@ReserveEnd
:保留 ID 生成数(默认 10 万) -
@BeginGameID
:起始生成 ID -
@EndGameID
:最大生成 ID(999999 为默认上限)
所以,即便实际需求只用几千个,脚本也会一次生成 10 万个,这自然会导致运行缓慢,甚至触发数据库性能警告。
三、只生成1万个标识的修改方式
如果你只需要生成 1 万个标识,可以修改变量如下:
改为只生成一万的配置
SET @ReserveEnd = 1
SET @BeginGameID = 1
SET @EndGameID = 10000
注意:
-
@ReserveEnd
设置为 1 是为了取消保留块功能,配合限定EndGameID
达到控制总数量的目的 -
改完后运行速度会非常快,一般几秒即可完成
四、生成表说明
生成结果会插入到如下表(或类似名称)中:
-
GameIdentifier
-
IdentTable
-
Base_IdentID
-
或其他平台专属标识ID管理表
生成成功后,可以通过以下 SQL 检查数量是否正确:
SELECT COUNT(*) FROM GameIdentifier
或查看具体 ID 范围:
SELECT MIN(IdentID), MAX(IdentID) FROM GameIdentifier
五、可能导致假卡死的原因
如果不是“等待”,而是真的卡住,可从以下角度排查:
问题点 | 排查方式 |
---|---|
事务未提交 | 查看 SQL Server 活动监视器是否有锁等待 |
表结构主键冲突 | 检查表中是否已有相同 ID(重复执行未清理) |
脚本无限循环 | 确认 WHILE 逻辑没有设错 @EndGameID 范围 |
缓存未刷新 | 运行完成后 DBCC FREEPROCCACHE 可尝试释放 |
-
修改脚本生成范围为
1~10000
-
清空原始表(如果有旧数据):
TRUNCATE TABLE GameIdentifier
-
运行脚本生成新标识
-
10~20分钟后确认任务完成,再关闭窗口或断开连接
-
查询验证生成是否正常
总结
标识生成脚本卡在335并不是错误,而是一个“完成即挂起”的正常逻辑现象。只需静候数分钟,任务即可完成。如果你只想生成指定范围的 ID,只需将脚本中的 @EndGameID
改成自己想要的值即可。
通过合理修改这段脚本,可节省大量部署时间,也能提升数据库性能。