网站首页 > 文章中心 > 其它

sqlserver位图

作者:小编 更新时间:2023-08-16 19:20:25 浏览量:10人看过

在sqlserver或oracle里可以创建QR树索引吗?如果可以的话,应该怎样建?

典型的无限分类,如果栏目实在太多,要避免一次读取所有栏目.每次只读需要的.字段多到还没见什么影响.记录多才影响速度,做好索引

当创建sybase表时不带索引,则使用堆结构存储表.可以为表创建一个聚簇索引和多个非聚簇索引.当为表创建聚簇索引时,表中数据以索引中键的顺序进行物理存储.对非聚簇索引,sybase只支持b-树结构.对每个索引,可指定填充因子和每页必须存储的行数,可以将单个的表和索引分布到不同的物理设备中去———实际上,可以将非聚簇表的索引页放在与其数据独立的物理设备上.也可以划分表,为表创建多个"页链".划分会减少对表的最后一页的访问,并允许对大型表操作时用并行i/o.

sqlserver 中 sys.columns 与 sys.all_columns 的区别?

syscolumns是sqlserver中的一个系统表,用来记录sqlserver中字段信息的.

SQLServer中SYSCOLUMNS表的各个字段的意义

列名 数据类型 描述

name sysname 列名或过程参数的名称.

id int 该列所属的表对象 ID,或与该参数关联的存储过程 ID.

xtype tinyint systypes 中的物理存储类型.

typestat tinyint 仅限内部使用.

xusertype smallint 扩展的用户定义数据类型 ID.

length smallint systypes 中的最大物理存储长度.

xprec tinyint 仅限内部使用.

xscale tinyint 仅限内部使用.

colid smallint 列或参数 ID.

xoffset smallint 仅限内部使用.

bITpos tinyint 仅限内部使用.

reserved tinyint 仅限内部使用.

colstat smallint 仅限内部使用.

cdefault int 该列的默认值 ID.

domain int 该列的规则或 CHECK 约束 ID.

number smallint 过程分组时(0 表示非过程项)的子过程号.

colorder smallint 仅限内部使用.

offset smallint 该列所在行的偏移量;如果为负,表示可变长度行.

SQLServer 和 Oracle 有什么区别?

ORACLE与SQL SERVER的区别

体系结构

ORACLE的文件体系结构为:

数据文件 .DBF (真实数据)

日志文件 .RDO

控制文件 .CTL

参数文件 .ORA

SQL SERVER的文件体系结构为:

.MDF (数据字典)

.NDF (数据文件)

.LDF (日志文件)

ORACLE存储结构:

在ORACLE里有两个块参数PCTFREE(填充因子)和PCTUSED(复用因子),可控制块确定块本身何时有,何时没有足够的空间接受新信息(对块的存储情况的分析机制)

这样可降低数据行连接与行迁移的可能性.块的大小可设置(OLTP块和DSS块)

在ORACLE中,将连续的块组成区,可动态分配区(区的分配可以是等额的也可以是自增长的)可减少空间分配次数

