日期:2014-05-19  浏览次数:20512 次

高分:含千万条数据的表查询的性能问题
A表:
symbol       tdate                             tclose
000001         20070725                       1.23
000002         20070726                       0.23
000001         20070723                       2.3
000004         20070618                       1.4
B表:
symbol
000001
000002
000004
输入2007-07-26
输出
symbol           tdate               tclose       lclose
000001           20070725           1.23             2.3
000002           20070726           0.23               NULL
000004           20070618           1.4             NULL  
symbol从B表中取现出,tdate为最新的tclose,
lclose为第二新的tclose,
tclose不为0或NULL


A表的记录数为2000万条左右,现在主要是一个效率的问题.不知道怎么才能再快点.

------解决方案--------------------
说说现在的索引情况
------解决方案--------------------
语句:
select x.*,y.tclose as lclose
from a x left join a y
on a.symbol=b.symbol
and b.tdate=(select max(tdate) from a where symbol=a.symbol and tdate <a.tdate)
where a.tdate <=cast( '2007-7-26 ' as datetime)
and a.tclose <> 0 and a.tclose is not NULL
and not exists (
select 1 from a where symbol=a.symbol
and tdate <=cast( '2007-7-26 ' as datetime)
and tclose <> 0 and tclose is not NULL
and tdate> a.tdate
)

最好有索引(symbol,tdate,tclose)

------解决方案--------------------
晕,我写错了

语句:
select x.*,y.tclose as lclose
from a x left join a y
on x.symbol=y.symbol
and y.tdate=(select max(tdate) from a where symbol=x.symbol and tdate <x.tdate)
where x.tdate <=cast( '2007-7-26 ' as datetime)
and x.tclose <> 0 and x.tclose is not NULL
and not exists (
select 1 from a where symbol=x.symbol
and tdate <=cast( '2007-7-26 ' as datetime)
and tclose <> 0 and tclose is not NULL
and tdate> x.tdate
)

最好有索引(symbol,tdate,tclose)


------解决方案--------------------
要有索引(symbol,tdate,tclose)

------解决方案--------------------
看看这贴,问问这位兄弟

http://community.csdn.net/Expert/topic/5673/5673596.xml?temp=.3719904
------解决方案--------------------
问题没看明白。lclose怎么定义的?
------解决方案--------------------
试试这个.
------------------------------------------------
create table #t (
symbol varchar(10),
tdate varchar(10),
tclose numeric(8,2),
lclose numerice(8,2))

insert #t(symbol,tdate,tclose)
select a.symbol,max(tdate),tclose from a,b where a.symbol=b.symbol