小弟最近遇到一个头痛问题,还请高人指点。有一个数据量超大的表table1,大约1亿条数据,并且位于链接数据库中
如果用
方式一
select 列A,列B,列C
from table1
where 列A in ('值1')
的方式查询需要3秒钟方式二
如果把'值1'放到一个临时表TEMPTABLE中,也就是表中只有这么一个记录,再查询
select 列A,列B,列C from table1
where 列A in(
select 列1 from TEMPTABLE)
至少几分钟内出不来,停止查询都不容易问题是这个'值1'也是查询得出的,总不能先生成类似方式一的语句再执行吧,那样好像比较笨,join的方法也试过了,不行
有没有提高速度的好办法 啊?
如果用
方式一
select 列A,列B,列C
from table1
where 列A in ('值1')
的方式查询需要3秒钟方式二
如果把'值1'放到一个临时表TEMPTABLE中,也就是表中只有这么一个记录,再查询
select 列A,列B,列C from table1
where 列A in(
select 列1 from TEMPTABLE)
至少几分钟内出不来,停止查询都不容易问题是这个'值1'也是查询得出的,总不能先生成类似方式一的语句再执行吧,那样好像比较笨,join的方法也试过了,不行
有没有提高速度的好办法 啊?
就是建INDEX还花费时间呢,只能比较着来写语句了
另外,可以试试 exec() 把用方法1生成的查询放到里面,看看速度如何。
临时表能避免就最好不用。
2、数据量大,也没什么办法了。只能试着优化,进行数据分表
3、数据量很大的情况,最好不要用临时表
4、你的应用可以通过分布查询,提高效率
先查出 值1 ,然后用 方法一 进行查询
分解大查询为几个小查询,动态组合SQL,并不是笨办法,对大数据量查询来说,有时候这种方法反而是最快的
where 列A in(
select 列1 from TEMPTABLE)
这种主要是临时表的问题,在执行时,对TEMPTABLE进行了全表扫描和排序,这两项用了较多资源;而第一种是直接查找的结果,所以快;用连接时,比IN要快。如果列有索引的话最好。