在ORACLEl里表可以分为多个段,段由多个区组成,每个段可指定分配在哪个表空间里(段的类型分为:数据段、索引段、回滚段、临时段、CASH段.ORACLE里还可对表进行分区,可按照用户定义的业务规则、条件或规范,物理的分开磁盘上的数据.

这样大大降低了磁盘争用的可能性.

ORACLE有七个基本表空间:

SYSTEM表空间(存放数据字典和数据管理自身所需的信息)

RBS回滚表空间

TEMP临时表空间

TOOLS交互式表空间

USERS用户默认表空间

INDX索引表空间

DBSYS福数据表空间

不同的数据分别放在不同的表空间(数据字典与真实数据分开存放),在ORACLE里基表(存储系统参数信息)是加密存储,任何人都无法访问.只能通过用户可视视图查看.

SQL SERVER 存储结构

SQL SERVER有五个基本数据库:

master(数据字典)

mode(存放样版)

tempdb(临时数据库)

msdb(存放调度信息和日志信息)

pubs(示例数据库)

真实数据与数据字典存放在一起.对系统参数信息无安全机制.

ORACLE登入管理:

SYSTEM/MANAGER (初始帐户)

SYS/CHANGE_ON_NSTALL

INSTALL/ORACLE(安装帐户)

SCOTT/TIGER(示例数据库,测试用)

在ORACLE里默认只有三个系统用户,ORACLE是通过用户登入.

SQL SERVER登入管理:

SQL SERVER身份验证

WINDOWS 身份验证

在SQL SERVER里是通过WINDOWS用户帐户或是用SQL SERVER身份验证连接数据库的.

SQL不是一种语言,而是对ORACLE数据库传输指令的一种方式.

SQL中NULL既不是字符也不是数字,它是缺省数据.ORACLE提供了NVL函数来解决.

集合操作:在SQL中只有UNION(并操作),ORACLE中包含MINUS(差操作)、

INTERECT(交操作)、UNION(并操作).

索引:SQL的索引分为聚集索引和非聚集索引,还包括全文索引;

ORACLE的索引包括:B◆树索引,Bitmap位图索引,函数索引,反序索引,

主键索引,散列索引,本地索引.

ORACLE的数据类型比较复杂,有基本数据类型,衍生型,列对象型,表对象型,结构体型;SQL中的数据比较简单,只有一些简单的基本数据类型无法提供事务操作.

在SQL中如果一个事务从开始执行到结束时了错了,它就会回滚到开始之前;

在ORACLE中它采用的是定点回滚,就是该事务函数化和精确错误定位,用savepoint标记保存点,用Rollback标记回滚错误的保存点.

在SQL中循环只有WHILE一种这用起来不灵活,在ORACLE中有多种循环(LOOP循环、WHILE循环、FOR循环).

在SQL中游标的使用比较复杂,不能同时打开一个以上的游标,因为它只有一个全局变量@@Fast_statues而且声明游标也麻烦,关闭游标时也不清除内存的;ORACLE中游标是以提高速度全部统一的单项游标,可以允许多用户异步读取,而且声明比较简单,就一句declare cursor游标名 is select 语句就可以了.

容错机制:SQL中的错误机制比较复杂,没有提供错误描述;ORACLE中容错类型有三种,一个是预定义错误,一个是非预定义错误,一个是用户自定义,其中在自定义错误中它有两个是在SQL中不有的,那就是SQLCODE 错误号、SQLERRM错误描述.

文件体系结构:SQL中有.MDF(主要数据文件)、.NDF(扩展文件,可以有多个)、

.LDF(日志文件,可以有多个,存放在联机重做日志数据,这里的日志文件有一个缺点就是如果日志文件已填小巧玲珑的话,SQL将自动停止运行并等待人工干预,所以要经常监控日志的情况保证系统的稳定运行).ORACLE中有.DBF(主要数据文件)、.RDO(日志文件,用来做灾难性的数据备份)、.CTL(控制文件,将数据库的物理文件映射到了数据字典中的逻辑表空间和连机重做日志文件上去,确保数据的一致性)、.ORA(参数文件).

SQL Server对每个数据库只能分配一个日志文件.且当日志填满后,日志将停止工作,等待人工干预,而无法自动重用.

Oracle的控制文件记录了数据库文件的物理位置和有效性,在每次打开Oracle系统都将自动对数据进行验证,查看其有效性,防止数据的丢失,这体现了Oracle对数据管理的严密性.

SQL Server无此安全机制,只用在使用到了数据库的信息后,系统才去查找数据是否存在.

Oracle的参数文件init.ora是可调的,既我们可以根据数据库的规模调整Oracle对系统资源的使用情况,以达到最合理的资源分配,让Oracle达到最佳的性能.

SQL Server的配置参数是内定的不可调整,它对系统资源的分配是固定的,不受拥护控制,所以呢无法同时处理大量用户的需求,这限制了它只能作为中,小型数据库.

Oracle以块为最小存储单位,以区为单位分配空间,用户可以根据需要自己定义块的大小,且区可以按等额或递增进行分配,这可以大大减少系统的I/O操作提高数据库的性能.

Oracle中的SQL语句书写规范且提供了完整的函数和数据类型.Oracle提供了健全的错误机制,用户可以轻松的获得错误位置和错误原因而加以修改.用户还可以自己定义所须的错误类型,用以检查逻辑错误.Oracle中对数据类型的转换和游标的定义也十分方便.所以呢,我们对代码的书写和维护也比SQL Server方便许多.

SQL Server使用类C语言,不易维护和查看代码.SQL Server包含的数据类型太少,无法定义结构体,数组,对象.SQL Server无法定义流程机制,类型转换也极不方便,SQL Server中对游标定义十分复杂,且当用户定义的多个游标同时打开时系统却只有一个游标变量,这是SQL SERVER中一个严重的缺陷.

ORACLE中用户可以根据数据需要在创建块时定义填充因子(空闲空间的百分比)和复用因子(当块的存储数据所占的空间下降到这个百分比之下时,块才重新标记为可用).用户可以根据记录变化频率和数据量的大小设置合适的填充因子和空闲因子.

SQL SERVER只有填充因子,而它的定义与ORACLE刚好相反,它定义的是剩余可用空间的百分比.而SQL SERVER中没有复用因子,当页中数据低于填充因子,但剩余的空间已经不可能再插入新的数据,但页还是标记为可用的,当系统要写入新数据都要访问这个页而浪费时间,这种页称为废页,将使系统插入新数据时浪费大量时间查找可用的页.

ORACLE在创建表时用户可以精确定义数据存放的表空间,甚至可以把一张表分开存放在多个表空间中,这样可以将数据量庞大的表按某些字段分开存放,这将给查询带来极高的效率.

SQLServer求优化

我一不太会优化,提供你一些优化的方法吧

操作符优化

in 操作符

用in写出来的sql的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格.

但是用in的sql性能总是比较低的,从oracle执行的步骤来分析用in的sql与不用in的sql有以下区别:

oracle试图将其转换成多个表的连接,如果转换不成功则先执行in里面的子查询,再查询外层的表记录,如果转换成功则直接采用多个表的连接方式查询.由此可见用in的sql至少多了一个转换的过程.一般的sql都可以转换成功,但对于含有分组统计等方面的sql就不能转换了.

推荐方案:在业务密集的sql当中尽量不采用in操作符.

not in操作符

此操作是强列推荐不使用的,因为它不能应用表的索引.

推荐方案:用not exists 或(外连接◆判断为空)方案代替

操作符(不等于)

不等于操作符是永远不会用到索引的,所以呢对它的处理只会产生全表扫描.

推荐方案:用其它相同功能的操作运算代替,如

a0 改为 a0 or a0

a'' 改为 a''

is null 或is not null操作(判断字段是否为空)

判断字段是否为空一般是不会应用索引的,因为b树索引是不索引空值的.

a is not null 改为 a0 或a''等.

不允许字段为空,而用一个缺省值代替空值,如业扩申请中状态字段不允许为空,缺省为申请.

建立位图索引(有分区的表不能建,位图索引比较难控制,如字段值太多索引会使性能下降,多人更新操作会增加数据块锁的现象)

及 操作符(大于或小于操作符)

like操作符

union操作符

union在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果.实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表union.如:

select * from gc_dfys

union

select * from ls_jg_dfys

这个sql在运行时先取出两个表的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序.

推荐方案:采用union all操作符替代union,因为union all操作只是简单的将两个结果合并后就返回.

union all

sql语句索引的利用

对条件字段的一些优化

采用函数处理的字段不能利用索引,如:

trunc(sk_rq)=trunc(sysdate), 优化处理:

sk_rq=trunc(sysdate) and sk_rq

进行了显式或隐式的运算的字段不能进行索引,如:

条件内包括了多个本表的字段运算时不能进行索引,如:

ys_dfcx_df,无法进行优化

应用oracle的hint(提示)处理

提示处理是在oracle产生的sql分析执行路径不满意的情况下要用到的.它可以对sql进行以下方面的提示

目标方面的提示:

cost(按成本优化)

rule(按规则优化)

choose(缺省)(oracle自动选择成本或规则进行优化)

all_rows(所有的行尽快返回)

first_rows(第一行数据尽快返回)

执行方法的提示:

use_nl(使用nested loops方式联合)

use_merge(使用merge join方式联合)

use_hash(使用hash join方式联合)

索引提示:

index(table index)(使用提示的表索引进行查询)

其它高级提示(如并行处理等等)

oracle的提示功能是比较强的功能,也是比较复杂的应用,并且提示只是给oracle执行的一个建议,有时如果出于成本方面的考虑oracle也可能不会按提示进行.根据实践应用,一般不建议开发人员应用oracle提示,因为各个数据库及服务器性能情况不一样,很可能一个地方性能提升了,但另一个地方却下降了,oracle在sql执行分析方面已经比较成熟,如果分析执行的路径不对首先应在数据库结构(主要是索引)、服务器当前性能(共享内存、磁盘文件碎片)、数据库对象(表、索引)统计信息是否正确这几方面分析.

oracle和sql 具体区别在哪里?什么时候用oracle,什么时候用sql

我先抛砖引玉:

① 开发性: SQLSERVER不能,ORACLE能装在UNIX上

不同的硬盘空间.

COMMIT或ROLLBACK子TRANSACTION而不影响主TRANSACTION.

请继续,高分伺候

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

支持一下,来帖一段

开放性:

SQL Server

Oracle

能在所有主流平台上运行(包括 windows).完全支持所有的工业标准.采用完全开放策略.可以使客户选择最适合的解决方案.对开发商全力支持.

可伸缩性,并行性

SQL server

并行实施和共存模型并不成熟.很难处理日益增多的用户数和数据卷.伸缩性有限.

平行服务器通过使一组结点共享同一簇中的工作来扩展windownt的能力,提供高可用性和高伸缩性的簇的解决方案.

如果windowsNT不能满足需要, 用户可以把数据库移到UNIX中.

安全性

没有获得任何安全证书.

Oracle Server

获得最高认证级别的ISO标准认证.

性能

多用户时性能不佳

性能最高, 保持windowsNT下的TPC-D和TPC-C的世界记录.

C/S结构,只支持windows客户,可以用ADO,DAO,OLEDB,ODBC连接.

多层次网络计算,支持多种工业标准,可以用ODBC,JDBC,OCI等网络客户连接

操作简便

操作简单,但只有图形界面.

较复杂, 同时提供GUI和命令行,在windowsNT和unix下操作相同

使用风险

完全重写的代码,经历了长期的测试,不断延迟,许多功能需要时间来证明.并不十分兼容早期产品.使用需要冒一定风险.

长时间的开发经验,完全向下兼容.得到广泛的应用.完全没有风险.

Oracle可以建立位图索引,SQLServer不能.

Oracle可以建立函数索引,SQLServer不能.

SQLServer不支持前触发器,所有都是后触发器.

SQLServer能支持嵌套事务,事务上加上名字就好,就是说能在主事务中操作子事务.

oracle:

length() lengthb()

sqlserver:

datalength()

不了解sql server

似乎SQLServer只是表级触发器,不支持行级触发器

SQL好象也有命令行的.SQL也支持JDBC的.

ORACLE备份方式比较多,有STANDBY、RMAN、IMP等,SQL就比较简单了.

ORACLE可是实现多个日志文件的镜象,而SQL只有一个日志文件.

ORACLE有很少但很多数量的归档日志,而SQL只有一个日志文件,经常会增加到很大.

ORACLE的内存是在数据库启动时就由参数文件决定了的,而SQL可以根据应用自动改变.

ORACLE有专门实现树形查询的语法,而SQL没有.

ORACLE可以修改字符集

SQLSERVER不能,必须重新安装

ORACLE可以安装各种平台

SQLSERVER不行

ORACLE可以卖的很贵却还有人买

也不太了解sqlserver.

它有Orcle中的分析函数和锁吗?

TO:ccbzzp(ccbzzp)

EXAMPLE:ALTER DATABSE DB_NAME COLLATE CHINESE_PRC_CI_AS

如果大家有和问题可以到SQLSERVER板块去看看:-)

跟本不是一个量级上的东西,没什么可比性.

sql server也没说要和oracle比呀,人家在windowns平台自我完善呢.

SQLSERVER不能,必须重新安装更改排序规则.

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

alter database 数据库 collate 排序规格

其中,某些排序规则指定CI 不区分大小写,CS 指定区分大小写.

如:alter database 数据库 COLLATE Chinese_PRC_CI_AS

不区分大小写,而

alter database 数据库 COLLATE Chinese_PRC_CS_AS

使之区分大小写.

使用如下命令,可以获得更多的规则:

SELECT *

FROM ::fn_helpcollations()

oracle可以有java过程sqlserver没有,而sqlserver可以用dll.

oracle有rownum等伪列,sqlserver没有

SQL Server误区30日谈 第6天 有关NULL位图的三个误区

误区

正确

就算表中不存在允许NULL的列,NULL位图对于数据行来说会一直存在(数据行指的是堆或是聚集索引的叶子节点).但对于索引行来说(所谓的索引行也就是聚集索引和非聚集索引的非叶子节点以及非聚集索引的叶子节点)NULL位图就不是一直有效了.

下面这条语句可以有效的证明这一点:

复制代码

代码如下:

CREATE

TABLE

NullTest

(c1

INT

NOT

NULL);

NONCLUSTERED

