我是同时具有Sybase经验的Oracle DBA。

两个RDBMS平台之间的主要体系结构和概念区别是什么?

与SQL Server类似的答案- > Oracle问题在这里最有用。

评论

有点幽默(对不起,如果是OT),你见过吗? dba.stackexchange.com/questions/9765/…

#1 楼

在过去的几年中,我在甲骨文和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中的索引排序表略有不同,因为它们不t要求表中的所有列都参与聚簇索引。与Oracle中的IOT相比,它们在SQL Server体系结构中的使用要广泛得多。
SQL Server确实支持覆盖索引,但是没有联接索引。不支持位图索引,尽管它确实具有索引交集/星型转换运算符,该运算符可以计算交集而无需访问事实表。
序列是SQL Server的较新功能。传统上,自动递增密钥是通过标识列来完成的。您可以通过set identity_insert on将值加载到标识列中。

编程

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


T-SQL没有包的概念。数据库中的所有存储过程和函数都位于一个公用的名称空间中,尽管可以使用模式来解决这个问题,并且该名称空间对于数据库而言是本地的。
感受一下如何使用临时表SELECT INTO。很少碰到实际需要游标的T-SQL代码。临时表允许将操作分解为可以通过设置操作完成的步骤。 tempdb中的SELECT INTO最少记录,并且在某些恢复模式下也最少记录在用户数据库上,因此它与保留中间连接结果的查询运算符一样快。惯用的T-SQL将使用temp表角色,您将在PL / SQL中看到游标变量,但将更多地使用set操作。但是,临时表可以使代码变得相当晦涩难懂,因此请谨慎使用。
系统数据字典比旧版本中的Oracle钝化得多,但在SQL Server 2005中却变得更好。微软在SSMS资源管理器中内置了很多自省功能,仍然值得了解数据字典。不过,它无法区分数据库对象的ALLUSERDBA视图。
SSMS内置了查询计划查看器。
T-SQL代码中的标识符可以用[]引起来,并且如果引用,则可以包含各种垃圾。但是,如果我们发现您称其为“直接/转移”列,则会将您的肠子撕掉。
SQL Server确实具有窗口函数(自2005 IIRC起),因此您现在可以在组内进行排序,运行求和等。
T-SQL没有直接等效于CONNECT BY的功能,尽管可以通过递归来完成递归CTE。
如果您需要编写跨数据库跳转的代码(与数据库中的架构相对),请考虑使用公共同义词将对象别名为本地对象,并在代码中引用别名。这样可以避免对数据库名称的硬编码依赖性。
如果避免对数据库名称的硬编码依赖性,那么使用数据库可以很容易地在同一服务器上维护多个环境。
有些事情(例如自定义聚合函数)只能使用CLR sprocs实现。另外,如果您想逃避事务上下文(例如,伪造自主事务以进行防回滚错误日志记录),则可以使用CLR sproc,因为它可以在当前事务上下文之外创建本地连接。

安全性

登录是在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-内存体系结构与SGA等。在oracle中

备份和恢复
TBA

工具

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的命令行工具独立执行SSIS包。
B.I. Development Studio(BIDS):这是一个基于视觉工作室的环境,用于开发报告,SSIS包和SSAS多维数据集。如果安装了其他基于VS的开发工具(例如VS Professional),则该工具可以集成到单个环境和通用项目分组中。
大容量复制(BCP):类似于SQL *的命令行大容量插入/提取工具加载程序
SQLCMD:类似于SQL * plus的命令行查询工具
SQL Profiler:一种跟踪和分析工具,可以捕获和评估来自SQL Server,SSAS和套件中其他工具的跟踪信息。 /> SQL Server代理:一种作业计划实用程序,可以运行另一种定期作业。


评论


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

–尼克·查玛斯(Nick Chammas)
2012年4月23日在16:14

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

–凯文·卡斯卡特(Kevin Cathcart)
2012年4月23日在18:09

值得在这里添加一些有关锁升级的信息吗?我认为Oracle员工习惯于使用无限的行级锁会感到惊讶

–杰克·道格拉斯(Jack Douglas)
14年7月16日在17:24

#2 楼

我们的主要产品可同时在SQL Server和Oracle上运行,这是我们必须解决的其他一些差异,因此可能需要牢记:


日期处理非常不同:精度不同,要使用的函数集不同
空字符串在Oracle中为NULL,在SQL Server中为空。
字符编码和Unicode的处理方式非常不同。在SQL Server中,您可以在同一数据库中混合使用普通(varchar)或Unicode(nvarchar)列,在Oracle中,您可以在数据库级别决定使用哪种编码。


评论


Oracle还允许将char / varchar2和nchar / nvarchar2类型混合使用两种不同的编码-请参见Unicode字符可以两种方式存储在Oracle数据库中。

–George3
2012年11月17日在21:12