我有以下代码...
UPDATE Sales
SET MappingOrderID = CAST ([dbo].[fRemoveNonNumericCharacters] (ltrim(rtrim(ActualOrderNumber))) AS INT)
FROM Sales
where isnumeric(ActualOrderNumber) = 1
and ActualOrderNumber not like '%.%'
and len(ActualOrderNumber) < 10
and MappingOrderID is null
and ActualOrderNumber is not null
and ltrim(rtrim(ActualOrderNumber)) in (select ltrim(rtrim(OrderID)) from dbo.Orders)
参与的列如下:
来自销售: MappingOrderId INT ActualOrderNumber NVARCHAR (10)
来自订单: OrderId INT
这是旧代码,我是数据库管理员,不知道为什么他/她会使用那么多Trim...脚本需要花费9分钟才能运行,并且理想情况下需要经常运行...
我在执行计划中也看到了这个:
- CONVERT_IMPLICIT(varchar(12),[DataMart].[dbo].[Orders].[OrderID],0) - CONVERT_IMPLICIT(varchar(20),[Datamart].[dbo].[Sales].[ActualOrderNumber],0) - 表达式中的类型转换(CONVERT_IMPLICIT(varchar(20),[DataMart].[dbo].[Sales].[ActualOrderNumber],0))可能会影响查询计划选择中的"CardinalityEstimate",表达式中的类型转换(CONVERT_IMPLICIT(varchar(12),[Datamart].[dbo].[Orders].[OrderID],0))可能会影响查询计划选择中的"CardinalityEstimate"
根据我的感觉...
它通过将实际订单号(varchar)转换为更新MappingOrderId(int)...只有当实际订单号存在于订单中时才会更新...
我试过一些修改;但是varchar实际订单号的值像3545427103,如果我尝试删除任何东西,比如:
and len(ActualOrderNumber) < 10
它会崩溃...
我的总体目标是使这个过程尽可能高效;在源头修复数据是唯一真正的解决方案吗?
我实施了很多建议,时间降到了1分钟。谢谢!但我不明白的是:
以前,我有丑陋的代码:
![enter image description here](https://istack.dev59.com/pkUhJ.webp)
现在我有更多的读取量… 运行只需几秒钟…这怎么可能呢?
![enter image description here](https://istack.dev59.com/7m768.webp)