精华内容
下载资源
问答
  • DB2大数据量优化查询解决方案

    DB2大数据量优化查询解决方案

    参考文章:

    (1)DB2大数据量优化查询解决方案

    (2)https://www.cnblogs.com/xumanbu/p/4203519.html


    备忘一下。


    展开全文
  • .NET 大数据量并发解决方案 大并发大数据量请求一般会分为几种情况: 大量的用户同时对系统的 不同功能页面 进行 查找、更新操作 大量的用户同时对系统的 同一个页面,同一个表 的大数据量进行 查询操作 ...

    .NET 大数据量并发解决方案

    大并发大数据量请求一般会分为几种情况:

    1. 大量的用户同时对系统的 不同功能页面 进行 查找、更新操作
    2. 大量的用户同时对系统的 同一个页面,同一个表 的大数据量进行 查询操作
    3. 大量的用户同时对系统的 同一个页面,同一个表 进行 更新操作

    第一类情况 :大量的用户同时对系统的 不同功能页面 进行 查找、更新操作

    一、对服务器层面的处理

    1. 调整IIS 7应用程序池队列长度

    由原来的默认1000改为65535。

    IIS Manager > ApplicationPools > Advanced Settings
    Queue Length : 65535

    2. 调整IIS 7的 appConcurrentRequestLimit 设置

    由原来的默认5000改为100000。
    c:\windows\system32\inetsrv\appcmd.exe set config /section:serverRuntime /appConcurrentRequestLimit:100000
    在 %systemroot%\System32\inetsrv\config\applicationHost.config 中可以查看到该设置:<serverRuntime appConcurrentRequestLimit="100000" />

    3. 调整machine.config中的processModel>requestQueueLimit的设置

    由原来的默认5000改为100000。

    <configuration>  
        <system.web>  
            <processModel requestQueueLimit="100000"/>   

    4. 修改注册表,调整IIS 7支持的同时TCPIP连接数

    由原来的默认5000改为100000。
    reg add HKLM\System\CurrentControlSet\Services\HTTP\Parameteris /v MaxConnections /t REG_DWORD /d 100000

    完成上述4个设置,就基本可以支持10万个同时请求

    如果访问量达到10万以上,就可以考虑将 程序  和 数据库  按功能模块划分,部署到多个服务器分担访问压力
    另外可以考虑 软硬件负载均衡 。

    • 硬件负载均衡 能够直接通过 智能交换机  实现,处理能力强,而且与系统无关,但是价格贵,配置困难,不能区分实习系统与应用的状态。所以硬件负载均衡适用于 一大堆设备,大访问量,简单应用 。
    • 软件负载均衡 是基于系统与应用的,能过更好地根据系统与应用的状况来分配负载。性价比高。PCL负载均衡软件,Linux下的LVS软件。

    二、对数据库层面的处理

    1. 当两个用户同时访问一个页面,一个用户可能更新的是另一个用户已经删除的记录。
    2. 在一个用户加载页面与他点击删除按钮之间的时间里,另一个用户修改了这条记录的内容。
      所以 需要考虑 数据库锁 的问题

    有下面三中并发控制策略可供选择:

     

    • 什么都不做 – 如果并发用户修改的是同一条记录,让最后提交的结果生效(默认的行为)。
    • 开放式并发(Optimistic Concurrency) - 假定并发冲突只是偶尔发生,绝大多数的时候并不会出现; 那么,当发生一个冲突时,仅仅简单的告知用户,他所作的更改不能保存,因为别的用户已经修改了同一条记录。
    • 保守式并发(Pessimistic Concurrency) – 假定并发冲突经常发生,并且用户不能容忍被告知自己的修改不能保存是由于别人的并发行为;那么,当一个用户开始编辑一条记录,锁定该记录,从而防止其他用户编辑或删除该记录,直到他完成并提交自己的更改。

     

    试图同时修改数据时,需要建立控制机制来防止一个用户的修改对同时操作的其他用户所作的修改产生不利的影响。处理这种情况的系统叫做“并发控制”。

    并发控制的类型

    通常,管理数据库中的并发有三种常见的方法:

     

    1. 保守式并发控制 - 在从获取记录直到记录在数据库中更新的这段时间内,该行对用户不可用。
    2. 开放式并发控制 - 只有当实际更新数据时,该行才对其他用户不可用。更新将在数据库中检查该行并确定是否进行了任何更改。如果试图更新已更改的记录,则将导致并发冲突。
    3. 最后的更新生效 - 只有当实际更新数据时,该行才对其他用户不可用。但是,不会将更新与初始记录进行比较;而只是写出记录,这可能就改写了自上次刷新记录后其他用户所进行的更改。

     

    1. 保守式并发

    保守式并发通常用于两个目的。
    第一,在某些情况下,存在对 相同记录的大量争用。在数据上放置 锁 所费的成本小于 发生并发冲突时回滚更改 所费的成本。

    在 事务过程 中不宜更改记录的情况下,保守式并发 也非常有用。库存应用程序便是一个很好的示例。

    假定有一个公司代表正在为一名潜在的客户检查库存。
    您通常要锁定记录,直到生成订单为止,这通常会将该项标记为“已订购”状态并将其从可用库存中移除。
    如果未生成订单,则将释放该锁,以便其他检查库存的用户得到准确的可用库存计数。

    但是,在断开的结构中无法进行保守式并发控制连接打开的时间只够读取数据或更新数据,因此不能长时间地保持锁。此外,长时间保留锁的应用程序将无法进行伸缩

    2. 开放式并发

    在开放式并发中,只有在访问数据库时才设置并保持锁
    这些锁将防止其他用户在同一时间更新记录。除了进行更新这一确切的时刻之外,数据始终可用。
    有关更多信息,请参见开放式并发

    当试图更新时,已更改行的初始版本将与数据库中的现有行进行比较。
    如果两者不同,更新将失败,并引发并发错误。
    这时,将由您使用所创建的业务逻辑来协调这两行。

    3. 最后的更新生效

    当使用“最后的更新生效”时,不会对初始数据进行检查,而只是将更新写入数据库。
    很明显,可能会发生以下情况:

    用户 A 从数据库获取一项记录。
    用户 B 从数据库获取相同的记录,对其进行修改,然后将更新后的记录写回数据库。
    用户 A 修改“旧”记录并将其写回数据库。

    在上述情况中,用户 A 永远也不会看到用户 B 作出的更改。如果您计划使用并发控制的“最后的更新生效”方法,则要确保这种情况是可以接受的。

    三、ADO.NET 和 Visual Studio .NET 中的并发控制

    因为数据结构基于断开的数据,所以 ADO.NET和 Visual Studio .NET 使用开放式并发
    因此,您需要添加业务逻辑,以利用开放式并发解决问题。

    如果您选择使用开放式并发,则可以通过两种常规的方法来确定是否已发生更改:
    版本号方法(实际版本号或日期时间戳)和保存所有值方法

    1. 版本号方法

    在版本号方法中,要更新的记录必须具有一个包含日期时间戳或版本号的列。
    当读取该记录时,日期时间戳或版本号将保存在客户端。
    然后,将对该值进行部分更新。

    处理并发的一种方法是,仅当 WHERE子句中的值与记录上的值匹配时才进行更新。
    该方法的 SQL 表示形式为:

    UPDATE Table1 SET Column1 = @newvalue1, Column2 = @newvalue2
    WHERE DateTimeStamp = @origDateTimeStamp

    或者,可以使用版本号进行比较:

    UPDATE Table1 SET Column1 = @newvalue1, Column2 = @newvalue2
    WHERE RowVersion = @origRowVersionValue

    如果日期时间戳或版本号匹配,则表明数据存储区中的记录未被更改,并且可以安全地使用数据集中的新值对该记录进行更新;
    如果不匹配,则将返回错误。

    您可以编写代码,在 Visual Studio .NET 中实现这种形式的并发检查。您还必须编写代码来响应任何更新冲突。
    为了确保日期时间戳或版本号的准确性,您需要在上设置触发器,以便在发生对行的更改时,对日期时间戳或版本号进行更新。

    2. 保存所有值方法

    使用日期时间戳或版本号的替代方法是,在读取记录时获取所有字段的副本
    ADO.NET 中的 DataSet 对象维护每个修改记录的两个版本:

    初始版本(最初从数据源中读取的版本)和修改版本(表示用户更新)。

    当试图将记录写回数据源时,数据行中的初始值将与数据源中的记录进行比较。
    如果它们匹配,则表明数据库记录在被读取后尚未经过更改
    在这种情况下,数据集中已更改的值将成功地写入数据库。
    对于数据适配器的四个命令(DELETE、INSERT、SELECT 和 UPDATE)来说,每个命令都有一个参数集合。每个命令都有用于初始值和当前值(或修改值)的参数。

    第二类情况的处理:

    因为是大并发请求,也能采用第一种情况的处理方法,
    另外,因为是对大数据量进行检索,所以需要考虑查询效率的问题:

    1. 对表按查询条件建立索引
    2. 对查询语句进行优化
    3. 可以考虑对查询数据使用缓存

    第三类情况的处理:

    也能采用第一种情况的处理方法,
    另外因为是对同一个表进行更新操作,可以考虑使用下面的处理方法:

    1. 先将数据保存到缓存中,当数据达到一定的数量后,再更新到数据库中
    2. 将表按索引划分(分表,分区),如:对于一个存储全国人民信息的表,这个数据量是很大的,如果按省划分为多个表,在将全国的人民信息按省存储到相应的表中,然后根据省份对相应的并进行查询和更新,这样大并发和大数据量的问题就会减小很多
    展开全文
  • 2.大量的用户同时对系统的同一个页面,同一个表的大数据量进行查询操作 3.大量的用户同时对系统的同一个页面,同一个表进行更新操作 对于第一种情况一般处理方法如下: 一。对服务器层面的处理 1. 调整IIS 7...

    大并发大数据量请求一般会分为几种情况:

    1.大量的用户同时对系统的不同功能页面进行查找,更新操作

    2.大量的用户同时对系统的同一个页面,同一个表的大数据量进行查询操作

    3.大量的用户同时对系统的同一个页面,同一个表进行更新操作

     

    对于第一种情况一般处理方法如下:

    一。对服务器层面的处理

    1. 调整IIS 7应用程序池队列长度

    由原来的默认1000改为65535。

    IIS Manager > ApplicationPools > Advanced Settings

    Queue Length : 65535

    2.  调整IIS 7的appConcurrentRequestLimit设置

    由原来的默认5000改为100000。

    c:\windows\system32\inetsrv\appcmd.exe set config /section:serverRuntime /appConcurrentRequestLimit:100000

    在%systemroot%\System32\inetsrv\config\applicationHost.config中可以查看到该设置:

    1. <serverRuntime appConcurrentRequestLimit="100000" />   

    3. 调整machine.config中的processModel>requestQueueLimit的设置

    由原来的默认5000改为100000。

    1. <configuration>  
    2.     <system.web>  
    3.         <processModel requestQueueLimit="100000"/>   

    4. 修改注册表,调整IIS 7支持的同时TCPIP连接数

    由原来的默认5000改为100000。

    reg add HKLM\System\CurrentControlSet\Services\HTTP\Parameteris /v MaxConnections /t REG_DWORD /d 100000 

    完成上述4个设置,就基本可以支持10万个同时请求。如果访问量达到10万以上,就可以考虑将程序和数据库按功能模块划分部署到多个服务器分担访问压力。另外可以考虑软硬件负载均衡。硬件负载均衡能够直接通过智能交换机实现,处理能力强,而且与系统无关,但是价格贵,配置困难,不能区分实习系统与应状态。所以硬件负载均衡适用于一大堆设备,大访问量,简单应用。软件负载均衡是基于系统与应用的,能过更好地根据系统与应用的状况来分配负载。性价比高。PCL负载均衡软件,Linux下的LVS软件。

     

    二。对数据库层面的处理

          当两个用户同时访问一个页面,一个用户可能更新的是另一个用户已经删除的记录。或者,在一个用户加载页面跟他点击删除按钮之间的时间里,另一个用户修改了这条记录的内容。所以需要考虑数据库锁的问题

    有下面三中并发控制策略可供选择:

    Ø 什么都不做 –如果并发用户修改的是同一条记录,让最后提交的结果生效(默认的行为)

    Ø 开放式并发(Optimistic Concurrency) - 假定并发冲突只是偶尔发生,绝大多数的时候并不会出现; 那么,当发生一个冲突时,仅仅简单的告知用户,他所作的更改不能保存,因为别的用户已经修改了同一条记录

    Ø 保守式并发(Pessimistic Concurrency) – 假定并发冲突经常发生,并且用户不能容忍被告知自己的修改不能保存是由于别人的并发行为;那么,当一个用户开始编辑一条记录,锁定该记录,从而防止其他用户编辑或删除该记录,直到他完成并提交自己的更改

    当多个用户试图同时修改数据时,需要建立控制机制来防止一个用户的修改对同时操作的其他用户所作的修改产生不利的影响。处理这种情况的系统叫做“并发控制”。

    并发控制的类型

    通常,管理数据库中的并发有三种常见的方法:

    • 保守式并发控制 - 在从获取记录直到记录在数据库中更新的这段时间内,该行对用户不可用。
    • 开放式并发控制 - 只有当实际更新数据时,该行才对其他用户不可用。更新将在数据库中检查该行并确定是否进行了任何更改。如果试图更新已更改的记录,则将导致并发冲突。
    • 最后的更新生效 - 只有当实际更新数据时,该行才对其他用户不可用。但是,不会将更新与初始记录进行比较;而只是写出记录,这可能就改写了自上次刷新记录后其他用户所进行的更改。
    保守式并发

    保守式并发通常用于两个目的。第一,在某些情况下,存在对相同记录的大量争用。在数据上放置锁所费的成本小于发生并发冲突时回滚更改所费的成本。

    在事务过程中不宜更改记录的情况下,保守式并发也非常有用。库存应用程序便是一个很好的示例。假定有一个公司代表正在为一名潜在的客户检查库存。您通常要锁定记录,直到生成订单为止,这通常会将该项标记为“已订购”状态并将其从可用库存中移除。如果未生成订单,则将释放该锁,以便其他检查库存的用户得到准确的可用库存计数。

    但是,在断开的结构中无法进行保守式并发控制。连接打开的时间只够读取数据或更新数据,因此不能长时间地保持锁。此外,长时间保留锁的应用程序将无法进行伸缩。

    开放式并发

    在开放式并发中,只有在访问数据库时才设置并保持锁。这些锁将防止其他用户在同一时间更新记录。除了进行更新这一确切的时刻之外,数据始终可用。有关更多信息,请参见开放式并发

    当试图更新时,已更改行的初始版本将与数据库中的现有行进行比较。如果两者不同,更新将失败,并引发并发错误。这时,将由您使用所创建的业务逻辑来协调这两行。

    最后的更新生效

    当使用“最后的更新生效”时,不会对初始数据进行检查,而只是将更新写入数据库。很明显,可能会发生以下情况:

    • 用户 A 从数据库获取一项记录。
    • 用户 B 从数据库获取相同的记录,对其进行修改,然后将更新后的记录写回数据库。
    • 用户 A 修改“旧”记录并将其写回数据库。

    在上述情况中,用户 A 永远也不会看到用户 B 作出的更改。如果您计划使用并发控制的“最后的更新生效”方法,则要确保这种情况是可以接受的。

    ADO.NET 和 Visual Studio .NET 中的并发控制

    因为数据结构基于断开的数据,所以 ADO.NET 和 Visual Studio .NET 使用开放式并发。因此,您需要添加业务逻辑,以利用开放式并发解决问题。

    如果您选择使用开放式并发,则可以通过两种常规的方法来确定是否已发生更改:版本方法(实际版本号或日期时间戳)和保存所有值方法。

    版本号方法

    在版本号方法中,要更新的记录必须具有一个包含日期时间戳或版本号的列。当读取该记录时,日期时间戳或版本号将保存在客户端。然后,将对该值进行部分更新。

    处理并发的一种方法是仅当 WHERE 子句中的值与记录上的值匹配时才进行更新。该方法的 SQL 表示形式为:

    UPDATE Table1 SET Column1 = @newvalue1, Column2 = @newvalue2
    WHERE DateTimeStamp = @origDateTimeStamp

    或者,可以使用版本号进行比较:

    UPDATE Table1 SET Column1 = @newvalue1, Column2 = @newvalue2
    WHERE RowVersion = @origRowVersionValue

    如果日期时间戳或版本号匹配,则表明数据存储区中的记录未被更改,并且可以安全地使用数据集中的新值对该记录进行更新。如果不匹配,则将返回错误。您可以编写代码,在 Visual Studio .NET 中实现这种形式的并发检查。您还必须编写代码来响应任何更新冲突。为了确保日期时间戳或版本号的准确性,您需要在表上设置触发器,以便在发生对行的更改时,对日期时间戳或版本号进行更新。

    保存所有值方法

    使用日期时间戳或版本号的替代方法是在读取记录时获取所有字段的副本。ADO.NET 中的 DataSet 对象维护每个修改记录的两个版本:初始版本(最初从数据源中读取的版本)和修改版本(表示用户更新)。当试图将记录写回数据源时,数据行中的初始值将与数据源中的记录进行比较。如果它们匹配,则表明数据库记录在被读取后尚未经过更改。在这种情况下,数据集中已更改的值将成功地写入数据库。

    对于数据适配器的四个命令(DELETE、INSERT、SELECT 和 UPDATE)来说,每个命令都有一个参数集合。每个命令都有用于初始值和当前值(或修改值)的参数。

     

     

    对于第二种情况的处理:

    因为是大并发请求,也能采用第一种情况的处理方法,另外因为是对大数据量进行检索,所以需要考虑查询效率的问题

    1.对表按查询条件建立索引

    2.对查询语句进行优化

    3.可以考虑对查询数据使用缓存

     

    对于第三种情况的处理:

    也能采用第一种情况的处理方法,另外因为是对同一个表进行更新操作,可以考虑使用下面的处理方法:

    1.先将数据保存到缓存中,当数据达到一定的数量后,再更新到数据库中

    2.将表按索引划分(分表,分区),如:对于一个存储全国人民信息的表,这个数据量是很大的,如果按省划分为多个表,在将全国的人民信息按省存储到相应的表中,然后根据省份对相应的并进行查询和更新,这样大并发和大数据量的问题就会减小很多

    转载于:https://www.cnblogs.com/wwy224y/p/3552194.html

    展开全文
  • .NET 大数据量并发解决方案 2017年12月27日 14:31:15黄景轩66阅读数:3389 .NET 大数据量并发解决方案 大并发大数据量请求一般会分为几种情况: 大量的用户同时对系统的不同功能页面进行查找...

    .NET 大数据量并发解决方案

    .NET 大数据量并发解决方案

    大并发大数据量请求一般会分为几种情况:

    1. 大量的用户同时对系统的 不同功能页面 进行 查找、更新操作
    2. 大量的用户同时对系统的 同一个页面,同一个表 的大数据量进行 查询操作
    3. 大量的用户同时对系统的 同一个页面,同一个表 进行 更新操作

    第一类情况 :大量的用户同时对系统的 不同功能页面 进行 查找、更新操作

    一、对服务器层面的处理

    1. 调整IIS 7应用程序池队列长度

    由原来的默认1000改为65535。

    IIS Manager > ApplicationPools > Advanced Settings
    Queue Length : 65535

    2. 调整IIS 7的 appConcurrentRequestLimit 设置

    由原来的默认5000改为100000。
    c:\windows\system32\inetsrv\appcmd.exe set config /section:serverRuntime /appConcurrentRequestLimit:100000
    在 %systemroot%\System32\inetsrv\config\applicationHost.config 中可以查看到该设置:<serverRuntime appConcurrentRequestLimit="100000" />

    3. 调整machine.config中的processModel>requestQueueLimit的设置

    由原来的默认5000改为100000。

    1.  
      <configuration>
    2.  
      <system.web>
    3.  
      <processModel requestQueueLimit="100000"/>

    4. 修改注册表,调整IIS 7支持的同时TCPIP连接数

    由原来的默认5000改为100000。
    reg add HKLM\System\CurrentControlSet\Services\HTTP\Parameteris /v MaxConnections /t REG_DWORD /d 100000

    完成上述4个设置,就基本可以支持10万个同时请求。

    如果访问量达到10万以上,就可以考虑将 程序  和 数据库  按功能模块划分,部署到多个服务器分担访问压力。
    另外可以考虑 软硬件负载均衡 。

    • 硬件负载均衡 能够直接通过 智能交换机  实现,处理能力强,而且与系统无关,但是价格贵,配置困难,不能区分实习系统与应用的状态。所以硬件负载均衡适用于 一大堆设备,大访问量,简单应用 。
    • 软件负载均衡 是基于系统与应用的,能过更好地根据系统与应用的状况来分配负载。性价比高。PCL负载均衡软件,Linux下的LVS软件。

    二、对数据库层面的处理

    1. 当两个用户同时访问一个页面,一个用户可能更新的是另一个用户已经删除的记录。
    2. 在一个用户加载页面与他点击删除按钮之间的时间里,另一个用户修改了这条记录的内容。
      所以 需要考虑 数据库锁 的问题。

    有下面三中并发控制策略可供选择:

     

    • 什么都不做 – 如果并发用户修改的是同一条记录,让最后提交的结果生效(默认的行为)。
    • 开放式并发(Optimistic Concurrency) - 假定并发冲突只是偶尔发生,绝大多数的时候并不会出现; 那么,当发生一个冲突时,仅仅简单的告知用户,他所作的更改不能保存,因为别的用户已经修改了同一条记录。
    • 保守式并发(Pessimistic Concurrency) – 假定并发冲突经常发生,并且用户不能容忍被告知自己的修改不能保存是由于别人的并发行为;那么,当一个用户开始编辑一条记录,锁定该记录,从而防止其他用户编辑或删除该记录,直到他完成并提交自己的更改。

     

    试图同时修改数据时,需要建立控制机制来防止一个用户的修改对同时操作的其他用户所作的修改产生不利的影响。处理这种情况的系统叫做“并发控制”。

    并发控制的类型

    通常,管理数据库中的并发有三种常见的方法:

     

    1. 保守式并发控制 - 在从获取记录直到记录在数据库中更新的这段时间内,该行对用户不可用。
    2. 开放式并发控制 - 只有当实际更新数据时,该行才对其他用户不可用。更新将在数据库中检查该行并确定是否进行了任何更改。如果试图更新已更改的记录,则将导致并发冲突。
    3. 最后的更新生效 - 只有当实际更新数据时,该行才对其他用户不可用。但是,不会将更新与初始记录进行比较;而只是写出记录,这可能就改写了自上次刷新记录后其他用户所进行的更改。

     

    1. 保守式并发

    保守式并发通常用于两个目的。
    第一,在某些情况下,存在对 相同记录的大量争用。在数据上放置 锁 所费的成本小于 发生并发冲突时回滚更改 所费的成本。

    在 事务过程 中不宜更改记录的情况下,保守式并发 也非常有用。库存应用程序便是一个很好的示例。

    假定有一个公司代表正在为一名潜在的客户检查库存。
    您通常要锁定记录,直到生成订单为止,这通常会将该项标记为“已订购”状态并将其从可用库存中移除。
    如果未生成订单,则将释放该锁,以便其他检查库存的用户得到准确的可用库存计数。

    但是,在断开的结构中无法进行保守式并发控制。连接打开的时间只够读取数据或更新数据,因此不能长时间地保持锁。此外,长时间保留锁的应用程序将无法进行伸缩

    2. 开放式并发

    在开放式并发中,只有在访问数据库时才设置并保持锁
    这些锁将防止其他用户在同一时间更新记录。除了进行更新这一确切的时刻之外,数据始终可用。
    有关更多信息,请参见开放式并发

    当试图更新时,已更改行的初始版本将与数据库中的现有行进行比较。
    如果两者不同,更新将失败,并引发并发错误。
    这时,将由您使用所创建的业务逻辑来协调这两行。

    3. 最后的更新生效

    当使用“最后的更新生效”时,不会对初始数据进行检查,而只是将更新写入数据库。
    很明显,可能会发生以下情况:

    用户 A 从数据库获取一项记录。
    用户 B 从数据库获取相同的记录,对其进行修改,然后将更新后的记录写回数据库。
    用户 A 修改“旧”记录并将其写回数据库。

    在上述情况中,用户 A 永远也不会看到用户 B 作出的更改。如果您计划使用并发控制的“最后的更新生效”方法,则要确保这种情况是可以接受的。

    三、ADO.NET 和 Visual Studio .NET 中的并发控制

    因为数据结构基于断开的数据,所以 ADO.NET和 Visual Studio .NET 使用开放式并发
    因此,您需要添加业务逻辑,以利用开放式并发解决问题。

    如果您选择使用开放式并发,则可以通过两种常规的方法来确定是否已发生更改:
    版本号方法(实际版本号或日期时间戳)和保存所有值方法

    1. 版本号方法

    在版本号方法中,要更新的记录必须具有一个包含日期时间戳或版本号的列。
    当读取该记录时,日期时间戳或版本号将保存在客户端。
    然后,将对该值进行部分更新。

    处理并发的一种方法是,仅当 WHERE子句中的值与记录上的值匹配时才进行更新。
    该方法的 SQL 表示形式为:

    1.  
      UPDATE Table1 SET Column1 = @newvalue1, Column2 = @newvalue2
    2.  
      WHERE DateTimeStamp = @origDateTimeStamp

    或者,可以使用版本号进行比较:

    1.  
      UPDATE Table1 SET Column1 = @newvalue1, Column2 = @newvalue2
    2.  
      WHERE RowVersion = @origRowVersionValue

    如果日期时间戳或版本号匹配,则表明数据存储区中的记录未被更改,并且可以安全地使用数据集中的新值对该记录进行更新;
    如果不匹配,则将返回错误。

    您可以编写代码,在 Visual Studio .NET 中实现这种形式的并发检查。您还必须编写代码来响应任何更新冲突。
    为了确保日期时间戳或版本号的准确性,您需要在上设置触发器,以便在发生对行的更改时,对日期时间戳或版本号进行更新。

    2. 保存所有值方法

    使用日期时间戳或版本号的替代方法是,在读取记录时获取所有字段的副本
    ADO.NET 中的 DataSet 对象维护每个修改记录的两个版本:

    初始版本(最初从数据源中读取的版本)和修改版本(表示用户更新)。

    当试图将记录写回数据源时,数据行中的初始值将与数据源中的记录进行比较。
    如果它们匹配,则表明数据库记录在被读取后尚未经过更改。
    在这种情况下,数据集中已更改的值将成功地写入数据库。
    对于数据适配器的四个命令(DELETE、INSERT、SELECT 和 UPDATE)来说,每个命令都有一个参数集合。每个命令都有用于初始值和当前值(或修改值)的参数。

    第二类情况的处理:

    因为是大并发请求,也能采用第一种情况的处理方法,
    另外,因为是对大数据量进行检索,所以需要考虑查询效率的问题:

    1. 对表按查询条件建立索引
    2. 对查询语句进行优化
    3. 可以考虑对查询数据使用缓存

    第三类情况的处理:

    也能采用第一种情况的处理方法,
    另外因为是对同一个表进行更新操作,可以考虑使用下面的处理方法:

    1. 先将数据保存到缓存中,当数据达到一定的数量后,再更新到数据库中
    2. 将表按索引划分(分表,分区),如:对于一个存储全国人民信息的表,这个数据量是很大的,如果按省划分为多个表,在将全国的人民信息按省存储到相应的表中,然后根据省份对相应的并进行查询和更新,这样大并发和大数据量的问题就会减小很多

    转载于:https://www.cnblogs.com/LiZhongZhongY/p/10954492.html

    展开全文
  • 本人遇到一个这样的问题,求各路神仙提供一种解决方法。 现在有一张表(暂且叫 tab_tmp)有80万条记录,其中有两个字段是 'deviceid'(设备ID)以及 'addtime'(记录添加时间),现在想在这张表里面查询所有不重复 ...
  • 但是这个表的数据量,有6千万--1亿条记录左右!! billing_nbr--手机号 ny--所属月份 cell_id--小区编号 js-计数(全部为1) duration--通话时长(单位秒) 现在每次到了select的时候 程序就假死了 ...
  • Java-针对查询大量数据解决效率的方案
  • https://blog.csdn.net/top_code/article/details/51280862
  • 项目中可能会遇到数据量,同时有需要多表联合查询的时候,这个时候,在计算页码的时候,就会遇到如何处理的问题。 在项目中我的处理方案 mysql数据库索引优化(一般情况下可以满足需求) 前端获取数据时,不...
  • 本文记录大数据可视化项目中信息查询过程遇到的实际问题及解决方案,用到了Vue自定义组件、Promise.all、DocumentFragment、event loop等。 项目需求 项目使用的arcgis地图服务中主要地图要素为图斑即面状要素,...
  • 1、数据量增多,单靠主键查询效率低效,增加查询字段索引,提升查询效率。 2、单节点压力过,采用读写分离,将查询压力增加到其他节点,查询节点设置索引,插入节点不设置索引。但会导致数据存在时差,如果有多个...
  • 关于大量数据查询、分页解决方案

    千次阅读 2008-12-09 18:32:00
    看到好多人问grid的带查询框的翻页问题,得到论坛newdongyuwei的帮助,解决了分页的问题。下面讲一下解决办法。一、在grid的分布工具栏添加一下个查询框,先定义分页查询框(例子为定义在grid的pading栏) var paging ...
  • 常见的对大数据量查询解决方案有以下两种:一、将全部数据先查询到内存中,然后在内存中进行分页,这种方式对内存占用较大,必须限制一次查询的数据量。二、采用存储过程在数据库中进行分页,这种
  • 最近项目中用到了mysql的递归查询记录一下。 首先mysql的递归查询可以通过自定义函数和存储过程来实现,自定义函数不能返回结果集,只能是返回单一的值。而存储过程可以返回结果集但不能作为sql的子查询,需要先...
  • 1、开始认为报表查询sql不够优化,sql优化多次之后 发现在生产数据库,sql根本就查询不出结果集; 2、如果sql或存储过程查询很慢会造成数据库连接超时; 3、POI HSSFWorkbook、XSSFWorkbook生成excel 文档会造成...
  • 项目组处理的一个表数据量在5亿+,在上周来查询速度变得极其缓慢,在一个app应用页面遇到这样的问题应该是严重影响用户体验的,所以在发布的时候(服务器停机维护),我们需要对这个表做一次优化。 啰嗦一下哈,表名...
  • 下拉列表框数据量大解决方案

    千次阅读 2020-07-26 16:13:47
    当下拉列表,从后端获取列表数据,数据量上万条时,如果直接将查询的结果渲染到前端页面,效率是非常低的。我的解决方案是,每次从后端读取100条数据(当然你可以自己限定每次查询的条数),当用户在列表框输入数据...
  • 操作:删除了大概180万条数据问题:删除数据后...解决方案:1、查看表空间占用select segment_name,bytes/1048576 MB from user_segments order by bytes asc;2、释放表空间alter table T_JB_BILL_INF move;3、查看表
  • 1、尽量避免在 where 子句中使用!=或操作符,否则将引擎放弃使用索引而进行全表扫描。...20、尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。 21、尽量避免大事务操作,提高系统并发能力。
  • 查询大量数据时,怎么提高查询效率? 从数据库设计方面考虑: 建立索引分区(MysQL,比如按时间分区)尽量使用固定长度的字段限制字段长度 从数据库I/O方面: 增加缓冲区如果涉及表的级联,不同的表存储在不同的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,288
精华内容 915
关键字:

大数据量查询解决方案