我有一张表tbl_test
。在此表中,我有2.4 million
条记录。我运行以下三个非常非常缓慢和令人沮丧的查询。
select count(*) from tbl_test;
-- 2.4 mil records in ~9 seconds
select count(*) from tbl_test where status = 'active';
-- 2.4 mil records in ~9 seconds
select count(*) from tbl_test where status = 'inactive';
-- 0 records in ~0 seconds
我使用以下查询创建了一个名为view_tbl_test
的视图:
create view view_tbl_test as
select * from
(select count(*) count_active from tbl_test where status = 'active' ) x,
(select count(*) count_inactive from tbl_test where status = 'inactive' ) y,
(select count(*) count_total from tbl_test) z
现在,我只从视图中选取单行,并且像以前一样花费相同的时间。
select * from view_tbl_test limit 1;
我在这里做错了吗?是否有任何方法可以使视图在~0
秒内返回数据?
答案 0 :(得分:0)
您的语句在表格上运行三个选择。这可以通过一个语句来完成:
create view view_tbl_test
as
select count(case when status = 'active' then 1 end) as count_active
count(case when status = 'inactive' then 1 end) as count_inactive,
count(*) as count_total
from tbl_test;
这应该在约。 9秒,因为它基本上与您的第一个语句相同。
最后一句话可能很快,因为你在status
上有一个索引,但由于你没有提供执行计划,这几乎是不可能的。