SQL语句加入order by 子句之后的效率问题
在数据库中有一张表mytable,数据记录7000万条,有如下两条SQL语句
1.
select top 100 * from mytable order by operateDate
2.
select * from (select top 100 * from mytable ) a order by a.operateDate
起初我使用第一条语句查询数据,并希望将得到的100条数据进行排序,结果执行了N秒结果才出现。后来我又使用了第二条语句查询数据,这次数据很快就将结果返回了。
其实仔细对比结果,我发现,第一条语句是先将数据库中所有的数据按照operateDat字段进行排序后再返回前100条数据,那么这个过程就包括:一、对7000万条数据进行排序(汗~)。二、返回前100条数据。这样执行的效率极其低下,而且结果还不一定是我想要的。
第二条语句是先查询出前100条数据,按后按照operateDat字段进行排序,这个过程包括:一、返回前100条数据。二、对返回的100条数据进行排序。笑一个,明显后者的效率要高得多。
不过我们还是不能盲目的高兴,首先,我们得清楚的知道,我们到底想从数据库取到什么结果。我在写这个SQL语句的时候是希望得到数据库中的前100条数据,得到数据后希望他们按时间顺序显示给我,很显然,不再是1和2之间执行的效率问题了,而是使用语句1返回的结果并不是我预先想要的了。
如果我的需求是想要得到数据库中按时间排序后的前100条数据,该怎么办?若是使用语句1,执行效率又非常低。这个时候我们只有借助其他方式了。比如这张表上是否有索引,索引建立的规则如何。分析过索引之后,我们看看已有的索引是否能满足当前的效率查询,如果不能满足,而且需要以第1条SQL语句取数据的次数非常频繁,那么你就该考虑是否要在operateDate建立一个索引了。
当然了不排除能够通过SQL语句来满足结果和高效的执行,但是目前为止,作者还没想到好的办法,希望有一天能想到吧,如果哪位有更好的办法,也请不要吝啬分享之。
相关文档:
问题描述:
本题用到下面三个关系表:
CARD 借书卡。 CNO 卡号,NAME 姓名,CLASS 班级
BOOKS 图书。 BNO 书号,BNAME 书名,AUTHOR 作者,PRICE 单价,QUANTITY 库存册数
BORROW 借书记录。 CNO 借书卡号,BNO 书号 ......
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.Hibernat ......
1 如何锁一个表的某一行
A 连接中执行
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
begin tran
selec ......
在做过的很多项目中,发现大家不管对什么表,逢select必定加上nolock(或者with(nolock)),好像已经是制度化的一种东西。有领导高人解释说加上nolock可以提高查询速度,不影响对数据表的其他并发操作。
但是真有必要每个查询都加nolock吗?个人认为加不加nolock还是值得我们根据实际情况斟酌一番的(至 ......