3

几天来我一直遇到以下问题。我已经设法解决了它,但是性能让我感到困扰。

基本上我有一张人员表和两张表(debtwealth),其中引用了person. debt/wealth表可以有多个引用相同的行personID

我需要一个结果,我将简单地将所有列出的人以及总债务和财富作为自己的列。

首先让我代表我拥有的表格:

表“人”:

| ID | name    |
|----|---------|
|  1 | Adam    |
|  2 | Berg    |
|  3 | Carl    |
|  4 | David   |

表“财富”:

| ID | personID | value    |
|----|----------|----------|
|  1 |  1       |  100     |
|  2 |  1       |  2000    |
|  3 |  2       |  30000   |
|  4 |  3       |  400000  |
|  5 |  3       |  5000000 |

表“债务”:

| ID | personID | value    |
|----|----------|----------|
|  1 |  1       |  100     |
|  2 |  1       |  2000    |
|  3 |  2       |  30000   |
|  4 |  2       |  400000  |
|  5 |  3       |  5000000 |

预期结果:

| personID | debtSum | wealthSum |
|----------|---------|-----------|
|  1       |    2100 |      2100 |
|  2       |   30000 |    430000 |
|  3       | 5400000 |   5000000 |
|  4       |  (null) |    (null) |

我的解决方案:

SQL Fiddle

SELECT SQL_NO_CACHE p.ID, debtSum, wealthSum
FROM person AS p
LEFT JOIN (SELECT personID, SUM(value) AS debtSum FROM debt GROUP BY personID) AS d ON d.personID = p.ID
LEFT JOIN (SELECT personID, SUM(value) AS wealthSum FROM wealth GROUP BY personID) AS w ON w.personID = p.ID

此查询返回正确的数据,但正如我所说,性能让我担心。例如,如果我在一个不存在的人的债务表中添加了数千行(例如,personID = 5),则执行查询需要更长的时间。我想它确实也总结了那个人的所有数据,尽管结果不需要它?

我使用的是 SQL Server 2008,尽管SQL Fiddle它使用的是 MySQL(如果有区别的话)。

我很感激有关如何提高查询性能的提示。我的想法不多了。

4

1 回答 1

1

好吧,这就是我的做法,尽管我敢打赌,正确的索引对性能的影响会比查询结构更大:

编辑发表评论:

SELECT ID, SUM(debtSum) AS debtSum, SUM(wealthSum) AS wealthSum
FROM (
SELECT p.ID, d.value AS debtSum, NULL AS wealthSum
FROM person AS p
LEFT JOIN debt d ON d.personID = p.ID
UNION ALL
SELECT p.ID, NULL AS debtSum, w.Value AS wealthSum
FROM person AS p
LEFT JOIN wealth w ON w.personID = p.ID
) t
GROUP BY t.ID

您应该有关于 Person.Id、Debt.PersonID 和 Wealth.PersonID 的索引

于 2015-06-03T19:19:33.980 回答