新足迹

 找回密码
 注册

精华好帖回顾

· 手工钱包第二弹,技术全方位提高 (2013-12-16) 施务昂 · TO 新足迹-- 那朵花儿 (2008-10-22) 手指尖
· 理赔再更新11月18日, 电视和家庭影院:亲爱的JMXD,我家又被盗了 (2008-10-13) 518may · 参加活动 - 最想念的年货 - 福州鱼丸 (2015-2-9) daniello
Advertisement
Advertisement
查看: 1951|回复: 18

再请教,如何找到大表里missing 的 key values [复制链接]

发表于 2012-6-27 23:07 |显示全部楼层
此文章由 Dan.and.Andy 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 Dan.and.Andy 所有!转贴必须注明作者、出处和本声明,并保持内容完整
还是那个 8 million 的表,因为以前的 transaction fail了,连续的自动增长的 key 短短续续的,比如说应该是 1,2,3,4,5,6,7,8,9 现在是 1,2,5,6,8,9。

如何把 missing 的这些值都找出来?(3,4,7)
Advertisement
Advertisement

发表于 2012-6-27 23:20 |显示全部楼层
此文章由 wil 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 wil 所有!转贴必须注明作者、出处和本声明,并保持内容完整
相关问题不能放一个帖子里么。。。。没懂这题啥意思。。

发表于 2012-6-27 23:26 |显示全部楼层
此文章由 Dan.and.Andy 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 Dan.and.Andy 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 wil 于 2012-6-27 22:20 发表
相关问题不能放一个帖子里么。。。。没懂这题啥意思。。


primary key 不是连续的,auto increment 应该是连续的,每次加一,现在想写个query或者其他技术手段把missing的都找出来。

发表于 2012-6-27 23:31 |显示全部楼层
此文章由 wil 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 wil 所有!转贴必须注明作者、出处和本声明,并保持内容完整
我知道,但自然key是无意义的,找missing的有何用呢

发表于 2012-6-27 23:32 |显示全部楼层
此文章由 Dan.and.Andy 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 Dan.and.Andy 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 wil 于 2012-6-27 22:31 发表
我知道,但自然key是无意义的,找missing的有何用呢


搽P的活,不探讨有无意义了,不干没饭吃。

发表于 2012-6-27 23:45 |显示全部楼层
此文章由 wil 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 wil 所有!转贴必须注明作者、出处和本声明,并保持内容完整
你是不是不想一次性把所有id都读出来在内存里找?8m我觉得还可以吧,要不了太多内存,如果不想的话就只能分页读并处理了,不管全部还是分页,最终都是一个原始id list到内存里,然后就一个循环并维护一个missing id list就可以了吧
回忆是红色的天空
Advertisement
Advertisement

发表于 2012-6-27 23:46 |显示全部楼层
此文章由 wil 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 wil 所有!转贴必须注明作者、出处和本声明,并保持内容完整
也许你可以在数据库那边写个存储过程来做,我的话会选择应用来做

发表于 2012-6-27 23:51 |显示全部楼层
此文章由 hornsay 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 hornsay 所有!转贴必须注明作者、出处和本声明,并保持内容完整
做个stored procedure, 然后按wil的方法把primary key load进来,一个column的数据不会占很多资源, 然后loop把missing 的key放到另一个list(table)里。

不知道有没有更好的方法?
持不同股见者...

发表于 2012-6-27 23:52 |显示全部楼层
此文章由 Dan.and.Andy 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 Dan.and.Andy 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 wil 于 2012-6-27 22:46 发表
也许你可以在数据库那边写个存储过程来做,我的话会选择应用来做


有什么sql server 的stored procedure 做这个吗?还是要我手工的循环所有的行,一个一个的找?

发表于 2012-6-27 23:55 |显示全部楼层
此文章由 K.U.Double-D 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 K.U.Double-D 所有!转贴必须注明作者、出处和本声明,并保持内容完整
遍历呗,跑一个晚上绝对完事了

发表于 2012-6-28 00:14 |显示全部楼层
此文章由 wil 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 wil 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 Dan.and.Andy 于 2012-6-27 22:52 发表


