一级棒(Eachfun)
一级棒 - 生活感悟 - 偶有所得 - 速度,要命的速度
RSS订阅
速度,要命的速度
发表时间:2006-11-26 01:27:51 关键词:程序,算法,数据库,SQLSERVER,速度

这两天试着把一个论坛的数据导入到我自己做的论坛,
两个论坛架构完全不一样,导也不是好导的,
其中最大的区别是两点:

一、我没有ntext类型的数据,
帖子内容不存在数据库里,而存在文件文件中,
数据库里只存一个类似于“2006/11/26/12345678”的文本,
要生成htm文件的时候,
在这个文件前面加上一个特定的文件夹,后面加上“.txt”即可读取所有内容。

二、我用真正的datetime类型存放时间,
不像那个论坛,居然用一个十四位的整数来存放时间,


于是,导数据就包含了这样两个步骤:
一、根据他原来的十四位整数产生我的时间,
二、将ntext内容存入文件文件,另外将文件名存入数据库,删除ntext列。

第一个步骤是这样的:
While Not c.Eof'注:c是一个数据库对像
nTime = c.Fields("nTime")'读出他的十四位整数
sTime = CStr(nTime)'转为字符串
'变成yyyy-mm-dd hh:mm:ss格式
sTime1 = Left(sTime, 4) & "-" & Mid(sTime, 5, 2) & .....
c.Fields("doctime") = sTime1'写入
Wend


第二个步步骤是这样的:
早在第一步骤时,就先用我自己的函数将时间转成“yyyy/mm/dd/hhmmssuuuu”字符串
并且已经存入表中,
现在剩下的就是写文件了,
这也有我自己的函数:
b.SaveStringToFile(sContent, sFileName)
同样也要放在While...Wend循环中循环几十万次。

面对着几十万条记录,
我原以为这两个步骤一定是个漫长漫长的过程,
谁知道也挺快,几个小时就OK了。

今天,面对一个比这些都简单的工作,却发现耗时间比这还长,
起因是我误删了一个数据列,今天要把它恢复过来,
从某处恢复了一个表来,然后两个表之间同步一个列的数据:

虽然不要写文本文件,也不要进行数值到字符串再到时间的转换,
只是从int到int的复制,但是耗的时间不比昨天少,
想来想去终于明白了:
昨天的工作虽然在几十万条数据之间循环,必竞循环就只有循环,
循环里面对数据库的操作不多,
而这次循环里面还要UPDATE,而这个UPDATE又包含了SELECT,
是这样的:
UPDATE bbsdoc SET rootid =
(SELECT rootid FROM nn WHERE id=值)
WHERE id = 值

把这样一个带SELECT的UPDATE运行几十万次,
比把几十万个十四位整数转为字符串再转为时间要慢,
比把几十万个ntext存到文本文件中要慢。
我靠。

本站特约顾问律师常州东晟律师事务所朱立律师(电话13915029670,QQ646146109)提醒您:
本站文章皆为作者原创,其它媒体(包括但不限于报刊、杂志、网站、电视、电台)未经作者书面许可严禁转载(或部分摘录)!
相关评论
  • 别怪我,要怪就怪SQL SERVER不支持UPDATE语句中加入INNER JOIN,人家ACCESS都支持的,同样的操作,ACCESS只要一个命令就行了,SQL SERVER要几十万条语句。
    作者:偷猫linkhttp://www.eachfun.comQQ33751, 时间:2006-11-27 23:07:16
  • 我早就发现你这只猫过于死板了.
    对数据库的操作,总没有对文本文件操作快吧?
    你应该把原先的数据库导出成文本,然后对文本进行读/更新/写到新文本操作,再把新文本导入到新数据库.
    象你这样喜欢用一句又有update又有select的SQL语句虐待自己和数据库,真是世所少见.
    作者:狗屎 时间:2006-11-27 09:07:18
1
发表评论
称呼:
QQ:
邮箱:
链接:
内容:
搜索: 百度搜索 Google搜索
Copyright©2000 - 2008 Eachfun.Com, All Rights Reserved 一级棒网络
苏ICP备05080156号
一级棒建站系统 http://www.eachfun.com 一级棒版权所有,未经许可不得商用!