作为一名DBA,我将如何从Oracle过渡到SQL Server?


Answers:


49

在过去的几年中,我交换了在Oracle和SQL Server上的工作,并撰写了另一篇文章 存在许多惯用和体系结构上的差异,每种产品的供应商和开发人员/ DBA社区对术语的使用方式也有所不同。

物理架构

SQL Server组织的各种事情与Oracle有所不同,并且具有一两个关键概念,这些概念在Oracle中没有直接的相似之处。

  • “数据库”是SQL Server中的一个单独项目,具有其自己的用户权限,架构/名称空间和存储。如果您熟悉Sybase,由于产品的共同来源,它们的作用与Sybase中的数据库相同。

  • 尽管文件组在数据库本地,但它们大致相当于表空间。

  • 模式是不同于SQL Server中数据库用户的概念,尽管用户可以具有默认模式。

  • MVCC在SQL Server中的工作方式有些不同。这是一项相对较新的功能,可以维持行的不同副本,直到释放旧版本的锁为止。SQL Server没有直接等同于回滚段的功能。默认情况下,它在SQL Server数据库上不处于活动状态。

  • Tempdb在SQL Server中使用更多。系统将其用于临时表和中间联接结果。稍后更多关于tempdb的信息。

  • 表分区比Oracle笨拙一些。您需要设置一个分区函数,从提供的内容中创建一个分区键,然后在该分区函数上创建一个分区方案。分区方案的行为有点像文件组,因为您随后在分区方案上创建了表。

    切入和切出分区要求您在正确的结构中的空表上设置约束。该约束保证分区键值适合于您打算交换到其中的分区。

  • 物化视图在SQL Server中称为索引视图。该GROUP BY子句确实有一个CUBE运算符,并且文档暗示了查询重写功能。但是,此功能没有很好的文档记录,可能还不够成熟。YMMV。

  • 尽管SQL Server支持通过XA或OLEDB事务协议进行两阶段提交,但它不支持自主事务。

  • 聚集索引与Oracle中按索引排序的表略有不同,因为它们不需要表中的所有列都可以参与聚集索引。与Oracle中的IOT相比,它们在SQL Server体系结构中的使用要广泛得多。

  • SQL Server确实支持覆盖索引,但没有联接索引。不支持位图索引,尽管它确实具有索引交集/星型转换运算符,该运算符可以计算交集而无需访问事实表。

  • 序列是SQL Server的相对较新的功能。传统上,自动递增密钥是通过标识列来完成的。您可以通过将值加载到标识列中set identity_insert on

程式设计

惯用的T-SQL与惯用的PL / SQL有一些区别。它的工作方式足够不同,因此一些范式上的差异值得更深入地解释。

  • T-SQL没有包的概念。数据库中的所有存储过程和函数都位于一个公共的名称空间中,尽管可以使用模式来分解它,并且该名称空间对于数据库而言是本地的。

  • 了解如何使用临时表,和SELECT INTO。碰到实际上需要游标的T-SQL代码非常罕见;临时表允许将操作分解为可以通过设置操作完成的步骤。 SELECT INTO在tempdb中,最少记录日志,并且在用户数据库的某些恢复模式下也最少记录日志,因此它与保留中间联接结果的查询运算符一样快。

    惯用的T-SQL将使用临时表,其作用类似于PL / SQL中的游标变量,但将更多地使用set操作。但是,临时表可以编写相当钝的代码,因此请谨慎使用。

  • 系统数据字典比Oracle较旧版本的字典更晦涩难懂,但在SQL Server 2005中却变得更好。尽管Microsoft提供的工具在SSMS资源管理器中内置了许多自省功能,但仍然值得您了解数据字典的方式。它不区分ALLUSERDBA享有DB的对象,虽然。

  • SSMS具有内置的查询计划查看器。

  • T-SQL代码中的标识符可以用[]引起来,并且如果引起来可以包含各种垃圾。但是,如果我们发现您称其为“直接/转移”列,则会将您的肠子撕掉。

  • SQL Server确实具有窗口功能(自2005 IIRC起),因此您现在可以在组内进行排序,运行求和等。

  • CONNECT BY尽管可以通过递归CTE进行递归,但T-SQL没有直接等价于。

  • 如果您需要编写跨数据库跳转的代码(与数据库中的架构相对),请考虑使用公共同义词将对象别名为本地对象,并在代码中引用别名。这避免了对数据库名称的硬编码依赖性。

  • 如果避免对数据库名称进行硬编码依赖性,那么使用数据库可以很容易地在同一服务器上维护多个环境。

  • 有些事情(例如自定义聚合函数)只能使用CLR sprocs实现。另外,如果您想逃避事务上下文(例如,伪造自主事务以进行防回滚错误日志记录),则可以使用CLR proc,因为它可以在当前事务上下文之外创建本地连接。

安全

