Hasty Briefsbeta

双语

C# strings silently kill your SQL Server indexes in Dapper

2 months ago
  • #Dapper
  • #Performance Optimization
  • #SQL Server
  • C#字符串传递给Dapper查询时可能导致SQL Server执行隐式转换(CONVERT_IMPLICIT),从varchar转为nvarchar,从而导致全索引扫描而非索引查找
  • Dapper中C#字符串默认映射为nvarchar(4000),与SQL Server中的varchar列不匹配,会降低查询性能
  • 隐式转换会显著增加CPU使用率和逻辑读取次数,对频繁执行的查询影响尤为明显
  • 解决方案是使用DynamicParameters或DbString显式指定参数类型为DbType.AnsiString以匹配varchar列
  • 确保参数类型与列类型及大小匹配对查询性能优化和缓存执行计划的高效使用至关重要
  • 审计Dapper查询中传递给varchar列的字符串参数可以发现隐藏的性能问题
  • 添加注释说明DynamicParameters或DbString的使用可以防止后续重构时重新引入性能问题
  • 使用SQL Server查询存储和执行计划等工具可以帮助识别存在隐式转换问题的查询