如何解决简单的 SQL 查询超时取决于输入参数
我有一个非常奇怪的问题,根据查询参数,下面代码中的数据库调用将失败:
Exception.Message = Execution Timeout Expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
System.Data.sqlClient.sqlException (0x80131904): Execution Timeout Expired. The timeout period elapsed prior to completion of the operation or the server is not responding. ---> System.ComponentModel.Win32Exception (0x80004005): The wait operation timed out
代码是:
public IList<ProductCommissionMinimal> FindProductCommissionMinimal(string premiumTypeCode,string sellerId,string eposProductId,string singlePremiumPolicy)
{
var sql = @"
SELECT distinct
CSP.ProductSubtypeId,PC.ProductFamilyId,PC.ProductId
FROM
ProductCommission PC,CommissionTemplate CT,Seller S,Product P,CoreSystemProduct CSP
WHERE
PC.ProductFamilyId = CSP.ProductFamilyId AND PC.ProductId = CSP.ProductId
AND P.ProductFamilyId = CSP.ProductFamilyId AND P.ProductId = CSP.ProductId
AND CT.PremiumTypeCd = @premiumTypeId
AND S.SellerId = @sellerId
AND CT.CommissionTemplateSeq = PC.CommissionTemplateSeq
AND CT.StatusCd = 'O'
AND PC.distributionId = S.distributionId
AND CT.AvailabilityCd <> 'I'
AND CSP.CoreProductId = @eposProductId";
var parameters = new Dictionary<string,object>
{
{ "@premiumTypeId",premiumTypeCode },{ "@sellerId",sellerId },{ "@eposProductId",eposProductId },};
if (premiumTypeCode == "1")
{
sql = sql + " AND P.IsSinglePremiumOnlyCd = @singlePremiumPolicy";
parameters["@singlePremiumPolicy"] = singlePremiumPolicy;
}
return Query<ProductCommissionMinimal>(sql,parameters);
}
Query 方法执行一个通用方法,该方法最终执行 System.Data.Common.DbCommand.ExecuteReader()
这个相同的通用方法在我们的代码库中用于数百个不同的内联查询,没有问题,所以我认为那里没有任何问题。此通用方法还使用默认命令超时,即没有指定为 30 秒。然而,这个 sql 查询应该几乎立即返回,所以我不认为这只是一个长时间运行的查询。
我看到的问题是,对于某些参数组合,这可以正常工作,但对于其他参数组合会出错。例如,它似乎错误: premiumTypeCode=5&sellerId=NQ49&eposProductId=UPR3SAA&singlePremiumPolicy=Y 但不是 premiumTypeCode=5&sellerId=NQ49&eposProductId=ABC3SAA&singlePremiumPolicy=Y
这个特定方法的一个独特之处在于它是我们代码库中唯一使用 CoreProductId
列的方法。似乎如果我将该参数值更改几个字母,它就可以正常工作。
我对此失去了理智。任何见解都会有很大帮助。后端数据库为sql Server 2016。
编辑 我已将查询更新为:
public IList<ProductCommissionMinimal> FindProductCommissionMinimal(string premiumTypeCode,string singlePremiumPolicy)
{
var sql = @"
SELECT distinct CSP.ProductSubtypeId,PC.ProductId
FROM
ProductCommission PC
INNER JOIN
CommissionTemplate CT
ON
CT.CommissionTemplateSeq = PC.CommissionTemplateSeq
INNER JOIN
Seller S
ON
PC.distributionId = s.distributionId
INNER JOIN
CoreSystemProduct CSP
ON
PC.ProductFamilyId = CSP.ProductFamilyId AND PC.ProductId = CSP.ProductId
INNER JOIN
Product P
ON
P.ProductId = CSP.ProductId AND P.ProductFamilyId = CSP.ProductFamilyId
WHERE
CT.PremiumTypeCd = @premiumTypeId
AND S.SellerId = @sellerId
AND CT.StatusCd = 'O'
AND PC.distributionId = S.distributionId
AND CT.AvailabilityCd <> 'I'
AND CSP.CoreProductId = @eposProductId";
var parameters = new Dictionary<string,object>
{
{ "@premiumTypeId",};
if (premiumTypeCode == "1")
{
sql = sql + " AND P.IsSinglePremiumOnlyCd = @singlePremiumPolicy";
parameters["@singlePremiumPolicy"] = singlePremiumPolicy;
}
return Query<ProductCommissionMinimal>(sql,parameters);
}
如推荐。然而,这对于某些参数组合仍然失败,例如premiumTypeCode=1&sellerId=TC99&eposProductId=UPO2SAA&singlePremiumPolicy=N
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。