目录

介绍

使用代码


介绍

我正在开发一个大数据仓库。我们拥有来自具有不同数据库环境和体系结构的多个事务系统的数据。COBOL平面文件,Oracle,SQL服务器是主要的数据源。每夜进程从所有数据源导入每日事务数据(增量更改),并组合形成单个客户视图数据库。

通过比较Surname,Firstname,DOB,Sex,前两个地址行的第一个字符,ETL过程可以从所有事务系统中找到Common客户——根据上述条件字段创建HASHBYTE校验和值,并在Checksum字段上使用GRUOP BYE。因此,ETL过程创建一个重复数据删除的Customer表。

然后使用最新的联系人详细信息(电话,移动电话,电子邮件,地址等)更新新的Staging Customer表。此外,Customer表经过某些数据标准化和验证。例如,将所有电话号码设为国际格式,验证电子邮件地址,删除不良数据等。

每个唯一的客户(Customer)都会获得一个客户(Customer)ID(CID)。在下一个ETL过程中,CID可以合并或解除合并作为事务系统上的更改的一部分。我在本文中仅描述了Customer表,但是ETL过程基于CID创建了大量的其他表(例如,PRODUCT)。

最后,我必须将Staging Customer表与生产实时客户(Live Customer)表同步,因为Web和Mobile API都是实时的,所以在白天也要同步,即使是午夜也要同步。由于Customer表具有数百万条记录和CID合并的可能性,因此从staging Customer表更新Live Customer表并不容易,而且成本不低。此过程需要很长时间,并导致其他应用程序运行超时。要更新实时表格,请按以下步骤操作:

  • 锁定客户(Customer)表
  • 在ETL过程中加载在实时表上创建的任何新客户
  • 截断实时(live)客户表
  • 从Staging Customer表加载数据
  • 重新构建所有索引
  • 解锁客户(Customer)表

现在问题是上面的步骤需要将近5-10分钟,而其他Web和移动应用程序会因超时而受到影响。我已使用临时表(DROP和RENAME)解决了该问题。系统工作了,只有一秒钟锁定客户表!

步骤:

  • 在Production数据库上创建临时Customer表。
  • 从暂存区域将数据加载到临时表。
  • 在临时表上创建必需的索引(在我的例子中也是一个全文索引)
  • 在ETL过程中将在活动表上创建的任何新客户加载到临时表。
  • DROP 实时(live)Customer表
  • RENAME临时表生存客户表

使用代码

代码在生产数据库上创建tmp_Customer并从临时(staging)表加载数据。下一步创建所有必要的索引。从实时客户表中收集任何缺少的客户详细信息——在ETL过程中,在Production 数据库中创建Customers。最后DROP 实时(live)customer表和RENAME临时表生活。代码仅显示Customer表如何在Production 中刷新。您可以重复所有其他表的代码。在继续之前备份必要的表。

-- Microsoft SQL Server 2014 (SP2-CU16) (KB4482967) - 12.0.5626.1 (X64)-- Author: Prasannakumaran SarasijanayananIF OBJECT_ID('dbo.tmp_Customer', 'U') IS NOT NULL DROP TABLE dbo.tmp_Customer;CREATE TABLE [dbo].[tmp_Customer]([CID] [bigint] NOT NULL,[FirstName] [varchar](50) NULL,[SurName] [varchar](50) NULL,[Address1] [varchar](50) NULL,[Address2] [varchar](50) NULL,[Address3] [varchar](50) NULL,[Address4] [varchar](50) NULL,[Address5] [varchar](50) NULL,[Title] [varchar](10) NULL,[Sex] [varchar](1) NULL,[DOB] [varchar](12) NULL,[Fulladdress] [varchar](200) NULL,[email] [varchar](100) NULL,[Mobile] [varchar](20) NULL,[Fullname] [varchar](100) NULL-- Other columns are purposely removedPRIMARY KEY CLUSTERED([CID] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]) ON [PRIMARY]--Load data from ETL staging areainsert into tmp_customer( CID, FirstName, SurName, Address1, Address2, Address3, Address4, Title, Sex, DOB, Fulladdress, email, Mobile, Fullname)select CID, FirstName, SurName, Address1, Address2, Address3, Address4, Title, Sex, DOB, Fulladdress, email, Mobile, Fullname from CCF--========================= Creating Indices ==================================--MobileCREATE NONCLUSTERED INDEX [NonClusteredIndex-Mobile] ON [dbo].[tmp_Customer]([Mobile] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)--CREATE FULLTEXT CATALOG Customer_FullText WITH ACCENT_SENSITIVITY = OFFdeclare @sql varchar(max)Declare @CONSTRAINT_NAME varchar (256)SELECT @CONSTRAINT_NAME=KU.CONSTRAINT_NAMEFROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TCINNER JOININFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KUON TC.CONSTRAINT_TYPE = 'PRIMARY KEY' ANDTC.CONSTRAINT_NAME = KU.CONSTRAINT_NAME ANDKU.table_name='tmp_customer'ORDER BY KU.TABLE_NAME, KU.ORDINAL_POSITION--BUILD Dynamic SQLset @sql='CREATE FULLTEXT INDEX ON tmp_customer(EmailLanguage 1033,FullnameLanguage 1033,FulladdressLanguage 1033)KEY INDEX ' + @CONSTRAINT_NAME + 'ON Customer_FullTextWITH STOPLIST = OFF-- SEARCH PROPERTY LIST = OFF'EXEC (@sql)--insert Customer data created during ETLINSERT INTO tmp_Customer( CID, FirstName, SurName, Address1, Address2, Address3, Address4, Address5, Title, Sex, DOB, Fulladdress, email, Mobile, Fullname)SELECT CID, FirstName, SurName, Address1, Address2, Address3, Address4, Address5, Title, Sex, DOB, Fulladdress, email, Mobile, FullnameFROM Customer P WHERE NOT EXISTS (SELECT NULL FROM tmp_Customer F WHERE P.CID = F.CID)--Finally Drop and Rename tableIF OBJECT_ID('dbo.Customer', 'U') IS NOT NULL DROP TABLE dbo.Customer;EXEC sp_rename 'tmp_customer', 'Customer'

