专栏首页程序员的SOD蜜SQLSERVER 占了500多M内存,原来的程序无法一次查询出50多W数据了,记录下这个问题的解决过程。

SQLSERVER 占了500多M内存,原来的程序无法一次查询出50多W数据了,记录下这个问题的解决过程。

    今天需要使用“数据同步程序”将外网数据库的FundYield 数据重新同步到内网,上次成功的一次将50W数据查询了出来,但这次不行了。记得上次外网服务器剩余内存较多,SQLSERVER只占用了150M,这次占了500多M,程序无论如何也不能一次查询出50W数据来,老是查询超时,但这个数据着急要,只有想办法了。

  系统使用每个表的最后修改日期(ZHXGRQ)字段作为更新的标记,检查了下数据,发现有51W多条数据都是 1999-1-1 ,除非程序将这51W条数据全部一次查询出来,否则只有另外想办法。看了下表结构,还有一个ID字段(bigint类型),虽然不是主键,但不重复,这样我们可以使用这个字段作为“分页”的依据了,每次查询个10-20W数据是没有问题,于是将原来的实体类修改为下面的样子:

namespace WFT_DataSyncModel 
{
  [Serializable()]
    public partial class FundYield : EntityBase, WcfMail.Interface.IDataSyncEntity
  {
    public FundYield()
    {
            TableName = "FundYield";
            EntityMap=EntityMapType.SqlMap;
            //IdentityName = "标识字段名";
            //PrimaryKeys.Add("主键字段名");
    PrimaryKeys.Add("jjdm");
    PrimaryKeys.Add("FSRQ");
            
            PropertyNames = new string[] { "ID","jjdm","jjmc","jjjc","dwjz","ljjz","FSRQ","QuarterYield","DayYield","WeekYield","WeekYieldPM","Month1Yield","Month1YieldPM","Month3Yield","Month3YieldPM","Month6Yield","YearYield","YearYieldPM","Year1Yield","Year1YieldPM","Year2Yield","Year3Yield","totalyield","bzc3","bzc6","bzc12","bzc24","BuyState","addtime","ZHXGRQ","DayYieldPM","Month6YieldPM","Year2YieldPM","Year3YieldPM","totalyieldPM","DayYieldCount","WeekYieldCount","Month1YieldCount","Month3YieldCount","Month6YieldCount","YearYieldCount","Year1YieldCount","Year2YieldCount","Year3YieldCount","totalYieldCount" };
            PropertyValues = new object[PropertyNames.Length]; 
    }
//...实体属性在此省略
}

在实体类 FundYield 中,有一个实体映射类型属性:

EntityMap=EntityMapType.SqlMap;//映射为自定义SQL查询

默认情况下,应该是

EntityMap=EntityMapType.Table;//映射为表

数据更新实体类必须继承一个数据更新接口:

WcfMail.Interface.IDataSyncEntity

好了,实体类的修改仅此以处,实体类映射指定为SqlMap类型,必须建立一个SqlMap配置文件,文件名固定是 “EntitySqlMap.config”  ,下面是文件内容:

代码 
<?xml version="1.0" encoding="utf-8"?>
<!--SQL-MAP 实体类自定义查询配置文件
SQL 语句不能使用 Select * from table 格式,必须指定跟实体类一致的字段定义,否则可能发生难以预测的错误。
要生成实体类,请使用PDF.NET 实体类工具。
有关PDF.NET,请了解 http://www.pwmis.com/sqlmap
power by dth,2010.12.8
-->
<configuration>
  <Namespace name="WFT_DataSyncModel">
    <Map name="FundYield">
      <Sql>
      <![CDATA[
      SELECT    
 ID , jjdm , jjmc , jjjc , dwjz , ljjz , FSRQ , QuarterYield , DayYield , WeekYield , WeekYieldPM , Month1Yield , Month1YieldPM , Month3Yield , Month3YieldPM , Month6Yield , YearYield , YearYieldPM , Year1Yield , Year1YieldPM , Year2Yield , Year3Yield , totalyield , bzc3 , bzc6 , bzc12 , bzc24 , BuyState , addtime , ZHXGRQ , DayYieldPM , Month6YieldPM , Year2YieldPM , Year3YieldPM , totalyieldPM , DayYieldCount , WeekYieldCount , Month1YieldCount , Month3YieldCount , Month6YieldCount , YearYieldCount , Year1YieldCount , Year2YieldCount , Year3YieldCount , totalYieldCount  
      FROM FundYield where id < 400000
]]></Sql>
    </Map>
   
  </Namespace>
</configuration>

注意一下名称空间和映射名称必须和类的定义一致。

OK,所需的工作完成,我们只改了一下实体类的映射类型和编写了一个实体类查询文件,编译项目,重新发布,开始执行,剩下的只是每次修改一下配置文件的查询条件了,比如我现在正在使用的条件:

where ID>=600000 and ID<800000

最后的工作就是等待它执行完成,这个任务就OK了。

==================

总结:

使用面向对象的方法(OO)也可以很方便的处理“纯数据问题”,数据只是对象的一部分,我们将数据放到对象中去处理,使得我们对新问题的处理变得很容易,这就是OO的美妙之处!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 分布式系统的消息&服务模式简单总结

    分布式系统的消息&服务模式简单总结 在一个分布式系统中,有各种消息的处理,有各种服务模式,有同步异步,有高并发问题甚至应对高并发问题的Actor编程模型,本文尝...

    用户1177503
  • "开门待客"还是“送货上门”?

     系列文章索引: [WCF邮件通信系统应用 之 数据同步程序 之 设计内幕 之 一] 同步一个数据库要发多少个数据包? [WCF邮件通信系统应用 之 数据同步...

    用户1177503
  • 分布式计算,WCF+JSON+实体对象与WebService+DataSet效率大比拼

    最近做公司项目,我们要整合所有业务系统的客户数据,各业务系统的数据库有的Oracle,有的是SQLSERVER,而且表结构也不相同,如何整合不同系统之间的客户数...

    用户1177503
  • MinBox Logging v1.0.0 使用文档

    MinBox Logging是一款分布式、零侵入式的链路日志分析框架,支持SpringCloud微服务架构下配置使用,内部封装了RestTemplate、Ope...

    恒宇少年
  • 企点课堂 | “互联网+”下的零售行业,如何实现新的飞跃?下周四开讲!

    ? 零售行业在互联网+思维的引导下 如何完成高效的用户增长? 如何提升客单价? 如何实现低成本+高收益的运营模式? …… 下周四下午四点 企点君为你深度讲解 ...

    腾讯企点
  • 史上最全的Python大集合:awesome-python

    总体而言,awesome-python 包括了Web 框架、网络爬虫、网络内容提取、模板引擎、数据库、数据可视化、图片处理、文本处理、自然语言处理、机器学习、日...

    HuangWeiAI
  • 【GNN】NGCF:捕捉协同信号的 GNN

    今天学习的是新加坡国立大学和中国科技大学同学合作的论文《Neural Graph Collaborative Filtering》,发表于 2019 年 ACM...

    阿泽 Crz
  • C++核心准则E.13: 直接拥有一个对象所有权时永远不要抛出异常

    E.13: Never throw while being the direct owner of an object

    面向对象思考
  • Flutter基础widgets教程-ConstrainedBox篇

    青年码农
  • 涨知识 | 使用imToken钱包还能调用合约!

    今天在看以太坊多重签名时,发现都是通过智能合约来实现的(类似投票合约),那么就有一个问题,主流的钱包如imToken,怎么调用智能合约呢。

    Tiny熊

扫码关注云+社区

领取腾讯云代金券