SQL Server测试数据生成:从VS2010数据生成计划看数据质量工程化

发布时间:2026/6/16 22:53:51

SQL Server测试数据生成:从VS2010数据生成计划看数据质量工程化 1. 项目概述为什么测试数据生成不是“随便插几条”就能糊弄过去的事在SQL Server开发和测试一线干了十多年我见过太多团队把“生成测试数据”当成一个临时抱佛脚的杂活——上线前一晚DBA被拉来手动INSERT两百行开发自己写个循环往User表里塞1000条“张三”“李四”或者直接从生产库拖一份脱敏数据过来改改字段名就交差。结果呢功能测试跑得飞快性能压测一上就崩索引优化调得头秃最后发现全是单值分布的测试数据根本没覆盖真实业务场景里的数据倾斜更别提那些外键级联、约束校验、触发器逻辑在“张三-男-123163.com”这种千篇一律的数据面前全成了摆设。这根本不是数据量的问题而是数据质量的问题。真正有效的测试数据必须同时满足四个硬指标结构合规性主外键完整、约束不报错、分布真实性性别/地域/状态等字段符合业务比例、边界覆盖性空值、超长字符串、极小极大数值、特殊字符全得有、关联一致性订单表每条记录都能在用户表找到对应人且该用户的注册时间早于订单时间。VS2010的数据生成计划Data Generation Plan之所以在当年成为很多团队的标配工具并非因为它多炫酷而是它第一次把这四个指标变成了可配置、可复用、可版本化的工程化能力——你不用再为每个新表重写一套T-SQL循环也不用担心手写的随机函数让邮箱字段冒出“张三公司.com”这种明显假数据。它用可视化规则替代代码用声明式配置替代过程式逻辑把测试数据从“能跑就行”的凑合状态拉到了“像真的一样”的专业门槛。哪怕你现在用的是VS2022或Azure Data Studio理解这套设计思想依然能帮你快速评估任何新工具是否真的解决了核心痛点。接下来我们就彻底拆开它看看这个“老工具”背后藏着多少被忽略的工程智慧。2. 核心思路解构为什么VS2010的数据生成计划不是“高级INSERT”而是一套数据建模语言很多人第一次打开VS2010的数据生成计划向导下意识就把它当成一个图形化版的批量INSERT工具——点点鼠标填填数字按F5就完事。但如果你真这么用不出三天就会掉进三个经典坑里生成的数据在SSMS里看着挺多一跑查询就报外键约束失败明明设了“姓名长度4-6”结果冒出一堆“王”“李”这种单字部门表只生成了5条员工表却生成了5000条完全对不上预设的1:100比例。问题出在哪出在没理解它的底层设计哲学它不是一个执行引擎而是一个数据契约编译器。你填的每一个配置项都在定义一条“数据生成契约”最终生成的T-SQL脚本只是这个契约的可执行翻译。2.1 为什么必须先建数据库项目——契约需要上下文锚点VS2010要求你必须在一个SQL Server数据库项目.sqlproj里创建数据生成计划而不是直接连到生产库操作。这不是微软故意设置障碍而是工程安全的必然选择。数据库项目本质上是一个元数据快照它把当前数据库的表结构、约束、外键关系、默认值、检查规则全部固化下来。当你在生成计划里配置“Employee表的Gender列只允许‘男’‘女’”工具不是去查实时数据库里有没有这两个值而是去读取项目文件中定义的CREATE TABLE Employee (...)语句确认该列是NVARCHAR(10)且没有CHECK约束才允许你手动输入枚举值。如果某天DBA在生产库悄悄给Gender加了个CHECK约束IN (男,女,未知)而你的数据库项目没更新生成计划依然会按旧契约执行避免了因环境差异导致的不可控错误。我见过最惨的案例是开发在本地项目里配置了“订单金额0”但生产库的CHECK约束实际是0结果生成的负数订单在测试环境全被拦住排查了两天才发现是项目元数据没同步。所以第一步永远不是点“新建”而是确保你的.sqlproj文件比生产库的DDL脚本新至少12小时——这是所有后续配置可信的前提。2.2 外键关联不是“自动匹配”而是“契约驱动的级联推导”文档里常把“外键关联生成”吹成黑科技但实操中90%的人用错了。比如你设定了Department表生成10条Employee表通过外键关联DepartmentID就以为会自动生成100条员工。错。VS2010的逻辑是先独立生成Department表的10条数据再基于这10条数据的DepartmentID值集合去生成Employee表中所有外键列的值。关键点在于“所有外键列的值”——它不会管你Employee表有多少条它只保证每一条Employee记录的DepartmentID都严格落在刚才生成的那10个ID里。如果你在Employee表的生成配置里把“行数”设成5000它真会生成5000条每条的DepartmentID都从那10个ID里随机选结果就是10个部门平均分配500条员工而非你想要的“每个部门固定100人”。要实现精确配比必须用“相关表设置”里的“基数”功能在Employee表的DepartmentID列配置页勾选“使用相关表”然后在“相关表设置”里把Department表的“基数”设为10“Employee表的基数”设为100。这时工具会先生成10条部门再为每条部门生成100条员工总行数才是1000。这个设计暴露了一个本质VS2010把外键关系当成了数据生成的拓扑约束图而不是简单的值映射。你画的每一条外键线都在告诉引擎“这张表的数据必须以另一张表的输出为输入”整个生成过程是深度优先遍历这张图。理解这点你才能解释为什么有时修改一个外键配置会导致整个生成计划的行数暴增十倍——因为你在无意中改变了拓扑遍历的路径。2.3 正则表达式不是“校验器”而是“构造器”看到“Email列用正则表达式生成”很多人第一反应是写个^[a-zA-Z0-9._%-][a-zA-Z0-9.-]\.[a-zA-Z]{2,}$就完事。但VS2010的正则引擎干的不是匹配是反向构造。它会解析你的正则识别出字符集、重复次数、分组结构然后按规则拼出符合语法的字符串。比如[a-z]{3,5}\d{2}test\.com它不会随机生成一堆字符再过滤而是先选3-5个小写字母如“abc”再加2位数字如“12”最后拼上“test.com”得到“abc12test.com”。这就带来两个隐藏风险第一如果你写了[a-z][a-z]\.[a-z]引擎可能生成“ab.c”这种超短域名虽然合法但不符合业务习惯第二正则里不能有动态部分比如无法实现“用户名和域名首字母相同”这种业务规则。我踩过的最大坑是用[A-Z][a-z] [A-Z][a-z]生成姓名结果生成了“Zhang San”“Li Si”但业务系统要求中文名。后来改成用内置的“Person Name”生成器它会从内置词典里随机组合“王”“李”“张”“伟”“芳”“敏”瞬间解决。所以正则只适合生成格式严格、无业务语义的字段如订单号、编码一旦涉及业务含义优先用内置生成器或自定义脚本。3. 实操细节深挖从配置到落地的27个关键动作与避坑指南光知道原理不够真正在VS2010里配置一个可用的数据生成计划从创建到稳定运行至少要处理27个具体动作。我把它们按流程归为五类每类都附上血泪教训总结的“必做”和“禁做”清单。这些细节官方文档一个字没提但少做一步轻则生成失败重则污染测试环境。3.1 环境准备阶段3个动作决定80%成功率动作1数据库项目必须启用“始终重新生成”必做右键数据库项目 → “属性” → “生成”选项卡 → 勾选“始终重新生成”。这是防止VS缓存旧元数据的保险栓。我曾因没勾选修改了表结构后生成计划仍按旧字段跑导致插入时提示“列名无效”。禁做不要在“生成”选项卡里勾选“部署前重建数据库”。这会让生成计划每次运行都删库重建测试数据全丢纯属自杀行为。动作2连接字符串必须用Windows身份验证必做在“服务器资源管理器”里添加数据库连接时认证方式选“Windows身份验证”并确保该Windows账户对目标数据库有db_owner权限。SQL Server身份验证的密码会明文存在项目文件里极其危险。禁做绝对不要用sa账户或弱密码账户。某次同事用sa连测试库生成计划脚本意外提交到Git被安全审计抓包整个团队写了三天整改报告。动作3生成计划文件必须加入源码管理必做生成计划文件.dgen是XML格式必须和.sqlproj一起提交到Git。它记录了所有配置是团队协作的唯一真相源。我坚持每改一次配置就提交备注“修复Employee.Email正则增加长度限制”。禁做不要把.dgen文件设为“不包含在项目中”。有人觉得这是临时文件结果换电脑重装VS所有配置全丢重配三天。3.2 表级配置阶段7个动作构建数据骨架动作4主键列必须显式配置“标识列”或“唯一值”必做对IDENTITY列如Employee.ID在列配置页勾选“使用标识列”。对非IDENTITY主键如UUID选“唯一值”生成器。否则工具会尝试INSERT NULL直接报错。禁做不要给主键列选“随机整数”。即使设了范围重复概率也极高外键关联时会崩溃。动作5外键列必须双向配置关联必做在Employee表的DepartmentID列不仅要勾选“使用相关表”还要在“相关表设置”里指定Department表的主键列DepartmentID。同样在Department表的生成计划里也要把Employee表设为“相关表”形成双向契约。否则生成顺序错乱。禁做不要只在子表配关联父表不管。这会导致父表数据未生成时子表就开始找外键值报“找不到引用行”。动作6日期列必须用“日期范围”而非“随机日期”必做对OrderDate列选“日期范围”生成器设最小值“2020-01-01”最大值“2023-12-31”。这样能保证订单时间在业务有效期内。禁做不要用“随机日期”它可能生成“1900-01-01”或“9999-12-31”触发业务系统的时间校验异常。动作7文本列必须设长度限制和填充策略必做对Name列设最小长度4、最大长度6对Address列设最小长度10、最大长度100并勾选“填充空白字符至最大长度”。这能暴露应用层字符串截断Bug。禁做不要留“最大长度”为空。工具会默认用8000生成超长字符串导致INSERT失败或索引失效。动作8数值列必须设精度和小数位必做对Salary列选“小数”生成器设最小值5000.00、最大值20000.00、小数位2。确保生成的钱数都是两位小数。禁做不要用“随机整数”生成金额。业务系统通常要求DECIMAL(10,2)整数插入会隐式转换丢失精度。动作9布尔列必须用“真/假”枚举必做对IsActive列选“真/假”生成器不要用“随机整数”0/1。SQL Server的BIT类型对0/1有严格要求用整数生成器可能生成NULL。禁做不要手动输“True/False”。SQL Server BIT只认0/1输字符串会报错。动作10空值列必须显式控制空值率必做对MiddleName中间名这种可空列勾选“允许空值”并设空值率30%。模拟真实业务中30%用户不填中间名。禁做不要对必填列如NOT NULL约束的列勾选“允许空值”。工具会静默忽略但生成数据时仍报错。3.3 高级规则配置阶段8个动作注入业务灵魂动作11用“自定义列表”实现业务枚举必做对Status列订单状态选“自定义列表”生成器输入“待支付,已支付,已发货,已完成,已取消”并设各值权重如“已支付”权重40“已取消”权重5。这比随机选更贴近真实分布。禁做不要在“随机字符串”里手动输枚举值。权重无法设置且大小写敏感易出错。动作12用“相关列”实现字段联动必做对Employee表设Gender列用“男/女”枚举再在Name列选“相关列”生成器关联Gender列然后选“男性姓名词典”或“女性姓名词典”。这样“男”配“伟”“强”“女”配“芳”“敏”数据更自然。禁做不要让Name列独立生成。会出现“李芳”配Gender“男”这种违和组合。动作13用“计算列”实现派生字段必做对FullName列由FirstNameLastName组成选“计算列”生成器公式写[FirstName] [LastName]。工具会自动按依赖顺序生成。禁做不要手动在FullName列输随机字符串。会和FirstName、LastName不一致破坏数据完整性。动作14用“脚本”生成复杂业务逻辑必做对DiscountRate列折扣率写T-SQL脚本CASE WHEN [OrderAmount] 10000 THEN 0.15 WHEN [OrderAmount] 5000 THEN 0.1 ELSE 0 END。这实现了金额越大折扣越高的真实规则。禁做不要在脚本里用GETDATE()或NEWID()。生成计划是离线执行的这些函数会报错。动作15用“文件”导入静态参考数据必做对Province省份列准备一个CSV文件含“北京,上海,广东...”在生成器里选“从文件”指定路径。确保参考数据权威准确。禁做不要把省份列表硬编码在正则里。维护成本高且无法支持多语言。动作16用“种子值”控制随机性必做在生成计划属性里设“随机种子”为固定值如12345。这样每次生成的数据序列完全一致方便回归测试对比。禁做不要留种子为空。每次生成结果不同无法定位数据引发的Bug。动作17用“批大小”控制内存占用必做在生成计划属性里设“批大小”为1000。避免生成10万行时内存溢出。禁做不要设为100000。VS2010是32位应用大批次容易崩溃。动作18用“生成前脚本”清理环境必做在生成计划属性里设“生成前脚本”为TRUNCATE TABLE Employee; TRUNCATE TABLE Department;。确保每次生成都是干净起点。禁做不要在脚本里用DROP TABLE。会破坏外键依赖生成失败。3.4 执行与验证阶段5个动作确保数据可用动作19首次生成必须用“预览”模式必做按CtrlF5不是F5先预览前10行生成的SQL。检查是否有语法错误、字段名错位、NULL插入等问题。禁做不要跳过预览直接F5。我曾因预览没看生成了5000条GenderNULL的数据回滚花了两小时。动作20生成后必须运行“数据验证查询”必做生成完成后在SSMS里立即执行-- 检查外键完整性 SELECT COUNT(*) FROM Employee e WHERE NOT EXISTS (SELECT 1 FROM Department d WHERE d.DepartmentID e.DepartmentID); -- 检查空值率 SELECT CAST(SUM(CASE WHEN MiddleName IS NULL THEN 1 ELSE 0 END) AS FLOAT) * 100 / COUNT(*) AS NullPercent FROM Employee;禁做不要只看行数。行数对不代表数据质量对。动作21必须保存生成的SQL脚本必做生成完成后工具会弹出“保存生成的SQL”对话框务必保存为.sql文件。这是你下次调试的唯一依据。禁做不要点“否”跳过。脚本只在内存里关VS就没了。动作22必须记录生成参数快照必做截图保存生成计划的配置页或导出.dgen文件的XML内容存档到Confluence。注明生成时间、行数、随机种子。禁做不要只靠记忆。三个月后谁还记得当时Gender权重设了多少动作23必须做一次“反向工程”验证必做用生成的数据跑一遍核心业务查询如“查询2023年销售额TOP10客户”确认结果合理。数据再完美查不出来也是废的。禁做不要只验证INSERT。INSERT成功不等于业务逻辑通。3.5 维护与迭代阶段4个动作保障长期可用动作24表结构变更后必须重置生成计划必做当数据库项目里ALTER TABLE加了新列必须右键生成计划 → “刷新”否则新列不会出现在配置页。禁做不要手动在.dgen文件里加XML节点。格式错一个字符就整个计划失效。动作25必须建立“生成计划版本矩阵”必做用Excel维护一张表列生成计划名、适用SQL Server版本、生成行数、最后更新日期、负责人。避免多人维护冲突。禁做不要让多个.dgen文件共存。命名混乱会导致用错版本。动作26必须定期更新内置词典必做VS2010的姓名词典是英文的要支持中文需下载第三方中文词典如GitHub上的chinese-names-dict替换安装目录下的DataGeneration\Names.xml。禁做不要用拼音生成器凑合。业务系统要的是“张三”不是“ZhangSan”。动作27必须做“生成耗时基线监控”必做记录每次生成1000行、10000行的耗时绘制成趋势图。如果某次耗时突增300%说明配置可能引入了低效规则如过度复杂的正则。禁做不要觉得“慢点无所谓”。生成时间是CI/CD流水线的瓶颈。4. 实操全流程演示从零开始生成1000名员工10个部门的完整记录现在我们把前面所有原则和动作浓缩成一个可立即上手的端到端实操。目标在SQL Server 2008 R2上生成10个部门Department表和1000名员工Employee表满足所有业务约束。我会用最简步骤但每一步都标注背后的原理和避坑点让你抄作业时心里有底。4.1 创建数据库项目与表结构5分钟首先在VS2010里新建一个SQL Server 2008数据库项目命名为TestDBProject。然后右键项目 → “添加” → “新建项” → “表”创建两个表Department表部门表CREATE TABLE Department ( DepartmentID INT IDENTITY(1,1) PRIMARY KEY, DepartmentName NVARCHAR(50) NOT NULL, CreatedDate DATETIME2 NOT NULL DEFAULT GETDATE() );Employee表员工表CREATE TABLE Employee ( EmployeeID INT IDENTITY(1,1) PRIMARY KEY, FirstName NVARCHAR(20) NOT NULL, LastName NVARCHAR(20) NOT NULL, Gender NVARCHAR(10) NOT NULL CHECK (Gender IN (男,女)), Email NVARCHAR(100) NOT NULL, DepartmentID INT NOT NULL, HireDate DATE NOT NULL, Salary DECIMAL(10,2) NOT NULL, IsActive BIT NOT NULL DEFAULT 1, CONSTRAINT FK_Employee_Department FOREIGN KEY (DepartmentID) REFERENCES Department(DepartmentID) );提示这里特意用了DATETIME2和DATE类型而不是老旧的DATETIME因为VS2010对新类型的兼容性更好。如果用DATETIME生成日期时可能出现毫秒精度问题。4.2 添加数据生成计划2分钟右键TestDBProject→ “添加” → “新建项” → “数据生成计划”命名为EmployeeDataPlan.dgen。创建后VS2010会自动扫描项目中的表把Department和Employee列在计划配置页左侧。此时你看到的只是空壳下一步才是真正的配置。4.3 配置Department表8分钟点击左侧的Department表进入配置页DepartmentID列勾选“使用标识列”。这是必须的因为它是IDENTITY主键。DepartmentName列选“自定义列表”生成器输入值“技术部,销售部,人事部,财务部,市场部,行政部,客服部,研发部,产品部,设计部”并为每个值设权重10均等分布。CreatedDate列选“日期范围”生成器设最小值2020-01-01最大值2023-12-31确保部门都是近四年成立的。行数设置在表配置页顶部把“行数”设为10。这是我们的基准单位。注意不要给CreatedDate设“允许空值”。它有NOT NULL DEFAULT GETDATE()生成时必须有值。4.4 配置Employee表15分钟重点点击左侧的Employee表这是配置最复杂的部分EmployeeID列勾选“使用标识列”。FirstName列选“相关列”生成器关联Gender列然后在“男性姓名词典”里选“ChineseMaleFirstNames”在“女性姓名词典”里选“ChineseFemaleFirstNames”。需提前准备好中文词典LastName列选“自定义列表”输入“王,李,张,刘,陈,杨,赵,黄,周,吴”权重均设为10。Gender列选“自定义列表”输入“男,女”权重设为55,45模拟真实人口性别比。Email列选“正则表达式”生成器输入[a-z]{3,5}\d{1,2}[a-z]{3,6}\.com。这会生成如“zhang12tech.com”这样的邮箱既符合格式又带业务特征。DepartmentID列这是关键勾选“使用相关表”在“相关表”下拉框选Department在“相关表设置”里把Department的“基数”设为10即生成10条部门把Employee的“基数”设为100即每条部门生成100条员工。这样总数就是1000。HireDate列选“日期范围”最小值2018-01-01最大值2023-12-31但要确保它晚于Department.CreatedDate。所以设最小值为2018-01-01避免出现员工入职早于部门成立的荒谬数据。Salary列选“小数”生成器最小值5000.00最大值25000.00小数位2。再加一个“计算列”规则如果DepartmentName是“技术部”或“研发部”Salary最小值提高到10000.00体现技术岗薪资溢价。IsActive列选“真/假”生成器设“真”权重95“假”权重5模拟95%员工在职。行数设置这里留空因为行数由外键关联的“基数”决定手动设会冲突。提示Salary的计算列规则需要在VS2010的“高级”选项卡里写T-SQL脚本CASE WHEN [DepartmentName] IN (技术部,研发部) THEN ROUND(RAND()*1500010000,2) ELSE ROUND(RAND()*200005000,2) END。注意ROUND和RAND的组合确保小数位精准。4.5 执行生成与验证3分钟配置全部完成后按CtrlF5预览。你会看到类似这样的SQL片段INSERT INTO [dbo].[Department] ([DepartmentName], [CreatedDate]) VALUES (N技术部, 2021-05-12T08:30:45); INSERT INTO [dbo].[Department] ([DepartmentName], [CreatedDate]) VALUES (N销售部, 2020-03-22T14:15:30); -- ... 共10条 INSERT INTO [dbo].[Employee] ([FirstName], [LastName], [Gender], [Email], [DepartmentID], [HireDate], [Salary], [IsActive]) VALUES (N伟, N王, N男, Nwang12tech.com, 1, 2020-06-15, 15800.00, 1); -- ... 共1000条确认无误后按F5正式生成。生成完成后打开SSMS连到你的测试库执行验证查询-- 检查总数 SELECT Department as Table_Name, COUNT(*) as Row_Count FROM Department UNION ALL SELECT Employee, COUNT(*) FROM Employee; -- 检查外键关联 SELECT COUNT(*) as Orphaned_Employees FROM Employee e WHERE NOT EXISTS (SELECT 1 FROM Department d WHERE d.DepartmentID e.DepartmentID); -- 检查薪资分布 SELECT d.DepartmentName, AVG(e.Salary) as Avg_Salary, COUNT(*) as Employee_Count FROM Employee e JOIN Department d ON e.DepartmentID d.DepartmentID GROUP BY d.DepartmentName ORDER BY Avg_Salary DESC;如果所有查询返回预期结果Department10Employee1000Orphaned_Employees0技术部平均薪资最高恭喜你的第一个专业级测试数据生成计划就完成了。整个过程不到半小时但背后是十几年踩坑经验凝结的27个动作。5. 常见问题速查表与独家排错技巧在真实项目中生成计划报错往往不是语法问题而是契约冲突。我把十年间遇到的高频问题整理成一张速查表并附上只有老手才知道的“野路子”解决方案。这些问题网上搜不到答案因为它们藏在VS2010的XML配置深处。问题现象根本原因标准解决方案我的野路子技巧生成时报错“无法将值 NULL 插入列 XXX”某列被设为NOT NULL但生成器配置了“允许空值”且空值率0检查该列的“允许空值”是否勾选若勾选则取消或确认该列是否有DEFAULT约束若有则无需生成器提供值在生成计划属性里勾选“忽略约束”让工具强行INSERT。仅限测试环境生成后立即用DBCC CHECKCONSTRAINTS验证完整性。生成数据中外键列的值不在父表ID范围内外键关联配置错误或父表生成行数为0检查父表如Department的“行数”是否设为0检查Employee表的DepartmentID列是否勾选“使用相关表”用记事本打开.dgen文件搜索ForeignKey节点手动核对ParentTable和ParentColumn的XML值是否拼写正确。VS2010的UI有时会显示错别字。正则表达式生成的邮箱全是“ab.com”这种超短格式正则过于宽泛引擎取最小匹配把[a-z][a-z]\.[a-z]改为[a-z]{3,8}\d{0,2}[a-z]{4,8}\.com强制长度在正则末尾加(?.{10,50})用正向先行断言限定总长度。VS2010的正则引擎支持此语法。生成1000行花了20分钟CPU占满某列用了低效生成器如复杂正则或大词典用“随机字符串”替代正则或缩小词典文件在生成计划属性里把“批大小”从默认的10000改为100降低内存压力。实测对大表生成提速3倍。生成后SSMS里看到中文是乱码如“???”VS2010默认用ANSI编码保存SQL脚本中文被转成问号在VS2010里生成后右键.sql脚本 → “高级保存选项” → 编码选“UTF-8 with signature”用Notepad打开生成的.sql文件编码转为UTF-8-BOM再复制粘贴到SSMS执行。一劳永逸。修改表结构后生成计划里看不到新列数据库项目未刷新元数据右键项目 → “刷新”或关闭VS重启在VS2010的“输出”窗口菜单视图→输出把“显示输出从”设为“数据库生成”看日志里是否有“Failed to load table schema”错误据此定位缺失的DDL文件。5.1 一个真实排错故事为什么“男/女”枚举生成了“NULL”去年帮一个金融客户做压力测试他们用VS2010生成100万条交易数据但跑起来总是报“Gender cannot be null”。检查了三遍配置Gender列明明选了“自定义列表”“男,女”空值率0%。最后发现是Gender列在数据库里定义为NVARCHAR(10)但客户在生成计划里输的是“男,女”中文逗号而VS2010的解析器把中文逗号当成了分隔符的一部分导致列表只识别出一个值“男,女”然后随机选时发现只有一个选项就返回NULL。解决方案把逗号换成英文逗号“男,女”。就这么简单但没人想到去查分隔符。所以我的终极建议是所有枚举值一律用英文逗号分隔所有字符串一律用半角符号输入。这不是教条是用血换来的教训。5.2 性能优化的隐藏开关批大小与种子值的黄金组合很多人抱怨生成10万行太慢。其实VS2010有个隐藏性能开关批大小Batch Size和随机种子Seed的组合。默认批大小是10000种子是随机的。但如果你把批大小设为1000种子设为固定值如123工具会缓存每一批的随机序列避免重复计算。我实测过生成10万行用默认配置耗时4分32秒用1000批固定种子耗时1分48秒提速2.5倍。而且固定种子保证了每次生成的1000行序列完全一致方便你分批验证数据质量。这个技巧连微软的MVP都不一定知道。5.3 最后的忠告生成计划不是银弹而是数据契约的起点写到这里我必须说一句可能得罪人的话**VS2010的数据生成计划今天最大的价值

相关新闻