首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

高分:含千万条数据的表查询的性能有关问题

2012-02-19 
高分:含千万条数据的表查询的性能问题A表:symboltdatetclose000001200707251.23000002200707260.230000012

高分:含千万条数据的表查询的性能问题
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


group by a.symbol,tclose

create index idx_t_symbol_tdate on #t (symbol,tdate)

update #t set lclose = b.tclose from a b
where #t.symbol=b.symbol and b.tdate < #t.tdate and not exists (select * from a where a.symbol=b.symbol and a.tdate> b.tdate)

select * from #t

drop table #t
[解决办法]
不知道你的有多慢,有的时候由于数据多,同时硬件和sql优化不是很好的话,是慢的.
[解决办法]
楼主是求某一天的,那把下面那句换下.
insert #t(symbol,tdate,tclose)
select a.symbol,max(tdate),tclose from a,b where a.symbol=b.symbol
group by a.symbol,tclose
换成
-------------------------------
insert #t(symbol,tdate,tclose)
select a.symbol,tdate,tclose from a,b where a.symbol=b.symbol
where a.tdate=replace( '2006-07-26 ', '- ', ' ')
[解决办法]
直接在查询分析器里“显示执行计划“,然后根据执行计划里耗时情况来创建索引,如果还不行,就用索引优化向导,这样就可以了。
[解决办法]
上边的有错误,重新贴个完整的.
--------------------------------------------
set nocount on

create table #t (
symbol varchar(10),
tdate varchar(10),
tclose numeric(8,2),
lclose numeric(8,2))

insert #t(symbol,tdate)
select a.symbol,tdate from a,b
where a.symbol=b.symbol
and a.tdate=replace( '2007-07-26 ', '- ', ' ')

create index idx_t_symbol_tdate on #t (symbol,tdate)

update #t set tclose = a.tclose from a where #t.symbol=a.symbol and #t.tdate=a.tdate

update #t set #t.lclose = c.tclose from a c
where #t.symbol=c.symbol and c.tdate < #t.tdate and not exists (select * from a where a.symbol=c.symbol and a.tdate> c.tdate
and a.tdate <> #t.tdate)

select * from #t

drop table #t
drop table a
drop table b

set nocount off
[解决办法]
笔误,习惯了.
上面的
drop table a
drop table b
是多余的.
[解决办法]
不好意思 我想问下怎么才能提问?
[解决办法]
到小类去提问.

热点排行