Office中国论坛/Access中国论坛

标题: 呜呜,求救30万条数据怎么办????? [打印本页]

作者: cnqdcc    时间: 2003-11-13 05:36
标题: 呜呜,求救30万条数据怎么办?????
我们单位员工的投保记录有30万条左右吧,投保所属日期都是连续的,怎样把漏报的挑出来呀,我编的程序没法用,机器一运行就好像死机[attach]2440[/attach][em03][em03]
作者: 没牙兔兔    时间: 2003-11-13 17:06
对于大容量数据的操作 关注ing....

不过你的范例下载啦,不明白 要干啥??怎么才算是漏报的哦??
作者: cnqdcc    时间: 2003-11-13 17:12
宏达表中有一所属日期字段,字段中的数据应该是连续的,如果不连续说明漏报
作者: 没牙兔兔    时间: 2003-11-13 17:42
呵呵,我试一下
好像速度也很慢
数据量太大

先去上课啦,回来再写
作者: cnqdcc    时间: 2003-11-13 18:56
谢谢兔子兄先
作者: wewyhy    时间: 2003-11-13 21:37
我就查出了你的库中1700人里只有881人没错
作者: 没牙兔兔    时间: 2003-11-13 22:34
标题: 好难,头都想破啦
中午仔细做了一下
数据多就是麻烦啊
建议一:
优化数据库结构,你的 [宏达]表设计不太好,严重冗余
应该改成 两个表
养老编号  姓名  单位编号 日期
养老编号 所属日期
另外在养老编号 和所属日期上建立索引
建议二:
在汇总的时候,不要一次全部汇总
可以采取 按年度 分别汇总,这样筛选判别的数据量成倍减少,可以减少用户等待的不耐烦程度

解决方法一:
采用交叉表 把所有不符合要求的年度都显示出来
察看比较直观

代码:
TRANSFORM IIf(IIf(IsNull([宏达].[所属日期]),0,[宏达].[所属日期])>Min([宏达_1].[所属日期]),0,1) AS 值
SELECT 宏达.姓名
FROM 宏达 LEFT JOIN 宏达 AS 宏达_1 ON 宏达.姓名 = 宏达_1.姓名
WHERE (((宏达.所属日期) Like "2003*"))
GROUP BY 宏达.姓名, 宏达_1.姓名
PIVOT 宏达.所属日期;

如图
[attach]2452[/attach]

解决方法二:
按照你的数据库设计要求,把相关记录查找出,填写入表中
嘻嘻,兔兔再想想,我这儿也是好慢好慢

作者: 没牙兔兔    时间: 2003-11-13 23:26
写了一下
按照你的这个表结构,如果该同志从来都不交,肯定是漏网之鱼的
以下速度还是慢
建议按照年度 或者部门进行分别汇总
Rs.Open "select * from 宏达  where 所属日期 like "2003%" order by 养老编号,所属日期 ", Conn, adOpenDynamic, adLockOptimistic
速度好狠多

代码:
Dim Conn As ADODB.Connection
Dim Rs As ADODB.Recordset
Dim RsErr As ADODB.Recordset
'存储变量
Dim SDATE As String, SNO As String


Set Conn = CurrentProject.Connection
Set Rs = New ADODB.Recordset
Set RsErr = New ADODB.Recordset

Rs.Open "select * from 宏达   order by 养老编号,所属日期 ", Conn, adOpenDynamic, adLockOptimistic

RsErr.Open "select * from 出错", Conn, adOpenDynamic, adLockOptimistic

