Answers:
在过去的几年中,我交换了在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资源管理器中内置了许多自省功能,但仍然值得您了解数据字典的方式。它不区分ALL
,USER
并DBA
享有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代理:一种作业计划实用程序,可以运行另一种的定期作业。
TRUNCATE TABLE ...
与DML并排运行,而不必执行与相同的操作EXECUTE IMMEDIATE
。在T-SQL中,还可以SELECT
与其他操作一起使用将结果集返回给客户端,而在PL / SQL中,必须将SELECT
s 的输出定向到表或其他目标中。在Oracle中,只有纯SQL才能将结果集返回给客户端。
我们的主要产品可同时在SQL Server和Oracle上运行,以下是我们必须解决的其他一些差异,请记住以下几点可能是个好主意:
日期时间处理方式非常不同:精度不同,要使用的功能集不同
空字符串在Oracle中是NULL,在SQL Server中不是
字符编码和Unicode的处理方式非常不同。在SQL Server中,您可以在同一个数据库中混合使用normal(varchar
)或Unicode(nvarchar
)列,而在Oracle中,您可以在数据库级别上决定使用哪种编码。