oracle和sqlserver优化,SQLServer 和 Oracle 的性能差别这么大吗?

发现执行计划是不同的,

SQLServer 采用的是 Nested Loops

Oracle 采用的是 Hash Join

如何能强制SQLServer 采用Hash Join 呢

-----------------------------------------------------------------------

select *

from stud t, students s

where t.no = s.no

or t.sname = s.no

or t.no = s.sname

or t.sname = s.sname

OPTION (HASH JOIN);

资料

Transact-SQL 参考

OPTION 子句

指定应在整个查询中使用所指定的查询提示。每个查询提示只能指定一次,但允许指定多个查询提示。用该语句只可能指定一个 OPTION 子句。查询提示影响语句中的所有运算符。如果主查询中涉及 UNION,则只有涉及 UNION 运算符的最后一个查询可以有 OPTION 子句。如果一个或多个查询提示导致查询优化器不生成有效计划,则产生 8622 号错误。

注意  查询优化器通常为查询选择最佳执行计划,因此建议有经验的数据库管理员将 、 和 仅作为最后的手段。

语法

[ OPTION ( < query_hint > [ ,...n ) ]

< query_hint > ::=

{    { HASH | ORDER } GROUP

| { CONCAT | HASH | MERGE } UNION

| {LOOP | MERGE | HASH } JOIN

| FAST number_rows

| FORCE ORDER

| MAXDOP number

| ROBUST PLAN

| KEEP PLAN

| KEEPFIXED PLAN

| EXPAND VIEWS

}

参数

{ HASH | ORDER } GROUP

指定在 GROUP BY、DISTINCT 或 COMPUTE 查询子句中所描述的聚合应使用哈希操作或排列。

{ MERGE | HASH | CONCAT } UNION

指定由合并、哈希或串联 UNION 集合执行所有 UNION 运算。如果指定了不止一个 UNION 提示,查询优化器就会从这些指定的提示中选择开销最少的策略。

{ LOOP | MERGE | HASH } JOIN

指定在整个查询中所有的联接操作由循环联接、合并联接或哈希联接来完成。如果指定了多个联接提示,则优化器从允许的联接策略中选择最便宜的联接策略。

如果在同一个查询中,还为一对特定的表指定了联接提示,则虽然仍须遵守查询提示,但该联接提示将优先联接这两个表。因此,为这对表指定的联接提示可能只限制选择查询提示中允许的联接方法。有关详细信息,请参见提示。

FAST number_rows

指定对查询进行优化,以便快速检索第一个 number_rows(非负整数)。在第一个 number_rows 返回后,查询继续进行并生成完整的结果集。

FORCE ORDER

指定在查询优化过程中保持由查询语法表示的联接顺序。

MAXDOP number

只对指定了 sp_configure 的 max degree of parallelism 配置选项的查询替代该选项。当使用 MAXDOP 查询提示时,所有和 max degree of parallelism 配置选项一起使用的语义规则均适用。有关更多信息,请参见 max degree of parallelism 选项。

ROBUST PLAN

强制查询优化器以性能为代价,使用对最大可能的行大小有效的计划。处理查询时,中间级表和运算符可能需要存储和处理比输入行宽的行。在有些情况下,行可能很宽,以致某个运算符无法处理行。如果发生这种情况,SQL Server 将在查询执行过程中生成错误。通过使用 ROBUST PLAN,可以指示查询优化器不考虑可能会遇到该问题的查询计划。

KEEP PLAN

强制查询优化器对查询放宽估计的重新编译阈值。估计的重新编译阈值是一个点,基于该点当对表的索引列更改(更新、删除或插入)达到估计的数字时自动重新编译查询。指定 KEEP PLAN 将确保当表有多个更新时不会频繁地对查询进行重新编译。

KEEPFIXED PLAN

强制查询优化器不因统计中的更改或索引列(更新、删除或插入)而重新编译查询。指定 KEEPFIXED PLAN 将确保仅当更改基础表的架构或在那些表上执行 sp_recompile 时才重新编译查询。

EXPAND VIEWS

指定展开索引视图,而且查询优化器不将任何索引视图看作是查询中任何部分的替代。(当视图名称由查询文本中的视图定义替换时,视图将展开。)实际上,该查询提示不允许在查询计划中直接使用索引视图和直接在索引视图上使用索引。

只有在查询的 SELECT 部分中直接引用视图,而且指定 WITH (NOEXPAND) 或 WITH(NOEXPAND、INDEX( index_val [ ,...n ] )),才会展开索引视图。有关查询提示 WITH (NOEXPAND) 的更多信息,请参见 FROM。

只有语句的 SELECT 部分的视图(包括 INSERT、UPDATE 和 DELETE 语句中的视图)才受提示影响。

注释

SELECT 语句中的子句顺序非常重要。可以省略可选子句,但这些子句在使用时必须按适当的顺序出现。

只有当这些语句的选择列表包含给函数的局域变量赋值的表达式时,在用户定义的函数中才允许有 SELECT 语句。

在 table 变量的作用域内,可以像访问常规表那样访问 table 变量,因此可以在 SELECT 语句内将 table 变量作为表源使用。

对于由四部分组成的名称,若其中的服务器名称使用的是 OPENDATASOURCE 函数,则该名称可以在表名能够在 SELECT 语句内出现的任何位置作为表源使用。

对涉及远程表的 SELECT 语句有一些语法限制。有关更多信息,请参见外部数据和 Transact-SQL。

选择列表内包含的text 或 ntext 列的返回长度默认为最小的 text 实际大小、默认的 TEXTSIZE 会话设置或硬编码应用程序限制。若要更改会话的返回文本长度,请使用 SET 语句。默认情况下,用 SELECT 语句返回的文本数据的长度限制是 4,000 字节。

如果发生下列两种情况中的一种,SQL Server 将生成编号为 511 的异常错误并回滚当前执行的语句:

SELECT 语句生成超过 8,060 字节的结果行或中间级工作表。

试图对超过 8,060 字节的行执行 DELETE、INSERT 或 UPDATE 语句。

在 SQL Server 中,如果没有为 SELECT INTO 或 CREATE VIEW 语句创建的列提供列名,将会发生错误。

选择标识列

将现有标识列选入新表时,新列将继承 IDENTITY 属性,除非下列条件中的一个为真:

SELECT 语句包含联接、GROUP BY 子句或聚合函数。

多个 SELECT 语句由 UNION 联接。

标识列在选择列表内多次列出。

标识列是表达式的一部分。

如果这些条件中的一个为真,列将被创建为 NOT NULL 而不继承 IDENTITY 属性。所有用于标识列的规则和限制均适用于新表。

旧式外联接

SQL Server 的早期版本支持在 WHERE 子句中使用 *= 和 =* 运算符定义外联接。SQL Server 7.0 版支持 SQL-92 标准,该标准在 FROM 子句中提供联接运算符。建议使用 SQL-92 语法重新编写查询。

WHERE、GROUP BY 和 HAVING 子句的处理顺序

下表显示带 WHERE 子句、GROUP BY 子句和 HAVING 子句的 SELECT 语句的处理顺序:

WHERE 子句排除不满足搜索条件的行。

GROUP BY 子句将选定的行收集到 GROUP BY 子句中各唯一值的组中。

在选择列表中指定的聚合函数计算各组的汇总值。

HAVING 子句进一步排除不满足搜索条件的行。

权限

SELECT 权限默认授予 sysadmin 固定服务器角色成员、db_owner 和 db_datareader 固定数据库角色的成员以及表的所有者。sysadmin、db_owner 和 db_securityadmin 角色的成员和表所有者可以将权限转让给其他用户。

如果用 INTO 子句创建永久表,用户必须在目的数据库中具有 CREATE TABLE 权限。

请参见

CONTAINS

CONTAINSTABLE

CREATE TRIGGER

CREATE VIEW

DELETE

EXECUTE

表达式

FREETEXT

FREETEXTTABLE

对 SQL Server 数据进行全文查询

INSERT

联接基础知识

SET TRANSACTION ISOLATION LEVEL

sp_dboption

子查询基础知识

table

UNION

UPDATE

使用变量和参数

WHERE

©1988-2000 Microsoft Corporation。保留所有权利。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一般的公司通常会在他们的信息系统架构中引入多种数据库平台,同时引入三到四种不同的RDBMS览决方案的中大型公司 也并丌少见,当然返些公司里面的DBA们通常也需要 同时拥有管理多种丌同平台的技能了。 叧在一种平台上展开工作的数据库与家们也通常会期待着在他们的下一仹工作中能学到点不一样的东西,那些有勇气的人们则愿意花时间、金钱和精力去学习 新的东西,也有其他因为换了新公司戒者是为了找新的工作而去学习新的系统的人们,毋庸置疑的一点就是公司老板和人力与家们会更加青睐亍那些拥有多个领域经 验的求职者。 依我个人的经验来看,在学习一个新的数据平台的时候,最好的方法就是在新的环境中去収现那些你已知的东西,返样学习起来会简单徆多。当然,当中也会 遇到一些全新的概念需要去学习,戒者是忘掉一些你现在已知的概念,但不管怎举说你丌是从零开始的。比如说一个做SQL Server开収人员在要写Oracle存储过程的时候可能会先去找那些内置的函数然后比较它们之间不同点,她也可能会去比较发量声明以及错误处理的异同。 本系列文章中我将尝试对Microsoft SQL Server和Oracle RDBMS(以10g及以后的版本为主)进行一个深入的比较。我会主要集中亍返两种数据库乀间架构上的比较,当然不要期望我会给你一个详尽的比较清单,但是我会尽我所能的让你看清返两种当今世上应用最广的数据库之间的相同和相异乀处。本文是以一个SQL Server DBA的觇度去构思和写作的,不过相信返对Oracle与家门了览SQL Server返一面也是徆有参考价值的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值