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语句来满足结果和高效的执行,但是目前为止,作者还没想到好的办法,希望有一天能想到吧,如果哪位有更好的办法,也请不要吝啬分享之。
相关文档:
Student(S#,Sname,Sage,Ssex) 学生表
Course(C#,Cname,T#) 课程表
SC(S#,C#,score) 成绩表
Teacher(T#,Tname) 教师表
问题:
1、查询“001”课程比“002”课程成绩高的所有学生的学号;
select a.S# from (select s#,score from SC where C#='001') a,(select s#,score
fr ......
Student(S#,Sname,Sage,Ssex) 学生表
Course(C#,Cname,T#) 课程表
SC(S#,C#,score) 成绩表
Teacher(T#,Tname) 教师表
问题:
1、查询“001”课程比“002”课程成绩高的所有学生的学号;
select a.S# from (select s#,score from SC where C#='001') a,(select s#,score
fr ......
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="Default" value="Default" />
</appSettings>
<connectionStrings>
<add name="Default" connectionString="Data Source=192.168.1.197;User ID ......
我们在数据库中使用表的时候,经常会遇到两种使用表的方法,分别就是使用临时表及表变量。在实际使用的时候,我们如何灵活的在存储过程中运用它们,虽然它们实现的功能基本上是一样的,可如何在一个存储过程中有时候去使用临时表而不使用表变量,有时候去使用表变量而不使用临时表呢?
临时表
临时表与永久表相似, ......
我们在开发过程中,经常遇到这样问题,就是要求定期进行数据库的检查,如果发现特定数据,那么就要进行某项操作,这个需求呢,可以利用Windows的计划任务,定期执行某一个应用程序,去检索数据;也可以让程序自己控制。其实SQL Server自己也可以创建计划任务,定期进行执行。如果数据库服务器允许,可以考虑采用这种方式。
......