麒麟v10 上部署 TiDB v5.1.2 生产环境优化实践
719
2023-04-18
将Access数据库移植到***
在数据库的设计过程中经常要添加、删除数据库对象,这会使数据库内部留有许多碎片,不能有效地利用磁盘空间,文件会逐渐增大。这有点象文件系统经过多次的增删操作,会导致文件碎片,浪费磁盘空间,而且读写效率降低。 你可以用 Access 提供的工具来压缩数据库,它将重新安排数据库文件在磁盘中保存的位置,并释放磁盘空间,通常文件的容量会缩小成原来的几分之一。
Access 内置了压缩数据库的功能 但 Access 文件的增大十分夸张,它可能会让文件增大十倍,让它臃肿地呆在你的硬盘里。这好象是微软的通病。你可以打开一个Word文件,添加几个空格再把它们删了(实际文件的内容没有改变),然后保存,你会发现它比刚才大了些,比如一个45k的文件经过几次这样的更改后文件大小变成49.5k→58.5k→68.5k,实在不知道往文件里面又存了些什么。所以我们有理由怀疑 Access 数据库压缩的效果。 一年以前我编了一个统计系统,用了大概3个月,几乎每天都在修改,几天就压缩一次,最后这个 Mdb 文件有20M大,即使是 Mde 文件也有8M多,我乐坏了,以为自己也能设计大型程序了。今年这个程序要升级,可是源程序让我弄丢了(心疼呀),于是下定决心,重新编了一个。功能几乎没有变,最后的 Mdb 文件大小只有2M多,我的天!简直不敢相信!原来 Access 文件改动得越多压缩得越多文件就越大,什么逻辑! 还有,如果你的 Mdb 文件太大了,可以建立一个新的空数据库,把原来的数据库全部内容都导入到这个新数据库里,再看看,文件一定小了许多。我做了一个实验,一个640k的 Mdb 文件,压缩数据库后变成240k,再建一个新数据库,把它全部导入,就只有60k了。 当然,不论用上面什么方法,Mdb 文件还是非常松散的,用 Winzip 还能把它压缩好几倍,所以,如果你要把程序妹给朋友,记得最后还要用 Winzip 压缩,才不会浪费你的电话费!(出处:双胞胎工作室)
随着用户对于企业级高性能数据库的需求的增长,用户时常要从MicrosoftAccessJet引擎的文件-服务器环境下转换到MicrosoftSQLServer的客户-服务器环境。MicrosoftOffice2000中的Access2000UpsizingWizard可实现将数据表和查询转移到SQLServer7.0中。如果您用的是Access的较早的版本,您可以先将它升级为Access2000,然后再使用其中的UpsizingWizard,从而将您的应用移植到SQLServer中。
如果您并不太愿意采用Access2000和UpsizingWizard来实现移植,本文可以作为将Access2000移植到SQLServer的一个指南。转移一个Access上的应用首先需要将数据转移到SQLServer,然后将查询转移进数据库,或是转移为SQL文件以备稍后执行。最后要采取的步骤是移植应用程序。
数据库移植中用到的SQLServer工具
SQLServer管理器(SQLServerEnterpriseManager)
SQLServer管理器允许对SQLServer以及SQLServer中的对象进行企业级的配置和管理。SQLServer管理器提供一个强有力的scheduling引擎,高度的容错力和一个嵌入式的复制管理界面。使用SQLServer管理器可以实现以下功能:
管理连接和用户许可
创建脚本程序
管理SQLServer对象的备份
备份数据和事务处理日志
管理表、视图、存储过程、触发器、索引、规则、默认值以及用户定义的数据类型
建立全文本索引、数据库图表和数据库维护计划
输入和输出数据
转换数据
执行各种网络管理任务
在以MicrosoftWindowsNT为操作系统的计算机中,SQLServerManager由SQLServerSetup进行安装,并被默认为服务器组件,而在运行着WindowsNT和MicrosoftWindows95的机器上,它将被默认为客户方组件。您将从SQLServerManager的图形用户界面中启动数据转移服务(DTS,DataTransformationServices)。
数据转移服务(DataTransformationServices,DTS)
数据转移服务允许您在多种异构数据源之间输入和输出数据,这些数据源采用基于数据库的OLE体系结构;或在使用SQLServer7.0的多个计算机之间转移数据库和数据库对象;您还可以通过运用数据转移服务,更便捷地在一个在线事务处理系统(OLTP)中建立数据仓库和数据中心。
DTSWizard允许您交互地创建DTS包,通过OLEDB和ODBC来输入、输出、验证和转移数据。DTSWizard还允许您在关系型数据库之间拷贝图解(schema)和数据。
SQLServer查询分析器(QueryAnalyzer)
SQLServer查询分析器是一种图形化的查询工具,通过它您可以分析一个查询,同时执行多个查询,查看数据和获取索引建议。SQLServer查询分析器提供了showplan选项,可用来显示SQLServer查询优化器所选择的数据提取方法。
SQLServerProfiler
SQLServerProfiler可以实时地捕获数据库服务器活动的连续记录。SQLServerProfiler允许您监控SQLServer产生的事件,过滤基于用户指定标准的事件,或将操作步骤输出到屏幕、文件或数据表。运用SQLServerProfiler,您可以重新执行所捕获的上一次操作。这种工具可以帮助应用程序开发者识别那些可能会降低应用程序性能的事务处理。在将一个基于文件体系结构的应用程序移植到客户/服务器结构中时该特性是很有用的,因为它的最后一步包括对面向新的客户/服务器环境的应用程序进行优化。
转移表和数据
使用DTSWizard将您的Access数据转移到SQLServer,可采取以下步骤:
在“选择数据源”(ChooseaDataSource)的对话窗口中,选择MicrosoftAccess为数据源,然后输入您的.mdb文件名(mdb为文件扩展名)或者选择浏览文件。
移植MicrosoftAccess查询
您可以将Access的查询以下面的格式之一转移至SQLServer中:
事务处理SQL脚本程序(Transact-SQLscripts)
事务处理SQL语句通常是由数据库程序调用的,但是您也可以使用SQLServer7.0中包含的SQLServer查询分析器直接运行它们。SQLServer查询分析器可帮助开发者测试事务处理SQL语句,或运行那些执行查询处理、数据操作(插入,修改,删除)和数据定义(创建表)的事务处理SQL语句。
存储过程(Storedprocedures)
开发者可以将大部分产生自Access查询(查找,插入,修改,删除)的事务处理SQL语句转移至存储过程。用事务处理SQL语句书写的存储过程可以用来对您的数据存取打包,并使之标准化,而且存储过程实际上是存储在数据库中的。存储过程可以带参数,也可不带参数,可以由数据库程序调用或者由SQLServer查询分析器手动执行。
视图(Views)
视图是从一个或多个表中显示特定的行和列的虚拟表。它们允许用户可以不直接执行构成查询基础的复杂连接而建立查询。视图不支持参数的使用。连接多个数据表的视图不能用INSERT,UPDATE或DELETE语句来修改。视图由事务处理SQL语句调用,也可用于SQLServer查询分析器中运行的程序段。SQLServer视图和SQL-92标准不支持视图中的ORDERBY排序子句。如欲了解事务处理SQL,存储过程和视图的其他信息,请参阅SQLServer在线参考书。
Access查询类型的SQLServer移植选择与建议
一个SELECT语句可以存储在事务处理SQL文件、存储过程或是视图中。建立存储过程是将数据库应用开发与数据库设计的物理实施分开的最佳方法。存储过程可在一处创建而由应用程序调用。
如果存储过程所基于的数据库变化了,而存储过程经过仔细的修改以反应这些变化,则对存储过程的调用将不会受到破坏。
交叉表(CROSSTAB)
交叉表经常用于总结报表。
一个Access的交叉表可以通过SQL程序段、存储过程或视图中的事务处理SQL语句来执行。每当发出一个查询时,数据连接被重现执行以确保最近的数据得到使用。
根据实际应用情况,比较合适的方法是将交叉表中的数据存储为一个临时表(参考下面的MAKETABLE),临时表对资源的需求比较少,但是临时表在建立的同时只提供对数据的一个快照(snapshot)。
创建表(MAKETABLE)
Access中的“MAKETABLE”(创建表)可以通过事务处理SQL脚本程序或存储过程中的事务处理SQL语言的建表语句“CREATETABLE”来执行。语法如下所示:
SELECT[ALL|DISTINCT]
[{TOPinteger|TOPintegerPERCENT}[WITHTIES]]
[INTOnew_table]
[FROM{}[,…n]]
[WHERE]
[GROUPBY[ALL]group_by_expression[,…n]
[WITH{CUBE|ROLLUP}]
CREATETABLEmytable(lowint,highint)
UPDATE(修改)
UPDATE语句可以存储在事务_SQL脚本程序中,然而比较好地执行UPDATE语句的方法是创建一个存储过程。
APPEND(添加)
ALLEND语句可以存储在事务_SQL脚本程序中,然而比较好地执行APPEND语句的方法是创建一个存储过程。
移植MicrosoftAccess的查询到存储过程和视图
每个Access查询都必须用以下的一系列语句替换:
CREATEPROCEDUREAS
GO
CREATEVIEWAS
GO
对每个Access查询应执行:
打开Access,然后在SQLServer中,打开SQLServer查询分析器。
将整个查询粘贴到SQLServer查询分析器中。
测试语法,保存事务处理SQL语句以备后用,或者在数据库中执行这些语句。您可以选择将事务处理SQL语句保存到一段脚本程序中。
移植MicrosoftAccess查询到事务处理SQL语句
大部分的Access查询应该转换成存储过程和视图。然而,有一些应用程序开发者不太常用的语句可以存储为事务处理SQL脚本,一种以sql为文件扩展名的文本文件。这些文件可以在SQLServer查询分析器中运行。
如果您打算将一些Access查询转换为sql文件的话,可以考虑根据它们使用的方式有区别地将这些事务处理SQL语句分别放在几个脚本程序中。例如,您可以将必须以同样频率运行的事务处理SQL语句归类到同一个脚本中。另一个脚本中则应包含所有只在某些条件下运行的事务处理SQL语句。此外,必须以一定顺序执行的事务处理SQL语句应当归类到一个不连续的脚本中。
将Access语句转移到事务处理SQL文件
将语句拷贝到SQLServer查询分析器中
使用蓝色的多选项图标分析语句
在适当时候执行该语句
要执行Access中的创建表(MAKETABLE)的查询任务的开发者在SQLServer中有几种选择。开发者可创建下列对象之一:
一个视图
视图具有动态的虚拟表的效果,可提供最近的信息。这是一个输入/输出强化器,因为每当发出一个查询时它都要求对数据表重现建立连接。
一个临时表
临时表为已连接的用户会话建立一个快照。您可以建立局部的或全局的临时表。局部临时表只在当前会话中可见,而全局临时表则在所有会话都是可见的。在局部临时表的名字前加上单个数字的前缀((#table_name)),而在全局临时表的名字前加上两位数字的前缀(##table_name)。对临时表的查询执行起来非常快,因为它们取得一个结果集的时候通常只用一个表,而不是将多个表动态地连接在一起来。
如欲了解临时表的其他信息,请参阅SQLServer在线参考书。
SQLServer7.0中的数据转换服务(DTS)允许您通过创建包来实现临时表建立的标准化、自动化和进度安排。例如,当您移植Access2.0中的Northwind范例数据库时,用于季度数据报表的交叉表可转变为一个视图或者一个可在规范基础上建立临时表的数据转换。如欲了解关于DTS的其他信息,请参阅SQLServer在线参考书。
其他设计上的考虑
下面是当您将您的Access应用移植到SQLServer时必须考虑的一些其他问题:
使用参数
带参数的SQLServer存储过程需要一种不同于Access查询的语法格式,例如:
Access2.0格式:
查询名:EmployeeSalesByCountry,inNWIND.mdb:
PARAMETERS[BeginningDate]DateTime,[EndingDate]DateTime;
SELECTOrders.[OrderID],[LastName]&","&[FirstName]ASSalesperson,Employees.Country,Orders.[ShippedDate],[OrderSubtotals].SubtotalAS[SaleAmount]
FROMEmployeesINNERJOIN(OrdersINNERJOIN[OrderSubtotals]ONOrders.[OrderID]=[OrderSubtotals].[OrderID])ONEmployees.=Orders.
WHERE(((Orders.[ShippedDate])Between[BeginningDate]And[EndingDate]))
ORDERBY[LastName]&","&[FirstName],Employees.Country,Orders.[ShippedDate];
SQLServer7.0格式:
CREATEPROCEDUREEMP_SALES_BY_COUNTRY
@BeginningDatedatetime,
@EndingDatedatetime
AS
SELECTOrders.[OrderID],[LastName]+","+[FirstName]ASSalesperson,Employees.Country,
Orders.[ShippedDate],[OrderSubtotals].SubtotalAS[SaleAmount]
FROMEmployeesINNERJOIN(OrdersINNERJ
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。