如果这在其他地方有答案,请提前道歉 - 我确实努力寻找但找不到。
我有一个名为“item”的表,有点像这样:
itemid applicationid value
1 1 3.00
2 2 1.00
3 2 2.00
4 3 4.00
5 3 1.00
即一个应用程序可以有多个项目。还有更多的列,但没关系。我想根据申请总价值列出项目及其价值(以便我可以将项目价值计算为申请的比例)。
所以我有一个有点像这样的查询:
SELECT i.itemid, i2.applicationid, i.value, i2.totalvalue
FROM item i
JOIN (SELECT sum(value) AS totalvalue FROM item GROUP BY applicationid) i2
ON i.applicationid = i2.applicationid
WHERE <some criteria that returns a hundred or so items>;
给我
itemid applicationid value totalvalue
1 1 3.00 3.00
2 2 1.00 3.00
3 2 2.00 3.00
4 3 4.00 5.00
5 3 1.00 5.00
这可行,但是在项目表中有 100k 行时,它非常非常慢。我的探查器告诉我,问题在于有一个正在执行完整索引扫描的子查询。
我想知道使用 GROUP BY 的自联接是否会更快,但它不仅对第二个表进行分组,而且对所有内容进行分组。IE
SELECT i.itemid, i2.applicationid, i.value, sum(i2.value)
FROM item i
JOIN item i2 ON i2.applicationid = i.applicationid
WHERE <some criteria that returns a hundred or so items>
GROUP BY i2.applicationid;
每个 applicationid 我只得到 1 行,而不是每个 itemid 1 行。
有什么方法可以重写我的原始查询以使其更快?
非常感谢。