delphi ado access
我有一条很费时的SQL要循环查询,用的是ACCESS数据库。
情况1:我试了用1-20个线程分别创建一个CONNECTION会话去查询同一个ACCESS,发现效率和不使用线程所花费的时间差不多。
网上查了下资料,有人说:
-----------------------------------------------------------------------------------------------
你当然可以设计多个线程,但是记住不是你的线程在替代Access引擎工作,所以是不是多线程完全看Access引擎。但是,Access引擎确实不是多现成的,因此虽然你有多个线程提出访问,但是Access是排队一个一个执行的。
-----------------------------------------------------------------------------------------------
情况2:我复制了20个这样的ACCESS数据库,用1-20个线程去连接这20个不同的数据库,并查询,然后发现查询出来的总时间和不用线程的查询还是差不多。
不知道这是啥情况呀?麻烦帮分析分析。

解决方案 »

  1.   

    你这样多线程根本不能提高效率,除非你的cpu足够多,如果你要读取所有数据,可以考虑分页技术,每次读取一部分,另外ado也支持异步查询,不会卡死在那
      

  2.   

    我有一条很费时的SQL要循环查询,用的是ACCESS数据库。耗时应该在[多次循环]查询上, 在这里做文章吧
      

  3.   

    “SQL要循环查询,用的是ACCESS数据库。”
    请在SQL语句及数据索引上多做文章,不要什么都钻到多线程中去。
      

  4.   

    我要返回的是是一行记录。大致的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好像并不支持函数索引。所以没想到好方法。
      

  5.   

    楼主的实验结果表明access不支持多线程,再多线程最后也是轮流执行的。
    这个 SQL 看着头晕,IIF 函数有几处是一样的写重复了。
      

  6.   

    情况1说明Access的引擎确实不支持多线程
    情况1说明Access的引擎确实不支持多线程,并且于数据库文件无关,引擎只能同时接受一个Connect
      

  7.   

    V_Addr,V_City,V_Prov这三个参数是变化的。
    类似于输入省,市,区,地址后,自动匹配到数据库中的目的地、
    ------------------------------------------------------
    也知道这个查询效率低。记得ORACLE里有个函数索引,但ACCESS好像没有。
    没有找到比较好的方案,所以只能这样了哎。各位有啥好建议?
      

  8.   

    楼主完全没有必要搞这么一个大查询语句,Access照样可以拆分,你可以把一些局部数据写成查询,就像视图和临时表一样使用,肯定有优化的空间
      

  9.   

    1.如果把当前查询条件存成一个表:这个我还没想到如果关联起来才能取到结果。
    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
      

  10.   

    Access本来就是针对小数据量的,所以没有一系列针对大数据量查询提供优化支持,数据量大了换更适合的数据库。这个语句本身似乎没有优化空间了。
      

  11.   

    mssql也不支持函数索引吧。
    文件型桌面数据库,也就那样了