INDEX

NullTest_NC

ON

(c1);

GO

INSERT

INTO

VALUES

(1);

EXEC

sp_allocationMetadata

'NullTest';

你可以通过我的博文:Inside

The

Storage

Engine:

sp_AllocationMetadata

-

putting

undocumented

system

catalog

views

to

work.来获得sp_allocationMetadata

的实现脚本.

让我们通过下面的script来分别查看在堆上的页和非聚集索引上的页:

DBCC

TRACEON

PAGE

(foo,

--

page

ID

from

SP

output

where

Index

=

①.);

首先让我们来看堆上这页Dump出来的结果

Slot

Offset

Length

Record

Type

PRIMARY_RECORD

Attributes

NULL_BITMAP

Memory

Dump

再来看非聚集索引上的一页Dump出来的结果:

0,

DumpStyle

BYTE

INDEX_RECORD

No

null

bitmap

NULL位图仅仅被用于可空列

错误

当NULL位图存在时,NULL位图会给记录中的每一列对应一位,但是数据库中最小的单位是字节,所以为了向上取整到字节,NULL位图的位数可能会比列数要多.对于这个问题.我已经有一篇博文对此进行概述,请看:Misconceptions

around

size.

Server对表中数据的修改

只有向表中新添加的列是带默认值,且默认值不是NULL时,才会立即导致SQL

Server对数据条目进行修改.都说到这里了大家应该明白,SQL

Server存储引擎会记录一个或多个新添加的列并没有反映在数据记录中.关于这点,我有一篇博文更加深入的对此进行了阐述:Misconceptions

adding

columns

a

table.

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章