原文地址:https://www.codeproject.com/Tips/5062305/Busy-Production-Database-update-without-timeout

生产数据库更新忙,没有超时相关推荐

  1. pd 生成mysql 脚本_PowerDesigner 如何生成数据库更新脚本

    最近在学习使用PowerDesigner 这个数据库设计工具,发现真的很强大,可以做很多事情,其中就涉及到如果数据库要进行更新了怎么办,主要是增加表,最麻烦的是修改字段名称,增加字段等操作,遇到主要的 ...

  2. 微软ASP.NET站点部署指南(11):部署SQL Server数据库更新

    1. 综述 本章节展示的是如何向完整版SQL Server 数据库部署一个数据库升级.与第9章的数据库升级部署有所不同(第9章是部署到SQL Server Compact数据库). 提醒:如果根据本章 ...

  3. 【数据库】达梦数据库更新key文件

    达梦数据库更新key文件 情景 当达梦数据库连接报错,显示网络异常连接异常/超时,可能是授权文件dm.key过期了 查看日志文件:/home/dmdba/dmdbms/log/dm_DMSERVER_ ...

  4. mysql reorg_生产数据库性能优化之reorg和表重建

    生产数据库的性能调优是一个系统的工程,它不仅要求DBA熟悉db2的工作原理和各种性能指标,还要求DBA也要熟悉操作系统.存储等其他知识,甚至要求DBA熟悉应用的设计原理以及它使用数据库的方式等.这里, ...

  5. laravel mysql超时时间_连接到数据库时Laravel连接超时

    我将应用程序从我的开发机器移动到测试服务器.连接到我的本地开发mysql数据库时,一切都按预期工作.尝试连接到我们的测试服务器时,请求超时45秒后返回500错误.连接到数据库时Laravel连接超时 ...

  6. python 魔兽世界升级脚本_Python 实现数据库更新脚本的生成方法

    我在工作的时候,在测试环境下使用的数据库跟生产环境的数据库不一致,当我们的测试环境下的数据库完成测试准备更新到生产环境上的数据库时候,需要准备更新脚本,真是一不小心没记下来就会忘了改了哪里,哪里添加了 ...

  7. 【邮件】生产数据库优化第一步:重建索引

    各位:     昨天晚上经过3个多小时的索引重建工作,重建后索引空间占用缩小为原来的1/10,可见咱们系统的索引效率已经低到不能再低的地步,在数据库压力大的结果中起到了不可推卸的责任.     同时, ...

  8. 【心塞】因为一个低级错误,生产数据库崩溃了将近半个小时

    [欢迎关注微信公众号:厦门微思网络] 反常的sql语句 上周四午休时分,我正在工位上小憩,睡梦中仿佛看到了自己拿着李白在荣耀峡谷里大杀四方的情景,就在我刚拿完五杀准备带领队友推对面水晶的时候,一句慌乱 ...

  9. 悬崖边上的舞者,记7.2生产数据库灾难事件

    悬崖边上的舞者,记7.2生产数据库灾难事件 作者:张子良 版权所有,转载请注明出处 引子:出事了 7月2日是一个难得的大晴天,一段时间以来桂林一直在下雨,一直下,害的我减肥的计划一再的泡汤,因为下雨每 ...

最新文章

  1. [usb]usb otg和host
  2. Ecplise中配置Tomcat7服务器
  3. NHibernate初学者指南(6):映射模型到数据库之方式二
  4. TypeError: rose() takes 0 positional arguments but 1 was given--python报错
  5. Kubernetes 1.9集群使用traefik发布服务
  6. 性能测试用例(转载)
  7. 在C#中用RX库和await来实现直观的状态机
  8. c#中params关键字应用
  9. 英特尔加入 GPU 战局,终用上 6nm 工艺?
  10. POJ 3597 Polygon Division (DP)
  11. php恒等符,PHP基础-运算符
  12. unity3D一些教程
  13. 局域网中文件共享方案介绍(Win10版)
  14. 浪涌测试仪的工作原理
  15. FPGA学习: Verilog刷题记录(16)
  16. mongo数据库集合导出
  17. 字符串包含单引号加上mybitis${}写法引发的plese exclude tableName or statementId异常
  18. Colab 快速上传数据集方法
  19. autoware 1.14 lgvsl simulator仿真
  20. 解决eclipse中java各类中文乱码问题

热门文章

  1. MySQL回放_mysql回顾
  2. 平安夜海报PNG免扣素材来了,全都在这|搜图114
  3. 新拟物素材|UI设计领域必掌握的要领!
  4. 变量命名规则_Java变量与常量
  5. nginx https透明代理_nginx正向https代理配置
  6. java程序设计_Java程序设计--final(笔记)
  7. C++简单的下载文件操作的封装
  8. 数据平面开发套件(DPDK)中的Vhost / Virtio的配置和性能
  9. LLVM每日谈 | 知乎
  10. DPDK多线程:EAL pthread和lcore Affinity(F-Stack配置文件的配置参数:lcore_mask、lcore_list)