以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [讨论]这段sql查询特慢呢?  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=42286)

--  作者:e-png
--  发布时间:2013/11/7 16:30:00
--  [讨论]这段sql查询特慢呢?

执行后好几分钟才得出结果,数据源是Access2003:

SELECT count(*) FROM {B} WHERE [ID] In (Select [ID] FROM {A} where ([year] = 2013 and [period] <= 9 ))         

 

但在SQL数据源查询时,瞬间完成。   不知道是什么问题。

 

我是在foxtable的SQL执行窗口中测试的。。。

[此贴子已经被作者于2013-11-7 16:36:01编辑过]

--  作者:Bin
--  发布时间:2013/11/7 16:34:00
--  
你的数据量有多少呢?
--  作者:e-png
--  发布时间:2013/11/7 16:38:00
--  
总数大约4万多条记录
--  作者:jspta
--  发布时间:2013/11/7 16:39:00
--  

可能数据太大了,in语句在执行效率会降低很多。

无论从安全性还是效率上,Access 都是不行的


--  作者:e-png
--  发布时间:2013/11/7 16:40:00
--  

只是在access做数据源时查询特慢,10几分钟啊。。。   在sql数据源中查询同样的两表,瞬间完成了。。。

 


--  作者:Bin
--  发布时间:2013/11/7 16:47:00
--  
4楼已经给出问题的答案了,你做一下索引吧,时间可以减低10倍左右,不过依然是慢,要1分钟.
--  作者:jspta
--  发布时间:2013/11/7 16:48:00
--  

count(*) 这个改成 count([_Identify])试试,应该不会这么慢的

 

使用

ExecuteScalar

 

你把返回的代码贴出来看看


--  作者:longtechwj
--  发布时间:2013/11/7 16:49:00
--  
SELECT COUNT(*) FROM B A INNER JOIN A B ON A.ID=B.ID
--  作者:jspta
--  发布时间:2013/11/7 16:58:00
--  

SELECT count(*) FROM {B} WHERE [ID] In (Select [ID] FROM {A} where ([year] = 2013 and [period] <= 9 )) 

 

改成

 

select count(*) from b inner join a on b.id = a.id where a.year = 2013 and a.period <= 9

或者

 

select count(*) from b inner join (Select [ID] FROM {A} where ([year] = 2013 and [period] <= 9 )) C  on b.id = c.id 

 

可以试试这两个语句

 


--  作者:e-png
--  发布时间:2013/11/7 17:43:00
--  
9楼的有效 ,谢谢jspta
[此贴子已经被作者于2013-11-8 17:22:47编辑过]