登录名是在SQL Server实例级别定义的,但是每个登录名都以“数据库用户”的身份映射到零个或多个数据库。权限可以同时分配给“登录”(服务器)和“用户”(数据库),但是在数据库中通常使用“角色”。用户属于角色,权限分配给角色。SQL Server 2012添加了“服务器角色”。

  • SQL Server 2012引入了一个称为“部分包含的数据库”的概念,该概念允许将用户和角色信息保留在该数据库的本地。

  • 在数据库中,用户和架构的概念是分开的。可以将用户或角色分配给架构,并且架构拥有数据库对象。

  • Windows身份验证使用幕后的登录信息来对计算机或域上的用户进行SQL Server登录身份验证。IIRC支持此功能是Oracle上的可选附加功能。

  • 特殊角色“ dbo”(“数据库所有者”的缩写)在特定数据库内具有某种超级用户特权。每个数据库都具有“ dbo”角色,并且可以在给定数据库上为用户分配“ dbo”角色。

  • 还有一个默认的“ dbo”模式。对象可能由dbo模式拥有-由具有'dbo'角色(或系统范围的管理员权限)的用户创建的对象将默认为'dbo'模式拥有,除非明确提供了另一个模式。

  • 安全信息不会与单个数据库的备份一起保存。用户和角色必须在将备份还原到的服务器上明确配置。SQL Server 2012允许使用新的“部分包含的数据库”功能将用户和角色数据保留在本地数据库中。

  • 在SQL Server 2005中,可以在调用者,创建者,拥有架构或指定用户的安全上下文中执行存储过程。

  • 在SQL Server上的视图中,对基础表的权限基于拥有该视图的架构的权限。尽管视图定义可以包括从会话中获取信息的过滤器,但是对基础表的用户权限不参与安全性。在Oracle中,对基础表的用户权限可能会影响视图,具体取决于授予的配置。

监视和调整

TBA-Oracle中的内存架构与SGA等

备份与恢复

待定

工装

Microsoft将一组周围的工具与SQL Server捆绑在一起。提供的一些主要物品是:

  • SQL Server Management Studio(SSMS):与Oracle上的SQL Developer相似,它提供了编辑器和代码执行功能。一些有用的功能包括数据库对象浏览器和查询计划查看器。

  • SQL Server Analysis Services(SSAS):这是与数据库服务器不同的OLAP服务器。它使用自己的查询语言(MDX)和API(XML / A)进行客户端-服务器通信。无法使用SQL查询。SSMS具有用于编辑MDX和原始XMLA查询并显示结果的功能。还提供了一个名为ASCMD.EXE的命令行查询工具。

  • SQL Server Reporting Services(SSRS):这是用于发布报告的基于Web的报告工具。报表可以通过BI Development Studio(BIDS)或报表生成器构建,并发布到Web门户。SSRS服务器本身具有用于以编程方式管理服务器的Web服务API。请注意,SSRS报告可以使用各种来源的数据,而不仅仅是SQL Server。提供了一个称为RS.EXE的命令行工具,用于以编程方式管理SSRS服务器。

  • SQL Server集成服务(SSIS):这是SQL Server随附的ETL工具。在体系结构上,它与OWB或ODI完全不同,因为它不是代码生成工具。运行时位于客户端,可以在与数据库服务器不同的机器上。可以使用BIDS开发SSIS包,并使用称为DTEXEC.EXE的命令行工具独立执行。

  • BI Development Studio(BIDS):这是一个基于视觉工作室的环境,用于开发报表,SSIS包和SSAS多维数据集。如果安装了其他基于VS的开发工具(例如VS Professional),则可以将该工具集成到单个环境和通用项目组中。

  • 批量复制(BCP):类似于SQL * Loader的命令行批量插入/提取工具

  • SQLCMD:类似于SQL * plus的命令行查询工具

  • SQL Profiler:一种跟踪和分析工具,可以捕获和评估来自SQL Server,SSAS和套件中其他工具的跟踪信息。

  • SQL Server代理:一种作业计划实用程序,可以运行另一种的定期作业。


1
在T-SQL与PL / SQL上:T-SQL没有像PL / SQL一样的编程环境,因此您可以自由地混合使用纯SQL和T-SQL语句。例如,您可以TRUNCATE TABLE ...与DML并排运行,不必执行与相同的操作EXECUTE IMMEDIATE。在T-SQL中,还可以SELECT与其他操作一起使用将结果集返回给客户端,而在PL / SQL中,必须SELECTs 的输出定向到表或其他目标中。在Oracle中,只有纯SQL才能将结果集返回给客户端。
Nick Chammas 2012年

1
还请注意,名称以“ sp_”开头的存储过程将得到特殊处理。除非要从较新版本的SQL Server反向移植系统过程,否则不要这样命名存储的过程。您可以从技术上利用它创建数据库范围的存储过程,但是不建议这样做,因为将来的版本可能会创建一个具有相同名称的新系统存储过程。
凯文·卡斯卡特

1
值得在这里添加一些有关锁升级的信息吗?我认为它会作为一个惊喜,以5月甲骨文民间用于无限的行级锁
杰克·道格拉斯

8

我们的主要产品可同时在SQL Server和Oracle上运行,以下是我们必须解决的其他一些差异,请记住以下几点可能是个好主意:

  • 日期时间处理方式非常不同:精度不同,要使用的功能集不同

  • 空字符串在Oracle中是NULL,在SQL Server中不是

  • 字符编码和Unicode的处理方式非常不同。在SQL Server中,您可以在同一个数据库中混合使用normal(varchar)或Unicode(nvarchar)列,而在Oracle中,您可以在数据库级别上决定使用哪种编码。


Oracle还允许将char / varchar2和nchar / nvarchar2类型混合使用两种不同的编码-请参见Unicode字符可以两种方式存储在Oracle数据库中
George3'3
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.