有什么sql server 的stored procedure 做这个吗?还是要我手工的循环所有的行,一个一个的找?

sql server我不熟,而且我倾向在应用里做,不过多依赖数据库
回忆是红色的天空
Advertisement
Advertisement

发表于 2012-6-28 00:53 |显示全部楼层
此文章由 jerryclark 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 jerryclark 所有!转贴必须注明作者、出处和本声明,并保持内容完整
CREATE TABLE #TempIDTable(ID int)

然后找到最大的ID


用While Loop,从1到最大ID,递增。

IF NOT EXISTS (SELECT 1 FROM yourtable WHERE ID = @CurrentID)
INSERT INTO #TempIDTable(ID) VALUES (@CurrentID)


结束以后,

SELECT ID FROM #TempIDTable

评分

参与人数 1积分 +3 收起 理由
无视 + 3 我很赞同

查看全部评分

发表于 2012-6-28 09:34 |显示全部楼层
此文章由 无视 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 无视 所有!转贴必须注明作者、出处和本声明,并保持内容完整
in addition to what jerryclerk suggested.

the following article u should check out.

http://stackoverflow.com/questio ... sing-ids-in-a-table

[ 本帖最后由 无视 于 2012-6-28 09:46 编辑 ]

发表于 2012-6-28 21:45 |显示全部楼层
此文章由 Dan.and.Andy 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 Dan.and.Andy 所有!转贴必须注明作者、出处和本声明,并保持内容完整
这个网站没有白天黑夜的区别,什么时候都是很高的访问,因为offshore 的用户更多,没见有歇的时候。领导说先搞个模拟,弄上500-1000个并发session,然后做更新测试,必须要平滑,我心说 -- 玩去,明天最后一天,干不成就留给后人了。

发表于 2012-6-28 22:52 |显示全部楼层
此文章由 Fernando 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 Fernando 所有!转贴必须注明作者、出处和本声明,并保持内容完整
如果只是找以前丢失的key,可以把backup restore到其他server环境里面,单独跑程序没有影响

发表于 2012-6-30 00:05 |显示全部楼层
此文章由 remonyan 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 remonyan 所有!转贴必须注明作者、出处和本声明,并保持内容完整
不用restore,只要把id column bcp出来,dump到测试环境的表中,生成一个clustered index,再用12楼的法子跑一下,十来分钟应该够了,8mil不算太大。

评分

参与人数 1积分 +2 收起 理由
Fernando + 2 我很赞同

查看全部评分

Advertisement
Advertisement

发表于 2012-6-30 10:02 |显示全部楼层
此文章由 huaxianz 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 huaxianz 所有!转贴必须注明作者、出处和本声明,并保持内容完整
1. create a 1 column temp table, then populate 1m (or 8m whatever) consecutive numbers by using cross join. If you don't know, search Itzik Ben-gan.
2. using EXCEPT.

除去打字时间,我保证你1秒钟之内得到结果。while loop这种procedural approach的程序员思维,killing relational engine. THINK IN SET.

发表于 2012-6-30 13:32 |显示全部楼层
此文章由 清风拂山岗 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 清风拂山岗 所有!转贴必须注明作者、出处和本声明,并保持内容完整
while loop这种procedural approach的程序员思维,killing relational engine. THINK IN SET.

正解!!!

发表于 2012-7-1 01:20 |显示全部楼层
此文章由 wil 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 wil 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 huaxianz 于 2012-6-30 09:02 发表
1. create a 1 column temp table, then populate 1m (or 8m whatever) consecutive numbers by using cross join. If you don't know, search Itzik Ben-gan.
2. using EXCEPT.

除去打字时间,我保证你1秒钟之内得到 ...


据我的理解,except好像没什么特别( http://www.sqlservercentral.com/ ... 92-1.aspx#bm1149012) ,你的方案比12楼的快很多是因为你查两次不写,他查8m次写n次,除此之外except似乎和not exist语义上没本质区别,内部实现也都是loop,所以不是很确定你说的think in set的含义

另外楼主也没提过数据库是sql server
回忆是红色的天空

发表回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Advertisement
Advertisement
返回顶部