日期:2014-05-17  浏览次数:20438 次

怎么高效率的读满足条件的最新数据
数据库中有几个不断刷新的表,每次读取都只希望读满足条件的记录,比如
给定 表A中,列1中某个值test,需要从表B中读列1=‘test’的记录并且是最新记录(表B中一般满足列1=‘test’条件的最后一条记录为最新记录),如何高效读取,如果使用select * from B where 列1='test' 然后MoveLast()这样查询效率好低,读取数据很慢
因为select其实是对源表中的记录都逐个判断了最后将满足条件的记录存到虚表中,如何能不用每次查询都将整个源表判断一次

------解决方案--------------------
引用:
Quote: 引用:


if OBJECT_ID('a') is not null
   drop table a
go

create table a(col1 varchar(100))

insert into a
values('test')

insert into a
values('test1')

insert into a
values('test2')


if OBJECT_ID('b') is not null
   drop table b
go

create table b(col1 varchar(100),dates datetime)

insert into b
values('test',GETDATE())

waitfor delay '00:00:01'  --延时1秒

insert into b
values('test',GETDATE())

waitfor delay '00:00:01'

insert into b
values('test',GETDATE())

waitfor delay '00:00:01'

insert into b
values('test2',GETDATE())

select *
from b

select b.col1  --时间最大的那一行数据
from
(
select b.*,
       ROW_NUMBER() over(partition by b.col1 order by b.col1) rownum,  --第几行
       
       COUNT(b.col1) over(PARTITION by b.col1) as rc                   --一共有几行
from b
inner join a
        on a.col1 = b.col1
) r
where r.rownum = r.rc  --把最后一行数据选出来
如果有几百万甚至上千万的数据你这个效率可取吗


如果数据量太大,达到了上千万的,估计上面的写法,肯定是有问题的,性能会比较差。

你要想提高速度,首先需要有一个字段,根据这个字段的值来判断,是最新的值,
比如:新增一个datetime类型的字段the_date,然后可以通过类似下面语句实现:



if OBJECT_ID('a') is not null