delphi ado access
我有一条很费时的SQL要循环查询,用的是ACCESS数据库。
情况1:我试了用1-20个线程分别创建一个CONNECTION会话去查询同一个ACCESS,发现效率和不使用线程所花费的时间差不多。
网上查了下资料,有人说:
-----------------------------------------------------------------------------------------------
你当然可以设计多个线程,但是记住不是你的线程在替代Access引擎工作,所以是不是多线程完全看Access引擎。但是,Access引擎确实不是多现成的,因此虽然你有多个线程提出访问,但是Access是排队一个一个执行的。
-----------------------------------------------------------------------------------------------
情况2:我复制了20个这样的ACCESS数据库,用1-20个线程去连接这20个不同的数据库,并查询,然后发现查询出来的总时间和不用线程的查询还是差不多。
不知道这是啥情况呀?麻烦帮分析分析。
我有一条很费时的SQL要循环查询,用的是ACCESS数据库。
情况1:我试了用1-20个线程分别创建一个CONNECTION会话去查询同一个ACCESS,发现效率和不使用线程所花费的时间差不多。
网上查了下资料,有人说:
-----------------------------------------------------------------------------------------------
你当然可以设计多个线程,但是记住不是你的线程在替代Access引擎工作,所以是不是多线程完全看Access引擎。但是,Access引擎确实不是多现成的,因此虽然你有多个线程提出访问,但是Access是排队一个一个执行的。
-----------------------------------------------------------------------------------------------
情况2:我复制了20个这样的ACCESS数据库,用1-20个线程去连接这20个不同的数据库,并查询,然后发现查询出来的总时间和不用线程的查询还是差不多。
不知道这是啥情况呀?麻烦帮分析分析。
解决方案 »
- 为什么会出现“Stack overflow”的错误提示?
- 给大家秀秀俺公司高层行政会议内容,那个乐呀!
- TreeView中..已知一个结点名,如保查找这个结点,。。。。
- 请教各位老师一个线程问题:Synchronize(Method:TThreadMethod)中的Method不能带参数吗?
- 一個用printers畫布打印問題?
- 如何往Excel的Cell里面写数据?附调试代码~
- 在delphi里怎么调用modem的AT指令?给出点适用代码的高手,重分酬谢。先给50分,不够再加!
- 关于delphi5.0的ADO补丁问题(在线等待)
- 请问我要达到什么样的程度才能多增加一个绿三角形呀?
- DBLookupCombox的问题?
- sting类型转换为 TClass; TForm,大牛们来大把手吧!
- DELPHI7不支持FOR IN DO 有一个集合函数转换成D7能用的谢谢
请在SQL语句及数据索引上多做文章,不要什么都钻到多线程中去。
' SELECT TOP 1 areaID, siteID,AreaName '
+ ' FROM (SELECT down_AREAINFO.Numid as areaID, down_SiteInfo.numid as siteID,down_AREAINFO.names as AreaName, '
+ ' IIF(INSTR(1,V_Addr,down_SiteInfo.names ) > 0,4,0) + iif(INSTR(1,V_Addr,down_SiteInfo.names ) > 0,4,0) + '
+ ' IIF(INSTR(1,V_Addr,down_EMPOLYAREA.AREANAME) > 0,2,0)+IIF(INSTR(1,V_Addr,down_SiteInfo.Names) > 0,3,0) as totalCount '
+ ' FROM (down_SiteInfo '
+ ' LEFT JOIN down_AREAINFO ON down_SiteInfo.NUMID = down_AREAINFO.OFSITE) '
+ ' LEFT JOIN down_EMPOLYAREA ON down_AREAINFO.NUMID = down_EMPOLYAREA.RECEAREA '
+ ' WHERE InStr(1,V_Prov,[down_SiteInfo].[ofregion])>0 '
+ ' and (INSTR(1,V_City,IIf(isnull(down_SiteInfo.ofcity),down_SiteInfo.ofregion,down_SiteInfo.ofcity)) > 0 '
+ ' or INSTR(1,V_City,[down_AREAINFO].names) > 0) '
+ ' and iif(isnull(down_SiteInfo.ofcity),''NUL'',down_EMPOLYAREA.AREANAME)<>''NUL'' '
+ ' and len( down_EMPOLYAREA.AREANAME)>=3 '
+ ' order by IIF(INSTR(1,V_Addr,down_SiteInfo.names ) > 0,4,0) + iif(INSTR(1,V_Addr,down_SiteInfo.names ) > 0,4,0) + '
+ ' IIF(INSTR(1,V_Addr,down_EMPOLYAREA.AREANAME) > 0,2,0)+IIF(INSTR(1,V_Addr,down_SiteInfo.Names) > 0,3,0) desc,len(down_EMPOLYAREA.AREANAME) desc '
+ ' ) AS A where totalCount >= 2';
---------------------------------------------------------------------------------
Access好像并不支持函数索引。所以没想到好方法。
这个 SQL 看着头晕,IIF 函数有几处是一样的写重复了。
情况1说明Access的引擎确实不支持多线程,并且于数据库文件无关,引擎只能同时接受一个Connect
类似于输入省,市,区,地址后,自动匹配到数据库中的目的地、
------------------------------------------------------
也知道这个查询效率低。记得ORACLE里有个函数索引,但ACCESS好像没有。
没有找到比较好的方案,所以只能这样了哎。各位有啥好建议?
2.如果拆成多条SQL多次查询:因为是需要三个表的最终关联的结果,感觉也不太好。
SELECT TOP 1 areaID, siteID,AreaName FROM (SELECT down_AREAINFO.Numid as areaID,down_EMPOLYAREA.AREANAME as EmpAreaName, down_SiteInfo.numid as siteID,down_AREAINFO.names as AreaName, max(IIF(INSTR(1,'车陂路大岗工业区',down_EMPOLYAREA.AREANAME) > 0,2,0)+IIF(INSTR(1,'车陂路大岗工业区',down_AREAINFO.names) > 0,3,0)) as totalCount FROM (down_SiteInfo LEFT JOIN down_AREAINFO ON down_SiteInfo.NUMID = down_AREAINFO.OFSITE) LEFT JOIN down_EMPOLYAREA ON down_AREAINFO.NUMID = down_EMPOLYAREA.RECEAREA WHERE InStr(1,'广东',[down_SiteInfo].[ofregion])>0 and ( INSTR(1,'广州天河',[down_AREAINFO].names) > 0 or INSTR(1,'广州天河',IIf(isnull(down_SiteInfo.ofcity),down_SiteInfo.ofregion,down_SiteInfo.ofcity)) > 0 ) and len( down_EMPOLYAREA.AREANAME)>=3 group by down_AREAINFO.Numid,down_EMPOLYAREA.AREANAME,down_SiteInfo.numid,down_AREAINFO.names ) AS A where totalCount >= 2 order by totalCount desc,len(EmpAreaName) desc
这个是当前的SQL
文件型桌面数据库,也就那样了