首页 > 解决方案 > 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 端发生的这种类型转换有多昂贵?如果有一百万个这样的插入发生,纠正这个有什么不同吗?

谢谢

标签: sqlsql-server

解决方案


除此之外,微软在“隐式转换”中包含了一个数据类型列表及其优先级(例如,您int在 where 子句中对bigint列使用变量,而 SQL 将“隐式转换”int为 a bigint。主要是在以下情况下您在这些字段上加入或过滤可能会遇到性能问题(例如,您可能有类似的东西,where [IntAsString] = @Int反之亦然。如果 SQL 更改了变量的类型,那么您很高兴。如果它必须更改类型列(再次,请参阅数据类型优先级链接),它必须做很多工作。

不要引用我的话,但我会说就插入而言,这可能不是什么可担心的事情。但是如果有疑问,请查看执行计划并寻找代价高昂的运算符和隐式强制转换。

https://docs.microsoft.com/en-us/sql/t-sql/data-types/data-type-precedence-transact-sql?view=sql-server-2017


推荐阅读