SQL查找分析.

有二个表.表BOM数据量非常大.现是400W左右.表二PnoStatus数据不大.现只有50条左右.

都是自增主键.表BOM主键为IDNO,相关列有Pno(这个每Pno可能有3000多个相同的.),ldate(为数据插入时自动取当取时间).

表PnoStatus有主建ID,相关列有Pno,UpdateTime,Status. 

表BOM每隔一个小时都会导入新数据(每次大约3000条,相同pno).因相关要求.导入时更新相关表PnoStatus.

规则就是在PnoStatus的Pno等于BOM的pno取最大ldata.然后比较PnoStatus的UpdateTime,后更新Status.

最开始,按语意自然如下处理.

            db.PnoStatus.ToList().ForEach(t =>
            {
                var maxdate = db.BOM.Where(p => p.PNo == t.Pno)
                 .Max(p => p.ldate);                   

                if (t.UpdateTime > mdate)
                    t.Status = "Blue";
                else
                    t.Status = "Red";
            });

这样处理后发现整个处理完要完时间8分钟左右.现暂时还不影响.但是PnoStatus数据变多后恐出问题.

先查看这个语句.

select max(a.ldate) from BOM as a where a.PNo = 'Sdf00000001'

这条数据处理就要求10S左右.50条语句就500S.差不多是时间8分钟.

结合前几天看的HashTable的原理.我自己推断如下.索引查找和表的数据多少没有关系都是O(1)次查找.我先在表Bom

上想建立关于PNo的索引.那想给出相关错误.没有成功.

最后我在默认索引上IDNO上想办法.想查找对应Pno的最大时间.而时间和IDNO有个明显关系.IDNO越大.时间只会更大.不会更少.(表
BOM不会编辑数据,只会导入数据.)写出如下SQL.

select ldate from BOM where IDNO = (
	select max(IDNO) from BOM as a where a.PNo = 'Sdf00000001'
)

说实话.我刚写出来没想有什么效果.在我认为这完全是把简单问题复杂化了.但是我执行了下.显示1S!!

相应的现在整个时间44S就全部完成.

对应过程:

2010030215534924.png

可以看到第二个查询SQL还进行了并行处理都要12S.而第一个虽然复杂.但是时间短.

整个过程自己都还相对不是很明白.感觉有很大的巧合性.SQL也不是我的专长.唯一肯定索引相对平常查找优势太明显.希望给园友一点参考.

 

几天后.我感到还是有点疑惑.试了如下二语句.

select max(IDNO) from BOM as a where a.PNo = 'Sdf00000001'

select IDNO from BOM as a where a.PNo = 'Sdf00000001'

发现第二条语句也还是10S左右,没有什么区别.分析插入数据时.ldate插入时都是一样.而IDNO是自增的不一样.就这点而导致二条语句取Max(IDNO OR ldate)是产生10倍差.

原先在我想法中.取Max(IDNO)的值时会先把所有的IDNO取出来的再比较也是错误的.

他取Max(IDNO)时应没有取出相关的IDNO而得到最大值.不过有个新的问题出来了.他是如何取最大值的?

可惜我不知道是否相关工具能查看到具体过程.希望有相关高手能提示下.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值