下面的查询是在一个非常大的表(300MM行)上运行,并且运行时间不到半秒。
self.cardView.transform = CGAffineTransform.identity
以下是执行计划:
SELECT ld.user_profile_id,
CASE WHEN ld.first_name IS NULL THEN '' ELSE UPPER(first_name) END as first_name,
CASE WHEN ld.last_name IS NULL THEN '' ELSE UPPER(ld.last_name) END as last_name
FROM data ld
WHERE ld.hashed_ssn = 'xxxx'
UNION
SELECT ld.user_profile_id,
CASE WHEN ld.first_name IS NULL THEN '' ELSE UPPER(first_name) END as first_name,
CASE WHEN ld.last_name IS NULL THEN '' ELSE UPPER(ld.last_name) END as last_name
FROM data ld
WHERE ld.email = '123@GMAIL.COM'
UNION
SELECT ld.user_profile_id,
CASE WHEN ld.first_name IS NULL THEN '' ELSE UPPER(first_name) END as first_name,
CASE WHEN ld.last_name IS NULL THEN '' ELSE UPPER(ld.last_name) END as last_name
FROM data ld
WHERE ld.home_phone = '5512345678';
我确实为hashed_ssn,电子邮件和手机添加了索引,但是我仍然没有达到我正在寻找的速度。这只是因为桌子那么大吗?有关如何加快此查询的任何建议吗?
提前谢谢。
答案 0 :(得分:1)
您正在检索大约400行,这些行随机位于磁盘上。这需要大约1000个IO操作,其速度将取决于您的存储可提供多少IOPS。
如果您的表不经常更改,则可以强制它将相同hashed_ssn
的数据行存储在彼此附近。这样查询就不必从存储中检索那么多随机块。
alter table data cluster on hashed_ssn_index_data;
cluster data;
这将花费相当多的时间并且即使对于读取也会阻止该表。数据库不会尝试在插入/更新时保留此顺序或行,因此如果您要更改数据,性能将逐渐降低。但您可以定期重新运行cluster data;
。