select a.* from fsprd.fs_goods_docs a
where gdd_id=(Select cnm_gdd_id from fsprd.fs_need_containers
where cnm_id=19546)
select a.* from fsprd.fs_goods_docs a, fsprd.fs_need_containers b
where a.gdd_id=b.cnm_gdd_id and
b.cnm_id=19546 请问这两个SQL语句那个的效率更高,更推荐使用?
请说明原因
where gdd_id=(Select cnm_gdd_id from fsprd.fs_need_containers
where cnm_id=19546)
select a.* from fsprd.fs_goods_docs a, fsprd.fs_need_containers b
where a.gdd_id=b.cnm_gdd_id and
b.cnm_id=19546 请问这两个SQL语句那个的效率更高,更推荐使用?
请说明原因
解决方案 »
- 如何借用Delphi的编译器来生成Exe文件?
- 闪现窗体的问题,希望大家指点...
- 对水晶报表打包有问题?
- ord 是不是pascal的一个函数名?急用,在线等待,谢谢
- Query组件的Datasource属性有何应用
- 錯誤捕捉!
- Dll高手请进!我在应用中调用一查询的DLL时老是出错 "Access Violation at adress .....in module oleaut32.dll,read adress 00142000"
- 如何改变Mainmenu字体的大小?如何做类似WIN98开始弹出来的菜单?
- 关于窗口标题栏!
- delphi6中还有BDE和ADO吗?它们被淘汰了吗?现在还有必要用它们来学数据库的开发吗?
- 天气热,加了三角叉,灌灌水,一起爽一爽!
- 如何自定义MDI主窗体默认的标题文字?
后一种要进行表连接操作(ACCESS中是迪卡尔基,效率不用我说了吧。SQLSERVER好一些进行自然连接)所以都不如子查询有效率(尤其数据量大时)。
TO ljmanage(过客):你是什么谬论?! :)
用第一种办法
select 'start'
go
select t2.* from t2 where t2.id in (select id from t1 )
go
select 'end'
go
在SQL Server Profiler中观察:中间一句花费时间10毫秒。
换用第二种方法
select 'start'
go
SELECT t1.* FROM t1,t2 where t1.id=t2.id
go
select 'end'
go
观察:中间一句花费时间20毫秒。
也就是说,前一种方法,也就是使用子查询的方法效率远高于后者
上面说了 笛卡尔乘积的问题:
如果楼主的两个表:一个有m条记录 另一个有n条记录
则用后一种方法会先生成m X n条记录 然后在根据条件去查找符合条件的记录,并输出
而用前一种方法 则先生成m,进行第一次筛选,再生成n,再筛选
所以前一种方法查询的记录树为m+n那种有效一目了然
from 订单,订单明细
where 订单.订单ID=订单明细.订单ID and 订单明细.材料='不锈钢'
时间:4秒select 订单.*
from 订单
where 订单.订单ID=(Select 订单明细.订单ID from 订单明细
where 订单明细.材料='不锈钢')
时间:7秒