If Not Rs.EOF Then
    While Not Rs.EOF
        If SNO = "" Then
            SNO = Rs!养老编号
            SDATE = Rs!所属日期
        Else
            If Rs!养老编号 = SNO Then
                If Rs!所属日期 = SDATE + 1 Then
                    SDATE = Rs!所属日期
                Else
                    RsErr.AddNew
                    RsErr!养老编号 = SNO
                    RsErr!所属日期1 = SDATE
                    RsErr!所属日期2 = Rs!所属日期
                    '这儿如果定义为前一月,则rserr!所属日期2=rs!所属日期-1'
                    '但需要判断是不是1号,否则会出错这儿加1好像有日期函数,兔兔忘了
                    RsErr.Update
                    
                End If
            Else
                '换人啦
                '判断前面的是否全交到现在的月份
                If SDATE = Year(Date) & Month(Date) Then
                    '这位老大全交啦,放人,放人
                Else
                    '不要逃
                    RsErr.AddNew
                    RsErr!养老编号 = SNO
                    RsErr!所属日期1 = SDATE
                    '同样这儿也需要如果要多加一个月
                    'RsErr!所属日期1 = SDATE+1,判断是不是月底哦,这儿加1好像有日期函数,兔兔忘了
                    RsErr!所属日期2 = Year(Date) & Month(Date)
                    RsErr.Update
                End If
                '好了,开始下一位
                SNO = Rs!养老编号
                SDATE = Rs!所属日期
            End If
        
        End If
        Rs.MoveNext
        '最后一名也不能放过
         '判断前面的是否全交到现在的月份
        If Rs.EOF Then
            If SDATE = Year(Date) & Month(Date) Then
                '这位老大全交啦,放人,放人
            Else
                '不要逃
                RsErr.AddNew
                RsErr!养老编号 = SNO
                RsErr!所属日期1 = SDATE
                RsErr!所属日期2 = Year(Date) & Month(Date)
                RsErr.Update
            End If
        End If
    Wend
End If
MsgBox "累死俺啦,终于自动汇总完啦~!!"


Rs.Close
RsErr.Close

Set Rs = Nothing
Set RsErr = Nothing

Set Conn = Nothing
作者: cnqdcc    时间: 2003-11-14 16:37
兔子兄,这些数据是丛青岛市负责养老帐号的部门考来得,原来是vf只有这么一个表,现在的数据量成了45万左右把,我得解决办法是运行查找后就和朋友出去涮火锅,回来后正好运行完毕,另外我查找出的不符合的有900多条
作者: 没牙兔兔    时间: 2003-11-14 17:22
我晕

如果只是一次执行的话,慢就慢呗
只要结果实现啦就可以啦

呵呵
作者: wewyhy    时间: 2003-11-14 17:33
标题: 高手不要笑我
我的查法:
1.   我删除了你的库中除“宏达”表之外的东西
2.   “查询1”用来生成每个人第一次“所属日期”和最后一次“所属日期”,以及他的记录数
3.   “查询2”用来计算每个人应该交几次
4.    “查询3”用来比较记录数和次数,如果一样,就没出错,结果是881

[attach]2457[/attach]



[此贴子已经被作者于2003-11-18 7:13:24编辑过]


作者: 没牙兔兔    时间: 2003-11-14 18:15
思路不错哦,把不符合要求的人先揪出来,然后在筛选的基础上进行操作
这样可以大量减少 查询数据库的次数
又多学了一招

需求有点不明,其中的用户有没有辞退的,否则
max所属日期应该以当前日期或者数据表中最大的日期为准,要不后来不交的就省略掉啦


作者: cnqdcc    时间: 2003-11-14 23:58
我回去研究研究大家的思路,改天在发一下,有几个问题变了,首先数据接近50万,另外还有很多其他要求,领导还没和我说清楚
作者: 没牙兔兔    时间: 2003-11-15 00:17
基于数据量太大的编写工作就要特别考虑时间效率啦
工作难度增加,技巧性提高

曾经编写的时候,自己测试很正常,添加,查询几条数据都挺好
就拿去交差,后来别人一导入就整了20万的数据
完蛋哦,速度狂慢
只能重新对数据库设计优化~!

典型的软件开发失败的教训之一




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3