请高手分析一下下面的两段代码的效率,并详细解说一下,谢谢!
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.站序
)
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 分钟的时间。
把执行计划打开,可以看到 各个语句执行的详细信息
1.把计划打开看看执行效率。
2.建议查询一下子查询,看一下比较in ,inner join 的相关文章。
3.使用exist.