有一个web日志库,用query1取其中一段时间的IP数据(约150万行),然后遍历query1,执行目标查询query2(目标IP库就2000多行),查到recordcound>0即插入临时表,结果也就查到100多条。执行前10万行查询也就花了10分钟左右,但后来越来越慢,全部执行完居然花了14小时多!
请问怎样可以提高这一系列操作的执行效率?

解决方案 »

  1.   

    web日志是即时生成的,就想知道特定时间段内某些IP段的访问记录,除了遍历查找还有什么好办法?
    按照10分钟执行10w次查询来算,150w也就2小时半够了,缘何最终花了14小时?!
      

  2.   

    不是这样算时间的哦SQL 查询语句要是出现全表扫描对于历史表归档表是相当可怕的哦
    一般来说是从减少全表扫描(就是建索引)和减少记录(就是优化SQL语句)来解决的
      

  3.   

    如果是ADO把CacheSize设大一些遍历会快点
      

  4.   

    用ADO原生对象_RecordSet也会提高遍历速度
      

  5.   

    到底是表遍历变慢还是执行大量查询后的资源耗尽而变慢?to nb95463034 :web日志表的IP是字符串,目标IP表的IP是256进制的数值,所以每次查询要经过换算,无可避免全表扫描啊
      

  6.   


    你是想要迁就谁呢?谁代价高就听谁的你为什么要转换数据库字段的值而不去转换目标IP表的IP为字符串呢逆向啊
      

  7.   

    目标IP表是IP段:IP1-IP2 (IP1,ip2建索引),所以转成字符串没法比对。考虑将WEB日志表的IP转成数值并建立索引,但有下列问题:
    1、web表十分巨大,会否对插入造成影响
    2、用以下sql获取date1-date2之间的在目标IP范围内的记录,能否有效用到索引
    select a.ip,b.country from web日志 as a,目标IP as b where a.date>=date1 and a.date<=date2 and a.ip>=b.ip1 and a.ip<=b.ip2
      

  8.   

    select a.ip,b.country from web日志 as a,目标IP as b where a.date>=date1 and a.date <=date2 and a.ip>=b.ip1 and a.ip <=b.ip2偶看见过关系有这样写的"a.ip>=b.ip1 and a.ip <=b.ip2"
      

  9.   

    偶没看见过关系有这样写的"a.ip>=b.ip1 and a.ip <=b.ip2"
      

  10.   

    select a.ip 
    from web日志 as a
    where a.date>=date1 and a.date <=date2  and a.IP in --按字符串,有用索引
      (
    select 转成字符串(b.IP)  --因为偶不知道你用的是什么DB,就这样写
    from  目标IP as b
    where b.ip>ip1 and b.ip<ip2  --按数字,有用索引
    )
      

  11.   


    b表的结构是这样地:
    IP1:起始IP 
    IP2:结束IP
    country:地区