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

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介:
    今天需要使用“数据同步程序”将外网数据库的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”  ,下面是文件内容:
复制代码
ExpandedBlockStart.gif 代码
<? 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的美妙之处!


    本文转自深蓝医生博客园博客,原文链接:http://www.cnblogs.com/bluedoctor/archive/2010/12/08/1900598.html,如需转载请自行联系原作者



相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
1月前
|
安全 Linux Shell
Linux上执行内存中的脚本和程序
【9月更文挑战第3天】在 Linux 系统中,可以通过多种方式执行内存中的脚本和程序:一是使用 `eval` 命令直接执行内存中的脚本内容;二是利用管道将脚本内容传递给 `bash` 解释器执行;三是将编译好的程序复制到 `/dev/shm` 并执行。这些方法虽便捷,但也需谨慎操作以避免安全风险。
103 6
|
2月前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
190 0
|
13天前
|
C语言 Android开发 C++
基于MTuner软件进行qt的mingw编译程序的内存泄漏检测
本文介绍了使用MTuner软件进行Qt MinGW编译程序的内存泄漏检测的方法,提供了MTuner的下载链接和测试代码示例,并通过将Debug程序拖入MTuner来定位内存泄漏问题。
基于MTuner软件进行qt的mingw编译程序的内存泄漏检测
|
19小时前
|
SQL 存储 数据挖掘
SQL Server 日期格式查询详解
SQL Server 日期格式查询详解
14 2
|
20小时前
|
存储 机器学习/深度学习 人工智能
数据在内存中的存储
数据在内存中的存储
|
14天前
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
82 5
|
11天前
|
缓存 NoSQL 算法
14)Redis 在内存用完时会怎么办?如何处理已过期的数据?
14)Redis 在内存用完时会怎么办?如何处理已过期的数据?
20 0
|
1月前
|
存储 运维
.NET开发必备技巧:使用Visual Studio分析.NET Dump,快速查找程序内存泄漏问题!
.NET开发必备技巧:使用Visual Studio分析.NET Dump,快速查找程序内存泄漏问题!
|
13天前
|
存储 弹性计算 网络协议
阿里云ECS内存型实例规格族特点、适用场景、指标数据参考
阿里云ECS提供了多样化的内存型实例规格族,专为需要高性能内存资源的应用场景设计。从最新的r8a系列到经过优化的re6p系列,旨在提供稳定、高效且安全的计算环境。这些实例不仅具备强大的计算性能与内存配比,还通过支持ESSD云盘和高效网络协议,显著提升了存储I/O能力和网络带宽,适用于大数据分析、高性能数据库、内存密集型应用等多种场景,为用户带来卓越的计算体验。本文将详细解析阿里云ECS中的多个内存型实例规格族,包括它们的核心特点、适用场景、实例规格及具体指标数据,为用户在云计算资源选型时提供参考。
|
2月前
|
编译器 C++
virtual类的使用方法问题之C++类中的非静态数据成员是进行内存对齐的如何解决
virtual类的使用方法问题之C++类中的非静态数据成员是进行内存对齐的如何解决