AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 16884
Accepted
Philᵀᴹ
Philᵀᴹ
Asked: 2012-04-24 01:47:57 +0800 CST2012-04-24 01:47:57 +0800 CST 2012-04-24 01:47:57 +0800 CST

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

  • 772

我是一名 Oracle DBA,也有 Sybase 经验。

两个 RDBMS 平台之间的主要架构和概念差异是什么?

类似于此处的 SQL Server->Oracle 问题的答案将是最有用的。

sql-server oracle
  • 2 2 个回答
  • 5908 Views

2 个回答

  • Voted
  1. Best Answer
    ConcernedOfTunbridgeWells
    2012-04-24T03:01:04+08:002012-04-24T03:01:04+08:00

    在过去的几年里,我在 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 中的索引排序表略有不同,因为它们不需要表中的所有列都参与聚集索引。它们在 SQL Server 体系结构中的使用比在 Oracle 中的 IOT 更广泛。

    • 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 中看到游标变量,但会更多地使用集合操作。但是,临时表可能会产生相当迟钝的代码,因此请谨慎使用。

    • 系统数据字典在旧版本上比 Oracle 的字典要迟钝得多,但在 SQL Server 2005 上变得更好。虽然 Microsoft 提供的工具在 SSMS 资源管理器中内置了很多自省内容,但仍然值得了解您的绕过数据字典。但是,它不区分ALL,USER和DBADB 对象的视图。

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

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

    • SQL Server 确实具有窗口函数(自 2005 IIRC 以来),因此您现在可以在组内进行排序、运行总和等。

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

    • 如果您需要编写跨数据库(而不是数据库中的模式)的代码,请考虑使用公共同义词将对象别名为本地对象并引用代码中的别名。这避免了对数据库名称的硬编码依赖。

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

    • 有些东西,比如自定义聚合函数,只能使用 CLR sprocs 来实现。此外,如果您想从事务上下文中逃脱(例如,伪造一个自治事务以进行防回滚错误日志记录),您可以使用 CLR 存储过程,因为它可以在当前事务上下文之外创建本地连接。

    安全

    登录是在 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) 或 Report Builder 构建,并发布到 Web 门户。SSRS 服务器本身具有用于以编程方式管理服务器的 Web 服务 API。请注意,SSRS 报告可以使用来自各种来源的数据,而不仅仅是 SQL Server。提供了一个名为 RS.EXE 的命令行工具,用于以编程方式管理 SSRS 服务器。

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

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

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

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

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

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

    • 52
  2. MiMo
    2012-05-10T05:34:57+08:002012-05-10T05:34:57+08:00

    我们的主要产品适用于 SQL Server 和 Oracle,以下是我们必须解决的其他一些差异,请记住:

    • 日期时间处理非常不同:不同的精度,不同的函数集

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

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

    • 8

相关问题

  • ORDER BY 使用文本列的自定义优先级

  • 舒服的sqlplus界面?[关闭]

  • 如何在数据库中找到最新的 SQL 语句?

  • 如何使用正则表达式查询名称?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何查看 Oracle 中的数据库列表?

    • 8 个回答
  • Marko Smith

    mysql innodb_buffer_pool_size 应该有多大?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    从 .frm 和 .ibd 文件恢复表?

    • 10 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve