首页 新闻 会员 周边 捐助

sql语句执行效率的问题

0
悬赏园豆:60 [已解决问题] 解决于 2009-03-30 02:20

请高手分析一下下面的两段代码的效率,并详细解说一下,谢谢!

select a.车次
 from trainplan as a inner join trainplan as b on a.车次=b.车次
 where a.站点=@StartStation and
   b.站点=@StopStation and
   a.站序<b.站序

===============================================

 select a.车次
 from trainplan as a
 where a.站点=@StartStation and a.车次 in
 (
   select b.车次
   from trainplan as b
   where b.站点=@StopStation and
   a.站序<b.站序
 )

Lucien.Bao的主页 Lucien.Bao | 菜鸟二级 | 园豆:207
提问于:2009-03-22 05:25
< >
分享
最佳答案
0

http://www.cnblogs.com/WizardWu/archive/2008/10/27/1320055.html

------------------------------

6、适当地使用子查询

相较于「子查询 (Subquery)」,若能用 JOIN 完成的查询,一般会比较建议使用后者。原因除了 JOIN 的语法较容易理解外,在多数的情况下,JOIN 的能也会比子查询较佳;但这并非绝对,也有的情况可能刚好相反。

我们知道子查询可分为「独立子查询」和「关联子查询」两种,前者指子查询的内容可单独执行,后者则无法单独执行,亦即外层查询的「每一次」查询动作都需要引用内层查询的数据,或内层查询的「每一次」查询动作都需要参考外层查询的数据。

现在我们要如上图 4 般,将 Northwind 数据库 Orders 数据表的 830 笔数据都捞出来,并自动给一组编号,若用 ROW_NUMBER 函数的写法如下所示,而且能极佳,只要 2 ms (毫秒),亦即千分之二秒。

SET STATISTICS TIME ON

SELECT OrderID, ROW_NUMBER() OVER(ORDER BY OrderID) AS 编号
FROM dbo.Orders

但如果是传统的「子查询」写法,或 辅以 AS 关键词的「衍生数据表」的语法,写法必须如下 (拷贝后在 SQL Server 中实际可执行)

SET STATISTICS TIME ON

SELECT OrderID,
  (SELECT COUNT(*) FROM dbo.Orders AS 内圈
   WHERE 内圈.OrderID <= 外圈.OrderID) AS 编号   
FROM dbo.Orders AS 外圈
ORDER BY 编号

但这种旧写法,会像先前所提到的,外层 (外圈) 查询的「每一次」查询动作都需要引用内层 (内圈) 查询的数据。以上方示例而言,外层查询的每一笔数据,都要等内层查询「扫描整个数据表」并作比对和计数,因此 830 笔数据每一笔都要重复扫描整个数据表 830 次,所耗用的时间也因此爆增至 170 ms。

若您用相同的写法,去查询 AdventureWorks 数据库中,有 31,465 笔数据的 Sales.SalesOrderHeader 数据表,用 ROW_NUMBER 函数要 677 ms,还不到 1 秒钟;但用子查询的话,居然要高达 233,835 ms,将近快 4 分钟的时间。

  

WizardWu | 小虾三级 |园豆:1402 | 2009-03-22 12:46
其他回答(2)
0

把执行计划打开,可以看到 各个语句执行的详细信息

jowo | 园豆:2834 (老鸟四级) | 2009-03-22 12:34
0

1.把计划打开看看执行效率。

2.建议查询一下子查询,看一下比较in ,inner join 的相关文章。

3.使用exist.

有所为,有所不为 | 园豆:1200 (小虾三级) | 2009-03-23 11:04
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册