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语句来满足结果和高效的执行,但是目前为止,作者还没想到好的办法,希望有一天能想到吧,如果哪位有更好的办法,也请不要吝啬分享之。
相关文档:
T-SQL Script
Output format
SELECT CONVERT(VARCHAR(100), GETDATE(), 0)
03 6 2010 4:19PM
SELECT CONVERT(VARCHAR(100), GETDATE(), 1)
03/06/10
SELECT CONVERT(VARCHAR(100), GETDATE(), 2)
10.03.06
SELECT CONVERT(VARCHAR(100), GETDATE(), 3)
06/03/10
SELECT CONVERT(VA ......
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 ......
遇到MS SQL Server 2005 无法删除数据库作业。
首先,以sa账户登录,查看以下2个表的数据,如果不为空就有问题。
Sql代码
select * from msdb.dbo.sysmaintplan_subplans
select * from msdb.dbo.sysmaintplan_log
如果不为空,执行以下操作,基本上不用考虑删除哪一条记录,有问题的作业就 ......
--ksh下的一个WHILE 循环的例子
integer i=1
while ((i<67))
do
pirnt $i
i=i+1
done
--ksh 下一个FOR循环的例子
for i in `cat listdate.txt`
do
echo "执行 $i "
done
--- date.pl 用于生成一个时间段文件
#!/usr/local/bin/perl
use DBI;
if($#ARGV<1)
{
&nbs ......