sql - sql数据类型转换有多贵?
问题描述
我目前正在研究事务引擎,我们的锁定机制和等待时间存在一些问题。所以为了解决这个问题,我试图在一个单独的应用程序中模拟这个过程。所以我启动了 SQL 分析器并处理了一个事务。在查看查询时,我注意到以下内容:
在数据库中,我的列定义如下:
EVENTNBR (int),
DEPFILENBR (int),
DEPFILESEQ (int),
USERID (varchar(20)),
STATUS (varchar(1)),
CREATION_DT (datetime),
MOD_DT (datetime),
SOURCE_TYPE (varchar(100)),
SOURCE_GROUP (varchar(100)),
SOURCE_REFID (varchar(100)),
SOURCE_DATE (datetime),
CHECKSUM (varchar(50)),
但是,当我查看查询时,在 SQL 分析器中说一个插入语句,不知何故,某处,代码正在发送以下内容;
INSERT INTO TABLE_DATA WITH (ROWLOCK) (EVENTNBR, DEPFILENBR, DEPFILESEQ, USERID, STATUS, CREATION_DT, MOD_DT, SOURCE_TYPE, SOURCE_GROUP, SOURCE_REFID, SOURCE_DATE, CHECKSUM)
@mod_dt **varchar(19),**
@source_date **varchar(8000),**
@depfilenbr **varchar(7),**
@eventnbr **varchar(1),**
@source_refid **varchar(8000),**
@creation_dt **varchar(19)**,
@source_group varchar(8000),
@source_type **varchar(7),**
@userid **varchar(7)**,
@checksum **varchar(44)**,
@status **varchar(1)**,
@depfileseq **varchar(1)**',
现在查询成功并且工作正常。我想知道在 SQL 端发生的这种类型转换有多昂贵?如果有一百万个这样的插入发生,纠正这个有什么不同吗?
谢谢
解决方案
除此之外,微软在“隐式转换”中包含了一个数据类型列表及其优先级(例如,您int
在 where 子句中对bigint
列使用变量,而 SQL 将“隐式转换”int
为 a bigint
。主要是在以下情况下您在这些字段上加入或过滤可能会遇到性能问题(例如,您可能有类似的东西,where [IntAsString] = @Int
反之亦然。如果 SQL 更改了变量的类型,那么您很高兴。如果它必须更改类型列(再次,请参阅数据类型优先级链接),它必须做很多工作。
不要引用我的话,但我会说就插入而言,这可能不是什么可担心的事情。但是如果有疑问,请查看执行计划并寻找代价高昂的运算符和隐式强制转换。
推荐阅读
- python - BeautifulSoup + Selenium,将使用 div 构建的动态表格文本发送到列表
- themes - 华为主题,尝试上传主题提交时出错
- pandas - 使用 Pandas 在每个 \newline 处将文本文件分成多个数据集
- javascript - 'number' 类型的参数不能使用 ParseInt 分配给'string' 类型的参数
- python - 匹配多个捕获组在正则表达式中必须不同的字符串
- javascript - 向 getRange() 添加变量
- ruby-on-rails - 即使满足条件,rails 6表单验证错误
- node.js - 如何使用 jest/enzyme 模拟 multer 以使用 axios post mock call 进行文件上传
- python - from ._nnls import nnls ImportError: DLL load failed: 找不到指定的模块
- bash - 使用 grep 完全匹配文件内文本中的字符串,然后将这些文件移动到单独的目录