简单的 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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...