【发布时间】:2016-04-30 09:53:00
【问题描述】:
我浏览了其他一些帖子,并设法使我的查询运行得更快一些。但是,我对如何进一步优化此查询感到茫然。我将在一个网站上使用它,它会在页面加载时执行查询,但是 5.5 秒对于等待应该更简单的东西来说太长了。最大的表有大约 4,000,000 行,其他的每个大约有 400,000 行。
表结构
匹配
id BIGINT PRIMARY KEY,
region TEXT,
matchType TEXT,
matchVersion TEXT
团队
matchid BIGINT REFERENCES match(id),
id INTEGER,
PRIMARY KEY(matchid, id),
winner TEXT
冠军
id INTEGER PRIMARY KEY,
version TEXT,
name TEXT
项目
id INTEGER PRIMARY KEY,
name TEXT
参与者
PRIMARY KEY(matchid, id),
id INTEGER NOT NULL,
matchid BIGINT REFERENCES match(id),
championid INTEGER REFERENCES champion(id),
teamid INTEGER,
FOREIGN KEY (matchid, teamid) REFERENCES team(matchid, id),
magicDamageDealtToChampions REAL,
damageDealtToChampions REAL,
item0 TEXT,
item1 TEXT,
item2 TEXT,
item3 TEXT,
item4 TEXT,
item5 TEXT,
highestAchievedSeasonTier TEXT
查询
select champion.name,
sum(case when participant.item0 = '3285' then 1::int8 else 0::int8 end) as it0,
sum(case when participant.item1 = '3285' then 1::int8 else 0::int8 end) as it1,
sum(case when participant.item2 = '3285' then 1::int8 else 0::int8 end) as it2,
sum(case when participant.item3 = '3285' then 1::int8 else 0::int8 end) as it3,
sum(case when participant.item4 = '3285' then 1::int8 else 0::int8 end) as it4,
sum(case when participant.item5 = '3285' then 1::int8 else 0::int8 end) as it5
from participant
left join champion
on champion.id = participant.championid
left join team
on team.matchid = participant.matchid and team.id = participant.teamid
left join match
on match.id = participant.matchid
where (team.winner = 'True' and matchversion = '5.14' and matchtype='RANKED_SOLO_5x5')
group by champion.name;
EXPLAIN ANALYZE 的输出:http://explain.depesz.com/s/ZYX
到目前为止我做了什么
我在match.region、participant.championid 上创建了单独的索引,并在团队where winner = 'True' 上创建了部分索引(因为这只是我感兴趣的内容)。请注意enable_seqscan = on,因为当它关闭时,查询非常慢。本质上,我想要得到的结果是这样的:
Champion |item0 | item1 | ... | item5
champ_name | num | num1 | ... | num5
...
由于我还是数据库设计的初学者,因此如果我的整体表设计存在缺陷,我不会感到惊讶。不过,我仍然倾向于查询绝对低效。我玩过内连接和左连接——虽然没有显着区别。此外,匹配必须是bigint(或大于integer,因为它太小了)。
【问题讨论】:
-
对——完全忘记了!我使用的是 9.3 版
标签: postgresql join postgresql-9.3 postgresql-performance sql-optimization