Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SUM()的慢速MySQL查询_Mysql_Query Performance - Fatal编程技术网

使用SUM()的慢速MySQL查询

使用SUM()的慢速MySQL查询,mysql,query-performance,Mysql,Query Performance,我必须在我的代码中运行两个查询来获得租户余额。但是,这些查询太慢 第一个查询,我得到所有租户及其单位名称: SELECT t.TenantID FROM Tenants t JOIN Units u ON t.UnitID = u.UnitID Where t.Prospect = 2 AND t.PropertyID = 8 ORDER BY CONCAT(Left(Replace(UnitName,'-',''),2), R

我必须在我的代码中运行两个查询来获得租户余额。但是,这些查询太慢

第一个查询,我得到所有租户及其单位名称:

SELECT t.TenantID 
  FROM Tenants t
  JOIN Units u
    ON t.UnitID = u.UnitID
 Where t.Prospect = 2 
   AND t.PropertyID = 8
 ORDER 
    BY CONCAT(Left(Replace(UnitName,'-',''),2),
              REPEAT('0', (10-CHAR_LENGTH(UnitName))),
              Right(Replace(UnitName,'-',''),
                    CHAR_LENGTH(Replace(UnitName,'-',''))-2
             )     )
它返回500行

然后我得到了4种条件下的余额。此查询将位于第一个查询循环内:

Select
        SUM(CASE WHEN TransactionTypeID = 1 AND ChargeTypeID != 6 THEN TransactionAmount ELSE 0 END) AS TotalDebit,
        SUM(CASE WHEN TransactionTypeID = 1 AND ChargeTypeID = 6 THEN TransactionAmount ELSE 0 END) AS HousingDebit,
        SUM(CASE WHEN TransactionTypeID = 2 AND ChargeTypeID != 6 THEN TransactionAmount ELSE 0 END) AS TotalCredit,
        SUM(CASE WHEN TransactionTypeID = 2 AND ChargeTypeID = 6 THEN TransactionAmount ELSE 0 END) AS HousingCredit
    From TenantTransactions
    Where TenantID= FirstQuery.TenantID

我是不是做错了?运行大约需要1分钟。

使用
分组方式在单个查询中执行此操作

试着这样做:

SELECT t.TenantID, TotalDebit, HousingDebit, TotalCredit, HousingCredit
  FROM Tenants t
  JOIN Units u ON t.UnitID = u.UnitID
  LEFT JOIN (
        Select
          TenantID,
          SUM(CASE WHEN TransactionTypeID = 1 AND ChargeTypeID != 6 THEN TransactionAmount ELSE 0 END) AS TotalDebit,
          SUM(CASE WHEN TransactionTypeID = 1 AND ChargeTypeID = 6 THEN TransactionAmount ELSE 0 END) AS HousingDebit,
          SUM(CASE WHEN TransactionTypeID = 2 AND ChargeTypeID != 6 THEN TransactionAmount ELSE 0 END) AS TotalCredit,
          SUM(CASE WHEN TransactionTypeID = 2 AND ChargeTypeID = 6 THEN TransactionAmount ELSE 0 END) AS HousingCredit
        From TenantTransactions
       Group By TenantID
       ) sums ON sums.TenantID = t.TenantID
 Where t.Prospect = 2 
   AND t.PropertyID = 8
 ORDER 
    BY CONCAT(Left(Replace(UnitName,'-',''),2),REPEAT('0', (10-CHAR_LENGTH(UnitName))),Right(Replace(UnitName,'-',''),CHAR_LENGTH(Replace(UnitName,'-',''))-2))
内部查询可能仍会运行一段时间,但只运行一次

租户交易
上尝试包含以下列的复合覆盖索引:
(租户ID、TransactionTypeID、ChargeTypeID、TransactionMount)
,以优化查询中的金额


租户
上尝试一个包含
(PropertyID,Prospect)
列的复合索引。

下面是另一种使用子查询的方法。您知道,性能问题可能不是数据库性能,而是数据库和应用程序服务器之间的来回。因此,这是一个单一的查询将有所帮助

SELECT t.TenantID,
  (SELECT SUM(CASE WHEN TransactionTypeID = 1 AND ChargeTypeID != 6 THEN TransactionAmount ELSE 0 END) From TenantTransactions TT WHERE TT.TenantID=t.TenantID) AS TotalDebit,
  (SELECT SUM(CASE WHEN TransactionTypeID = 1 AND ChargeTypeID = 6 THEN TransactionAmount ELSE 0 END) From TenantTransactions TT WHERE TT.TenantID=t.TenantID) AS HousingDebit,
  (SELECT SUM(CASE WHEN TransactionTypeID = 2 AND ChargeTypeID != 6 THEN TransactionAmount ELSE 0 END) From TenantTransactions TT WHERE TT.TenantID=t.TenantID) AS TotalCredit,
  (SELECT SUM(CASE WHEN TransactionTypeID = 2 AND ChargeTypeID = 6 THEN TransactionAmount ELSE 0 END) From TenantTransactions TT WHERE TT.TenantID=t.TenantID) AS HousingCredit  
  FROM Tenants t
  JOIN Units u
    ON t.UnitID = u.UnitID
 Where t.Prospect = 2 
   AND t.PropertyID = 8
 ORDER 
    BY CONCAT(Left(Replace(UnitName,'-',''),2),REPEAT('0', (10-CHAR_LENGTH(UnitName))),Right(Replace(UnitName,'-',''),CHAR_LENGTH(Replace(UnitName,'-',''))-2))

你给你的表编索引了吗?查询中的函数调用太多。这绝对是反应迟钝的原因。但是,要有一个更好的。在解决方案中,您需要指定表结构、索引和键是的,租户和租户事务表由租户TID链接。TenantID是租户PK,租户交易FK请阅读此内容。请特别注意有关查询性能的部分。请您的问题提供我们需要的基本信息。谢谢您。。。它跑得很快。由于某些原因,某些余额返回的值与我的慢速查询不同。您是否找到导致数据差异的原因?是的,抱歉。你的问题很完美。我改变了一个条件。谢谢,里面有多余的逗号。现在已经修复了。谢谢,但是它仍然返回语法错误,因为结尾在案例中。我正在使用MySQL