示例工程数据库教程后端【免费下载链接】sql-server-samplesAzure Data SQL Samples - Official Microsoft GitHub Repository containing code samples for SQL Server, Azure SQL, Azure Synapse, and Azure SQL Edge项目地址https://gitcode.com/gh_mirrors/sq/sql-server-samples点击查看免费下载本文基于 samples/applications/iot-smart-grid 示例展开。该示例演示了如何利用 SQL Server 2016或更高版本的内存优化数据库能力支撑 IoT 智能电网Smart Grid场景下极高的数据输入速率大量 IoT 电表持续向数据库发送用电量测量数据。读完本文你将掌握内存优化表Memory Optimized Tables、内存优化表值参数TVP、原生编译存储过程Natively Compiled Stored Procedures、聚集列存储索引CCI与 Power BI 的组合应用方式并能在本地或 Azure SQL Database 上完整复现这一数据摄取与实时分析管道。关于本示例本示例官方仓库中的 README核心信息如下适用版本SQL Server 2016或更高版本Enterprise / Developer / Evaluation 版以及 Azure SQL Database关键特性内存优化表与表值参数TVP、原生编译存储过程、聚集列存储索引CCI、Power BI 可视化工作负载面向 IoT 的数据摄取Data Ingestion编程语言.NET C# 与 T-SQL作者Perry Skountrianosperrysk-msft。示例模拟的是一条完整的 IoT 数据链路多个 IoT 电表不断产生用电量测量数据 → 数据生成器Data Generator以多异步任务方式批量写入 → 内存优化表承接高频写入 → 历史数据定期卸载到聚集列存储索引 → Power BI 完成实时运营分析可视化。端到端架构与数据流从控制台客户端的源码头注释ConsoleClient/Program.cs可以看到官方对整体场景的完整描述数据生成器模拟的是经典的“高数据输入速率/冲击吸收器Shock Absorber”模式——数据洪峰先被内存优化表以极低延迟吸收再以可控节奏卸载到面向分析的列存储结构中从而避免高频随机写入拖垮基于磁盘的传统行存储。数据流可以概括为如下五个环节生成SqlDataGenerator中每个异步任务Async Task生成一批随机值记录模拟单个 IoT 电表的测量数据传输批次数据打包进内存优化的表值参数TVPudtMeterMeasurement写入调用原生编译存储过程InsertMeterMeasurement把 TVP 一次性插入内存优化表MeterMeasurement卸载后台任务周期性调用InsertMeterMeasurementHistory将MeterMeasurement中指定MeterID的历史数据转移到聚集列存储索引表MeterMeasurementHistory并删除内存表中的对应记录保持“热”内存区容量可控可视化Power BI 通过视图vwMeterMeasurement读取按秒聚合的实时指标形成仪表板。环境准备与前置条件软件前置条件SQL Server 2016或更高版本或一个 Azure SQL DatabaseVisual Studio 2015或更高版本并安装最新版 SSDTSQL Server Data ToolsPower BI Desktop用于加载随示例提供的PowerDashboard.pbix报表。Azure 前置条件需要在 Azure 订阅中具备创建 Azure SQL Database 的权限示例可发布到 Azure SQL Database详见下文“发布数据库”小节。快速运行脚本 数据生成器方式这是不借助 Visual Studio 的最快路径共 5 步创建数据库在 SQL Server 实例上创建一个名为PowerConsumption的数据库这是示例默认连接的库名创建数据库对象在PowerConsumption中运行 setup-or-reset-demo.sql该脚本会先DROP再CREATE全部对象内存优化表、CCI 历史表、TVP、两个存储过程与视图可反复执行用于重置演示环境启动数据生成器运行WinFormsClientClient.exe或ConsoleClientConsoleClient.exe检查连接字符串如需修改编辑 App.config。默认配置连接本地默认 SQL Server 实例并使用集成身份验证Server.;DatabasePowerConsumption;Integrated SecurityTrue加载 Power BI 报表WinForms 客户端点击左下角链接控制台客户端输入REPORT命令。注意内存优化表依赖数据库中的内存优化数据文件组MEMORY_OPTIMIZED_DATA。在本地 SQL Server 上执行上述脚本前需要先为PowerConsumption数据库配置该文件组见下文mod.sql说明发布到 Azure SQL Database 时平台会自动管理无需手动创建。从 Visual Studio 构建运行完整开发方式克隆本仓库或下载 zip用 Git for Windows 或直接下载均可打开仓库根目录下的IoT-Smart-Grid.sln解决方案文件示例包含两个工作负载客户端ConsoleClient控制台与WinFormsClientWindows 窗体。右键目标项目选择“设为启动项目”Set as StartUp Project在 Visual Studio 的“生成”菜单中执行生成解决方案或按 F6修改 App.config 配置位于 Solution Items 解决方案文件夹中根据自身硬件规格调整参数详见下一节参数表发布数据库右键Db数据库项目SQL Server Database Project选择Publish点击Edit...配置连接字符串推荐使用数据库名PowerConsumption示例默认运行库名点击Publish完成发布发布到 Azure SQL 时的额外要求① 将 Db 项目的目标平台切换为Microsoft Azure SQL Database V12② 发布前注释掉 Db/Storage/mod.sql 中的 T-SQL构建并运行应用注意不要使用调试器Debugger运行否则会拖慢应用速度、影响负载真实性启动工作负载ConsoleClient 中输入STARTWinFormsClient 中点击Start按钮启动 Power BI 报表ConsoleClient 中在命令行输入REPORTWinFormsClient 中点击Power BI Report链接在 Power BI Desktop 中点击Edit Queries → Source确认 Server 与 Database Name 与第 6 步发布的连接信息一致点击 OK 应用。App.config 参数详解App.config 是工作负载调优的核心。下表完整列出全部配置项及其仓库中携带的默认值配置项默认值说明DbconnectionStringsServer.;DatabasePowerConsumption;Integrated SecurityTrueSQL Server 连接字符串默认本地默认实例 集成身份验证文件中同时保留了连接 Azure SQL Database 的示例Servertcp:...database.windows.net,1433;...已注释insertSPNameInsertMeterMeasurement用于插入样本数据的原生编译存储过程名numberOfDataLoadTasks70数据生成器使用的异步任务数每个 SQL 连接dataLoadCommandDelay2000两次 SQL 命令之间的延迟毫秒压测时可设为0以获得最大吞吐batchSize70000每个任务产生的插入批次行数deleteSPNameInsertMeterMeasurementHistory将历史数据卸载到列存储索引的存储过程名numberOfOffLoadTasks50卸载任务使用的异步任务数每个 SQL 连接offLoadCommandDelay0两次卸载调用之间的延迟毫秒可设为0追求最大吞吐deleteBatchSize1000000卸载批次的行数规模numberOfMeters75000000参与模拟的 IoT 电表总数唯一 MeterID 数commandTimeout600SQL 命令超时时间秒rpsFrequency500每秒写入行数Rows per Second, RPS的轮询频率毫秒logFileNamelog.txt日志文件路径delayStart0启动延迟Delay Graph IntervalappRunDuration1800000应用运行时长毫秒默认 30 分钟numberOfRowsOfloadLimit1400000触发卸载的行数上限powerBIDesktopPathC:\Program Files\Microsoft Power BI Desktop\bin\PBIDesktop.exePBIDesktop.exe 的本地路径这些参数会直接映射到数据生成器内部。例如 DataGenerator/SqlDataGenerator.cs 中BatchSize、Delay均带有参数校验逻辑Validate(...)而Rps/Drps属性则实时计算每秒插入 / 删除行数供客户端界面与rpsFrequency轮询逻辑使用。数据库对象源码级解析下面逐一对 setup-or-reset-demo.sql 与 Db 数据库项目Db.sqlproj中的对象进行剖析。SSDT 项目中的对象定义与重置脚本略有差异如哈希桶数量不同见下文但语义一致。1. 内存优化热表 MeterMeasurementDb/dbo/Tables/MeterMeasurement.sql 定义了承接高频写入的“热”表MeasurementID BIGINT IDENTITY主键使用非聚集哈希索引PRIMARY KEY NONCLUSTERED HASHSSDT 版本BUCKET_COUNT 16777216MeterID列上另建一个非聚集哈希索引SSDT 版本BUCKET_COUNT 1048576用于支撑按电表 ID 的快速查找与卸载表级选项MEMORY_OPTIMIZED ON, DURABILITY SCHEMA_ONLY仅持久化架构、不持久化数据行这是追求极致写入性能的关键——重启后数据会清空属于典型的缓存/缓冲型内存表用法。setup-or-reset-demo.sql中对应定义L18-L30使用了BUCKET_COUNT 10000000与1000000。哈希索引桶数应设置为预期唯一键数量的幂次级别过小会导致桶链过长、性能退化。2. 内存优化表值参数 udtMeterMeasurementDb/dbo/User Defined Types/udtMeterMeasurement.sql 定义了一个内存优化的表值参数类型MEMORY_OPTIMIZED ON结构上比目标表多一列RowID带哈希索引IX_RowIDSSDT 版本BUCKET_COUNT 131072用于在批内唯一标识行。TVP 是批量数据进入原生编译存储过程的载体——相比逐行INSERTTVP 把整批数据作为一个参数传入大幅减少网络往返与编译开销。3. 原生编译存储过程 InsertMeterMeasurementDb/dbo/Stored Procedures/InsertMeterMeasurement.sql 是写入路径的性能核心CREATE PROCEDURE [dbo].[InsertMeterMeasurement] Batch AS dbo.udtMeterMeasurement READONLY, BatchSize INT WITH NATIVE_COMPILATION, SCHEMABINDING AS BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVELSNAPSHOT, LANGUAGENEnglish) INSERT INTO dbo.MeterMeasurement (MeterID, MeasurementInkWh, PostalCode, MeasurementDate) SELECT MeterID, MeasurementInkWh, PostalCode, MeasurementDate FROM Batch END;要点WITH NATIVE_COMPILATION过程被编译为机器码执行时不再逐次解释是内存 OLTP 低延迟写入的关键SCHEMABINDING与底层表/类型强绑定保证编译产物稳定BEGIN ATOMIC要求原生编译过程必须使用原子块这里显式指定SNAPSHOT隔离级别避免锁开销Batch AS ... READONLYTVP 以只读方式传入随后一条INSERT ... SELECT完成整批落表。4. 卸载存储过程 InsertMeterMeasurementHistoryDb/dbo/Stored Procedures/InsertMeterMeasurementHistory.sql 是普通非原生编译存储过程在单个事务内完成“搬移”BEGIN TRAN INSERT INTO dbo.MeterMeasurementHistory (...) SELECT ... FROM dbo.MeterMeasurement WITH (SNAPSHOT) WHERE MeterID MeterID DELETE FROM dbo.MeterMeasurement WITH (SNAPSHOT) WHERE MeterID MeterID COMMIT它按MeterID把内存热表中的记录插入列存储历史表再删除内存表中的对应行。WITH (SNAPSHOT)提示配合内存表的乐观并发模型保证搬移过程的一致性。这正是“冲击吸收器”模式的收尾环节高频写入数据在内存表短暂驻留后以批量方式沉淀到面向分析的列存储。5. 聚集列存储索引历史表 MeterMeasurementHistoryDb/dbo/Tables/MeterMeasurementHistory.sql 定义的MeterMeasurementHistory表本身是普通堆表但叠加了CREATE CLUSTERED COLUMNSTORE INDEX [ix_MeterMeasurementHistory]。列存储索引以列式压缩存储海量历史数据支持对“全部历史 实时内存数据”的混合查询这正是实时运营分析Real-Time Operational Analytics的核心能力。setup-or-reset-demo.sql版本L32-L40还显式指定了COMPRESSION_DELAY 0。6. 实时聚合视图 vwMeterMeasurementDb/dbo/Views/vwMeterMeasurement.sql 面向 Power BI 提供秒级聚合结果按PostalCode与“精确到秒”的MeasurementDate通过DATETIMEFROMPARTS重组分组输出MeterCount电表数与AvgMeasurementInkWh平均用电量。视图使用WITH (NOLOCK)读取内存表避免快照开销保证实时性。7. mod.sql 与内存优化文件组Db/Storage/mod.sql 是 Db 项目的预部署脚本目前内容整体处于注释状态--ALTER DATABASE [$(DatabaseName)] ADD FILEGROUP [mod] CONTAINS MEMORY_OPTIMIZED_DATA;在本地 SQL Server上如果目标数据库尚未创建MEMORY_OPTIMIZED_DATA文件组需要先取消注释并执行该语句或等效操作否则无法创建内存优化表在Azure SQL Database上内存优化文件组由平台自动管理无需也不允许手动创建这正是 README 要求发布 Azure SQL 前注释掉此脚本的原因。8. 数据生成器实现原理DataGenerator/SqlDataGenerator.cs 是负载引擎每个异步任务维护自己的 SQL 连接循环执行“生成一批样本数据 → 调用插入存储过程”直至被用户停止任务以CancellableTask封装并登记在ConcurrentDictionaryint, CancellableTask中可参见 DataGenerator/CancellableTask.cs随机数使用ThreadLocalRandom避免多线程共享Random实例带来的竞争与序列退化邮编数据来自内置的postalCodes数组西雅图地区邮编配合随机电表 ID、时间戳与用电量生成真实感数据Rps/Drps属性基于Stopwatch与累计行数实时计算每秒插入/删除行数供界面与日志展示吞吐任务还受numberOfRowsOfloadLimit约束触发卸载逻辑保持内存表规模在预期水位。控制台客户端 ConsoleClient/Program.cs 提供交互命令循环START启动负载、STOP停止、HELP帮助、REPORT打开 Power BI 报表、EXIT退出。WinForms 客户端WinFormsClient/FrmMain.cs提供等价的图形界面操作。运行状态观测与验证setup-or-reset-demo.sql顶部注释区提供了一组可直接使用的验证查询用于在演示过程中观测数据库内部状态SELECT * FROM sys.dm_db_resource_stats SELECT * FROM sys.dm_exec_requests SELECT * FROM sys.dm_db_column_store_row_group_physical_stats SELECT COUNT(*) FROM [dbo].[MeterMeasurementHistory] with (nolock) SELECT COUNT(*) FROM [dbo].[MeterMeasurement]sys.dm_db_resource_stats数据库资源使用统计Azure SQL 上尤为有用sys.dm_exec_requests当前执行的请求观察写入与卸载任务的并发情况sys.dm_db_column_store_row_group_physical_stats列存储行组物理统计检查历史数据落盘与压缩状态两个COUNT(*)对比内存热表与列存储历史表的行数变化验证“吸收 → 卸载”节奏是否符合预期。适用性与注意事项仓库 README 明确声明示例代码并非“如何构建可扩展企业级应用”的最佳实践集合其定位是快速上手演示。使用时应结合自身硬件规格调整App.config中的任务数、批次大小与延迟参数例如追求最大吞吐时可将dataLoadCommandDelay、offLoadCommandDelay设为0。此外SCHEMA_ONLY持久化意味着内存表数据在实例重启后丢失生产环境中是否需要落盘需根据业务权衡。相关资源仓库内内存优化 OLTP 相关的更多官方示例samples/features/in-memory-database含 in-memory-oltp 工程与内存优化 tempdb 元数据示例列存储索引深入示例samples/features/columnstore同仓库的姊妹示例 IoT Connected Carsamples/applications/iot-connected-car同样基于内存优化表与 TVP 实现高吞吐数据摄取示例的 Power BI 报表文件PowerDashboard.pbix数据库项目定义Db.sqlproj。赞分享示例工程数据库教程后端【免费下载链接】sql-server-samplesAzure Data SQL Samples - Official Microsoft GitHub Repository containing code samples for SQL Server, Azure SQL, Azure Synapse, and Azure SQL Edge项目地址https://gitcode.com/gh_mirrors/sq/sql-server-samples点击查看免费下载相关推荐Dragonfly 深入解析兼容 Redis/Memcached 的高吞吐内存数据存储与核心设计Dragonfly 深入解析兼容 Redis/Memcached 的高吞吐内存数据存储与核心设计 Dragonfly 是面向现代云应用工作负载的内存数据存储数据库KV存储缓存SQL Server In-Memory OLTP 高并发 IoT 数据接入实战基于 sql-server-samples 的 Connected Car 示例解析SQL Server In Memory OLTP 高并发 IoT 数据接入实战基于 sql server samples 的 Connected Car 示示例工程数据库教程后端深入解析MMFewShot架构模块化设计如何简化少样本学习深入解析MMFewShot架构模块化设计如何简化少样本学习 MMFewShot是OpenMMLab推出的少样本学习工具箱与基准测试平台通过精心设计的模块化架上一篇Crossbeam 项目教程下一篇探索degit——无复杂性的项目模板构建神器创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
