更新语句时,执行时间有时需要60秒有时需要1-2秒。总行数约为 1800 万。 CARDID是我们的PK。我们的系统几乎每 2-3 秒就会向该查询发送一个请求。您可以在下面找到查询;
UPDATE C
SET
[CARDTYPE] = @NEWCARDTYPE,
[ICPGROUPID] = @NEWICPGROUPID,
[CARDNUMBER] = @NEWCARDNUMBER,
[PINCODE] = @NEWPINCODE,
[SCODE] = @NEWSCODE,
[STATUS] = @NEWSTATUS,
[CUSTOMERID] = @NEWCUSTOMERID,
[PROFILEID] = @NEWPROFILEID,
[BALANCE] = @NEWBALANCE,
[BALANCETYPE] = @NEWBALANCETYPE,
[DECIMALS] = @NEWDECIMALS,
[CURRENCY] = @NEWCURRENCY,
[STARTDATE] = @NEWSTARTDATE,
[EXPIRATIONDATE] = @NEWEXPIRATIONDATE,
[PINCOUNT] = @NEWPINCOUNT,
[PINDATE] = @NEWPINDATE,
[INITIALPIN] = @NEWINITIALPIN,
[INITIALSCODE] = @NEWINITIALSCODE,
[UPDATEDATE] = GETDATE(),
[ACTIVATIONDATE] = @NEWACTIVATIONDATE,
[REGISTERDATE] = @NEWREGISTERDATE,
[UNREGISTERDATE] = @NEWUNREGISTERDATE,
[ORDERID] = @NEWORDERID,
[RELATEDCARD] = @NEWRELATEDCARD,
[LOADCOUNT] = @NEWLOADCOUNT,
[REDEEMCOUNT] = @NEWREDEEMCOUNT,
[ISCHANGED] = 1,
[ISPROCESSED] = 0
FROM dbo.[CARD] C
WHERE
CARDID = @CARDID
我们在该表上还有一些索引。我们可以做什么?我们真的被困住了。我们又加了一个过滤器,但没有用。
更新、删除、插入必须更新每个操作的所有索引。根据输入,我只能建议删除除 PK 之外的所有索引,看看是否有帮助。如果它有帮助,但您可能不会删除索引,因为您通过某些选择使用它们,那么您至少知道问题是什么:)也许您真的可以只留下 2-3 个必要的索引。
1800 万行实际上没什么大不了的,特别是如果你通过 id 查询的话。是否有可能多个客户端同时执行此更新查询?这可以解释执行时间的差异。我还建议运行一些分析器,看看服务器上到底发生了什么以及实际的查询执行时间是多少。也许它们速度很快,但问题出在其他地方。