sql server2008 错误:15023 解决方案

sql server2008 错误:15023 解决方案
sql server2008 错误:15023 解决方案

sql server2008 错误:15023 解决方案

在把远程服务器上的数据库备份还原到本地机后, 给一个"登录"关联一个"用户"时,发生错误:

“错误15023:当前数据库中已存在用户或角色”

原因及解决办法如下:

在迁移测试平台数据库的过程中发现,在两台服务器上运行的sql server 服务器之间迁移数据库的之后,会出现一个在源服务器上可以正常的用户在目的服务器上无法登录的情况。几经排常找到了原因与解决方法,因为这个问题与解决方法均比较复杂,所以把这个过程中的一些经验纪录下来与大家分享,希望能对大家以后的类似操作有所帮助。

首先介绍一下sql server中“登录”与“用户”的区别,“登录”(Login)用于用户身份验证,存在于master库的syslogins表中,不随用户数据库的备份而备份,所以当换了机器或重装了系统就丢失了登录:Login而成了孤立用户。而数据库“用户”(User)帐户存在于用户数据库中,可跟随用户库的备份和还原。登录通过安全识别符(SID) 与用户关联。将数据库恢复到其他服务器时,数据库中包含一组用户和权限,但可能没有相应的登录或者登录所关联的用户可能不是相同的用户。这种情况被称为存在“孤立用户”。此时是不能通过新建登录或者是对同名登录授予对应数据库的“用户”权限来解决登录问题,因为SQL Server会报出“错误15023:当前数据库中已存在用户或角色”,为了解决这个问题,需要调用系统存储过程sp_change_users_login,具体用法如下:

Use Northwind

go

sp_change_users_login 'update_one', 'test', 'test'

其中Northwind为存在孤立用户的数据库,update_one是存储过程的参数,表示只处理一个用户,前一个test是“用户”,后一个test是“登录”,以上这个SQL

表示将服务器登录“test”与Northwind 数据库用户“test”重新连接起来。这样就可以正常使用数据库了。

PS:比如数据库中已经有了一个库:GJJ并且已经为了他建立了一个登录名并将其与GJJ库关联映射,重新恢复GJJ库之后,登录名GJJ不能访问。使用上述方法:在管理工作室中创建一个查询并执行如下语句:

USE GJJ;

GO

SP_CHANGE_USERS_LOGIN 'UPDATE_ONE','GJJ','GJJ'

sp_change_users_login 'Auto_Fix', 'gjj', null, 'gjj'

sp_change_user_login存储过程的作用是:Maps an existing database user to a SQL Server login,既然只是修改用户登录表,所以也可以直接使用标准SQL 语句:ALTER USER来完成数据库用户到SQL SERVER登录的映射(微软鼓励后者)。

mysql分享(1)-sql语句执行的11个步骤

IREDPURE mysql执行查询语句的11个步骤(分享1) ZERO 2016/02/19

每个人都会犯错误,有的人把犯过的错误记录下来,进一步总结,形成了自己的一套理论;有的人,则在同一个错误上一错再错,不停的抱怨,然后 再犯错,然后再抱怨,产生了一个死循环…… 1、项目结束后的思考 每个项目的结束,每个人都会有自己的收获,不同水平的人总结出来的东西可能不一样!但是对自己而言,都是进步,都是让自己在原有的基础上强大 了一点点。我们在每个项目结束后,都应该对自己做一个总结,这是我们强大的来源,日记月累,必定是一笔不小的财富! 2、mysql查询语句执行的11个步骤 (8) select (9) distinct (1) from (1) (3) join (1) (2) on (4) where (5) group by (6) with {cube | rollup} (7) having (10) order by (11) limit 以上是这个11个步骤,这是《mysql技术内幕之sql编程》这本书上面得出的结论,有兴趣的同学也可以去看下,很不错的一本书! ps: Paul DuBois( 杜波依斯) Sun 公司MySQL文档团队的技术作者、开源社区和MySQL社区活跃的技术专家,同时也是一名数据库管理员。他曾参 与过MySQL在线文档的编写工作 接下来我们举一个例子,分别解释sql语句的执行流程! 3、举例说明sql语句的执行流程 【1】进行准备工作 CREATE TABLE `Customer` ( `CustomerID` varchar(10) NOT NULL, `CityName` varchar(10) NOT NULL, PRIMARY KEY (`CustomerID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; LOCK TABLES `Customer` WRITE; INSERT INTO `Customer` VALUES ('163','hangzhou'),('9you','shanghai'),('tx','hangzhou'), ('baidu','hangzhou'); UNLOCK TABLES; ================================================================================================================= CREATE TABLE `Orders` ( `OrdersID` int(11) NOT NULL AUTO_INCREMENT, `CustomerID` varchar(10) DEFAULT NULL, PRIMARY KEY (`OrdersID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; LOCK TABLES `Orders` WRITE; INSERT INTO `Orders` VALUES (1,'163'),(2,'163'),(3,'9you'),(4,'9you'),(5,'9you'),(6,'tx'),(7,null); UNLOCK TABLES; =====================================================================================================最终结果如下: 通过如下语句查询来杭州,且订单小于2的用户,并且查询出来他们的订单数量,查询的结果按照订单数从大到小排列: select Customer.CustomerID, Customer.CityName, count(Orders.CustomerID) as OrdersNumber from Customer left join Orders on Customer.CustomerID = Orders.CustomerID where Customer.CityName='HangZhou' group by Customer.CustomerID having count(Orders.CustomerID) < 2 order by OrdersNumber desc; ps:在得出正确的语句之前,我写了两次错误的sql,个人认为还是很有借鉴意义的:

Win7下Ms_Sql_Server2008安装图解

Win7常用软件安装之Ms Sql Server2008安装图解 注意: 1. 先走控制面板里找到iis安装,步骤如下 点“程序”, 点“打开或关闭Windows功能”

在“Internet information servers 可承载的web核心”上打勾,点确定,ok 2. 安装vs2008sp1,在微软官网可下载,要先安装vs后才可以安装sp1,下载安装 打开

安装vs sp1成功,继续sqlservers2008安装: 安装SQL2008的过程与SQL2005的程序基本一样,只不过在安装的过程中部分选项有所改变,当然如果只熟悉SQL2000安装的同志来说则是一个革命性的变动。 -------------------------------------------------------------- 开始学习数据库,准备安装SQL Server 2008,在微软网站找到了下载地址,3.28G,之所以这么大,是因为该ISO 文件同时包含了IA64、64、x86 三种版本,x86 约占1.5G 多一些,直接下载地址如下: https://www.360docs.net/doc/e18726885.html,/download/B/8/0/B808AF59-7619-4A71-A447-F597DE74A C44/SQLFULL_CHS.iso 如果你的机器上已安装有Visual Studio 2008,在安装之前最好安装Visual Studio 2008 SP1,为什么这么做?偶也不知道,只是SQL Server 2008 发行说明中有此一条,我也没试过不安装SP1 有什么后果。 开始安装,启动,出现了一个CMD 窗口,真不知道微软的开发人员是怎么想的,用命令行程序做载入和系统检查,而且这个CMD 窗口会一直持续到安装结束。 安装程序风格变化很大,相较2005 也有很大变化:

SQL语句执行效率及分析

SQL语句执行效率及分析 2. SQL提高查询效率 2008-05-12 21:20 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:select id from t where num=0 3.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。 4.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用 索引而进行全表扫描,如: select id from t where num=10 or num=20 可以这样查询: select id from t where num=10 union all select id from t where num=20 5.in 和 not in 也要慎用,否则会导致全表扫描,如: select id from t where num in(1,2,3) 对于连续的数值,能用 between 就不要用 in 了: select id from t where num between 1 and 3 6.下面的查询也将导致全表扫描: select id from t where name like '%abc%' 若要提高效率,可以考虑全文检索。 7.如果在 where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因 而无法作为索引选择的输入项。如下面语句将进行全表扫描: select id from t where num=@num 可以改为强制查询使用索引: select id from t with(index(索引名)) where num=@num 8.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用 索引而进行全表扫描。如:

安装SQL Server 2008 注意及问题解决

SQL Server 2008 安装过程及部分错误解决 本文分为三部分: 一、SQL Server 2008完全卸载过程 二、SQL Server 2008安装过程 三、我在安装过程中所遇到的问题及解决办法 (1)创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke的错误解决办法(2)找不到方法 “boolean microsoft.sqlserver.configuration.msiextensionmetadata.get_isslipstreamorpatch()" (3)“试图执行未授予权限” (4)出现以下错误:对路径 “C:\Windows\system32\perf-ReportServer$MSSQLSERVER3-rsctr.dll”的访问被拒绝。(5)“重启电脑失败” 一、SQL Server 2008完全卸载 1、程序与功能中,右键SQL Server 2008删除 2、进入删除SQL Server 2008,一路下一步下去

3、在程序和功能中,还有SQL Server 2008相关 如果前面卸载比较顺利,相关的组件不多,继续删除SQL Server 2008 Native Client等红框中的组件 4、如果前面没有卸载干净,下载Windows Installer Clean UP选择SQL Server 2008相关移除

再使用SRVINSTW移除SQL Server 2008相关服务。我后来卸载的时候,在程序和功能卸的就很干净,用不着这两个小工具了。 5、清理注册表:开始-运行-regedit.exe 在注册表里找到对应的文件夹,删除 (1)HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ Microsoft SQL Server (2)HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server Native Client 10.0 (3)HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer (4)HKEY_CURRENT_USER\Software\Microsoft\Microsoft SQL Server 下面是我在网上搜到还需要删除的文件夹,但是我一般就删除上面的文件夹就好。 ④HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSSQLServer ⑤HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SQLSERVER AGENT ⑥HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services \MSSQLServerADHelper 6、找到C盘Program Files里Microsoft SQL Server,Microsoft SQL Server Compact Edition文件夹,删除。如果当初装在别的盘就去相对应的位置找,但C盘Microsoft SQL Server文件夹还要删。删除不顺利用360强力删除。 7、重启计算机

SQL语句执行顺序

一、sql语句的执行步骤: 1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义。 2)语义分析,检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限。 3)视图转换,将涉及视图的查询语句转换为相应的对基表查询语句。 4)表达式转换,将复杂的 SQL 表达式转换为较简单的等效连接表达式。 5)选择优化器,不同的优化器一般产生不同的“执行计划” 6)选择连接方式,ORACLE有三种连接方式,对多表连接 ORACLE 可选择适当的连接方式。7)选择连接顺序,对多表连接 ORACLE 选择哪一对表先连接,选择这两表中哪个表做为源数据表。 8)选择数据的搜索路径,根据以上条件选择合适的数据搜索路径,如是选用全表搜索还是利用索引或是其他的方式。 9)运行“执行计划” 二、oracle 共享原理: ORACLE将执行过的SQL语句存放在内存的共享池(shared buffer pool)中,可以被所有的数据库用户共享当你执行一个SQL语句(有时被称为一个游标)时,如果它和之前的执行过的语句完全相同, ORACLE就能很快获得已经被解析的语句以及最好的执行路径. 这个功能大大地提高了SQL的执行性能并节省了内存的使用 三、oracle 语句提高查询效率的方法:1: where column in(select * from ... where ...); 2:... where exists (select 'X' from ...where ...); 第二种格式要远比第一种格式的效率高。在Oracle中可以几乎将所有的IN操作符子查询改写为使用EXISTS的子查询使用EXIST,Oracle系统会首先检查主查询,然后运行子查询直到它找到第一个匹配项,这就节省了时间 Oracle系统在执行IN子查询时,首先执行子查询,并将获得的结果列表存放在在一个加了索引的临时表中避免使用having字句避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作. 如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销 SQL Select语句完整的执行顺序: 1、from子句组装来自不同数据源的数据; 2、where子句基于指定的条件对记录行进行筛选; 3、group by子句将数据划分为多个分组; 4、使用聚集函数进行计算; 5、使用having子句筛选分组; 6、计算所有的表达式; 7、使用order by对结果集进行排序。

Microsoft SQL Server 2008安装图解

Microsoft SQL Server 2008 安装图解 简介 版本:Microsoft SQL Server 2008 R2官方中文版 下载地址:https://www.360docs.net/doc/e18726885.html,/html/4610.html 软件大小:1.47G 操作系统:Windows 7 安装日志 下载完成,双击运行 图 1 安装文件 选择文件解压地址,单击OK 图 2 解压目录 解压中 图 3 解压中

解压完成 图 4 解压完成 打开解压的文件夹,找到setup.exe,双击运行 图 5 setup.exe 进入SQL Server安装中心后跳过“计划”内容,直接选择界面左侧列表中的“安装”,如图6所示,进入安装列表选择。

图 6 SQL Server安装中心-计划 如图7所示,进入SQL Server安装中心-安装界面后,右侧的列表显示了不同的安装选项。本文以全新安装为例说明整个安装过程,因此这里选择第一个安装选项“全新SQL Server独立安装或现有安装添加功能”。 图7 SQL Server安装中心-安装

之后进入“安装程序支持规则”安装界面,安装程序将自动检测安装环境基本支持情况,需要保证通过所有条件后才能进行下面的安装,如图8所示。当完成所有检测后,点击“确定”进行下面的安装。 图8 安装程序支持规则 接下来是SQL Server2008版本选择和密钥填写,本文以“Enterprise Evaluat ion”为例介绍安装过程,密钥可以向Microsoft官方购买,如图9所示。

图9 产品密钥 在许可条款界面中,需要接受Microsoft软件许可条款才能安装SQL Server 2008,如图10所示。

执行一条sql语句update多条记录实现思路

执行一条sql语句update多条记录实现思路 如果你想更新多行数据,并且每行记录的各字段值都是各不一样,怎么办? 通常情况下,我们会使用以下SQL语句来更新字段值: UPDATE mytable SET myfield='value' WHERE other_field='other_value'; 但是,如果你想更新多行数据,并且每行记录的各字段值都是各不一样,你会怎么办呢?举个例子,我的博客有三个分类目录(免费资源、教程指南、橱窗展示),这些分类目录的信息存储在数据库表categories中,并且设置了显示顺序字段 display_order,每个分类占一行记录。如果我想重新编排这些分类目录的顺序,例如改成(教程指南、橱窗展示、免费资源),这时就需要更新categories表相应行的display_order字段,这就涉及到更新多行记录的问题了,刚开始你可能会想到使用循环执行多条UPDATE语句的方式,就像以下的php 程序示例: ? 1 2 3 4 5 foreach ($display_order as $id => $ordinal) { $sql="UPDATE categories SET display_order = $ordinal WHERE id = $id"; mysql_query($sql); } 这种方法并没有什么任何错误,并且代码简单易懂,但是在循环语句中执行了不止一次SQL 查询,在做系统优化的时候,我们总是想尽可能的减少数据库查询的次数,以减少资源占用,同时可以提高系统速度。 幸运的是,还有更好的解决方案,下面列举两种常用的方案只不过SQL语句稍微复杂点,但是只需执行一次查询即可,语法如下: ? 1 2 3 4 5 6 7 8 ?第一种:IF--THEN语句结合UPDATE mytable SET myfield = CASE other_field WHEN 1 THEN 'value' WHEN 2 THEN 'value' WHEN 3 THEN 'value' END

oracle sql语句执行顺序

要知道SQL语句,我想我们有必要知道SQL Server查询分析器怎么执行我们的SQL语句的,我们很多人会看执行计划,或者用Profiler来监视和调优查询语句或者存储过程慢的原因,但是如果我们知道查询分析器的执行逻辑顺序,下手的时候就胸有成竹,那么下手是不是有把握点呢? 一、查询的逻辑执行顺序 (1) FROM left_table (3) join_type JOIN right_table (2) ON join_condition (4) WHERE where_condition (5) GROUP BY group_by_list (6) WITH {cube | rollup} (7) HAVING having_condition (8) SELECT (9) DISTINCT (11) top_specification select_list (9) ORDER BY order_by_list 标准的SQL 的解析顺序为: (1) FROM 子句组装来自不同数据源的数据 (2) WHERE 子句基于指定的条件对记录进行筛选 (3) GROUP BY 子句将数据划分为多个分组 (4) 使用聚合函数(avg)进行计算 (5) 使用HAVING子句筛选分组 (6) 计算所有的表达式 (7) 使用ORDER BY对结果集进行排序 二、执行顺序 1. FROM:对FROM子句中前两个表执行笛卡尔积生成虚拟表vt1 2. ON: 对vt1表应用ON筛选器只有满足join_condition 为真的行才被插入vt2 3. OUTER(join):如果指定了OUTER JOIN保留表(preserved table)中未找到的行将行作为外部行添加到vt2,生成t3,如果from包含两个以上表,则对上一个联结生成的结果表和下一个表重复执行步骤和步骤直接结束。 4. WHERE:对vt3应用WHERE 筛选器只有使where_condition 为true的行才被插入vt4 5. GROUP BY:按GROUP BY子句中的列列表对vt4中的行分组生成vt5 6. CUBE|ROLLUP:把超组(supergroups)插入vt6,生成vt6 7. HAVING:对vt6应用HAVING筛选器只有使having_condition 为true的组才插入vt7 8. SELECT:处理select列表产生vt8 9. DISTINCT:将重复的行从vt8中去除产生vt9 10. ORDER BY:将vt9的行按order by子句中的列列表排序生成一个游标vc10 11. TOP:从vc10的开始处选择指定数量或比例的行生成vt11 并返回调用者 看到这里,那么用过Linq to SQL的语法有点相似啊?如果我们我们了解了SQL Server 执行顺序,那么我们就接下来进一步养成日常SQL的好习惯,也就是在实现功能的同时有考虑性能的思想,数据库是能进行集合运算的工具,我们应该尽量的利用这个工具,所谓集合运算实际就是批量运算,就是尽量减少在客户端进行大数据量的循环操作,而用SQL语句或者存储过程代替。 三、只返回需要的数据 返回数据到客户端至少需要数据库提取数据、网络传输数据、客户端接收数据以及客户

SQL语句执行效率及分析(note)

SQL语句执行效率及分析(note) 1.关于SQL查询效率,100w数据,查询只要1秒,与您分享: 机器情况 p4: 2.4 内存: 1 G os: windows 2003 数据库: ms sql server 2000 目的: 查询性能测试,比较两种查询的性能 SQL查询效率step by step -- setp 1. -- 建表 create table t_userinfo ( userid int identity(1,1) primary key nonclustered, nick varchar(50) not null default '', classid int not null default 0, writetime datetime not null default getdate() ) go -- 建索引 create clustered index ix_userinfo_classid on t_userinfo(classid) go -- step 2. declare @i int declare @k int declare @nick varchar(10) set @i = 1 while @i<1000000 begin set @k = @i % 10 set @nick = convert(varchar,@i) insert into t_userinfo(nick,classid,writetime) values(@nick,@k,getdate()) set @i = @i + 1

end -- 耗时08:27 ,需要耐心等待 -- step 3. select top 20 userid,nick,classid,writetime from t_userinfo where userid not in ( select top 900000 userid from t_userinfo order by userid asc ) -- 耗时8 秒,够长的 -- step 4. select https://www.360docs.net/doc/e18726885.html,erid,b.nick,b.classid,b.writetime from ( select top 20 https://www.360docs.net/doc/e18726885.html,erid from ( select top 900020 userid from t_userinfo order by userid asc ) a order by https://www.360docs.net/doc/e18726885.html,erid desc ) a inner join t_userinfo b on https://www.360docs.net/doc/e18726885.html,erid = https://www.360docs.net/doc/e18726885.html,erid order by https://www.360docs.net/doc/e18726885.html,erid asc -- 耗时1 秒,太快了吧,不可以思议 -- step 5 where 查询 select top 20 userid,nick,classid,writetime from t_userinfo where classid = 1 and userid not in ( select top 90000 userid from t_userinfo where classid = 1 order by userid asc ) -- 耗时2 秒 -- step 6 where 查询 select https://www.360docs.net/doc/e18726885.html,erid,b.nick,b.classid,b.writetime from ( select top 20 https://www.360docs.net/doc/e18726885.html,erid from ( select top 90000 userid from t_userinfo

SQL_2008安装教程(完整版)

Win 7 win xp系统中SQL2008安装注意事项一:SQL2008 镜像下载地址 二:VS-2008 sp1补丁程序下载地址: https://www.360docs.net/doc/e18726885.html,/s?wd=vs2008%20sp1%B2%B9%B6%A1%CF%C2 %D4%D8&rsp=2&oq=VS2008%20sp1&f=1&tn=msvista_dg&ch=1 三:需要准备好sql2008的序列号 开发版(Developer): PTTFM-X467G-P7RH2-3Q6CG-4DMYB 企业版(Enterprise): JD8Y6-HQG69-P9H84-XDTPG-34MBB) 四:1.安装SQL2008 必须先安装VS-2008补丁程序sp1 2.xp系统和win7系统的sql2008的镜像是不一样的(xp镜像微软二班的老师已经 发过) 五.安装过称中出现的问题及解决方法: 1.错误: 在创建窗口句柄之前,不能在控件上调用Invoke 或BeginInvoke 解决方法: 关闭IE:如下图

2. 错误: 检测时显示"重新启动计算机". 如下图: 解决方法:如下图: 1).开始菜单,运行,输入regedit.exe打开注册表 2)在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager中找到PendingFileRenameOperations项目,并删除它(注意在要右边窗口中)。

3. 权限不够,建议用administrator 帐号登陆安装(注:默认情况下,WIN7下是把administrator禁用,开启administrator方法:右键计算机,管理,用户然后开 administrator

解析SQL执行过程

为了将用户写的SQL文本转化为Oracle认识的且可执行的语句,这个过程就叫做解析过程。解析分为硬解析和软解析。一条SQL语句在第一次被执行时必须进行硬解析。 当客户端发出一条SQL语句(也可以是一个存储过程或者一个匿名PL/SQL块)进入shared pool时(注意,我们从前面已经知道,Oracle对这些SQL不叫做SQL语句,而是称为游标。因为Oracle在处理SQL时,需要很多相关的辅助信息,这些辅助信息与SQL语句一起组成了游标),Oracle首先将SQL文本转化为ASCII值,然后根据hash函数计算其对应的hash值(hash_value)。根据计算出的hash值到library cache中找到对应的bucket,然后比较bucket里是否存在该SQL语句。 如果不存在,则需要按照我们前面所描述的,获得shared pool latch,然后在shared pool 中的可用chunk链表(也就是bucket)上找到一个可用的chunk,之后释放shared pool latch。在获得了chunk以后,这块chunk就可以认为是进入了library cache。接下来,进行硬解析过程。硬解析包括以下几个步骤。 对SQL语句进行文法检查,看是否有文法错误。比如没有写from、select拼写错误等。如果存在文法错误,则退出解析过程。 到数据字典里校验SQL语句涉及的对象和列是否都存在。如果不存在,则退出解析过程。这个过程会加载dictionary cache。 将对象进行名称转换。比如将同名词翻译成实际的对象等。比如select * from t中,t是一个同名词,指向hr.t1,于是Oracle将t转换为hr.t1。如果转换失败,则退出解析过程。 检查发出SQL语句的用户是否具有访问SQL语句里所引用的对象的权限。如果没有权限,则退出解析过程。 通过优化器创建一个最优的执行计划。这个过程会根据数据字典里记录的对象的统计信息,来计算最优的执行计划。这一步牵涉大量数学运算,是最消耗CPU资源的。 将该游标所产生的执行计划、SQL文本等装载进library cache的heap中。 在硬解析的过程中,进程会一直持有library cache latch,直到硬解析结束为止。硬解析结束以后,会为SQL语句产生两个游标,一个是父游标,另一个是子游标。父游标里主要包含两种信息:SQL文本以及优化目标(optimizer goal)。父游标在第一次打开时被锁定,直到其他所有的session都关闭该游标后才被解锁。当父游标被锁定的时候是不能被交换出library cache的,只有在解锁以后才能被交换出library cache。父游标被交换出内存时,父游标对应的所有子游标也被交换出library cache。子游标包括游标所有的信息,比如具体的执行计划、绑定变量等。子游标随时可以被交换出library cache,当子游标被交换出library cache

PLSQL怎么执行SQL语句

通过f5查看到的执行计划,其实是pl/sql developer工具内部执行查询 plan_table表然后格式化的结果。 select * from plan_table where statement_id=...。其中 description列描述当前的数据库操作, object owner列表示对象所属用户, object name表示操作的对象, cost列表示当前操作的代价(消耗),这个列基本上就是评价sql语句的优劣,cardinality列表示操作影响的行数, bytes列表示字节数篇二:plsqldeveloper工具使用教程 plsql入门 pl/sql的概述 pl/sql的优势 pl/sql是一种块结构的语言,允许你将业务逻辑封装在一起,这是到目前为止使用pl/sql的最大优势 pl/sql是在服务器上运行,可以与数据库和sql引擎直接进行交互, pl/sql是什么? (procedural language/sql) 是oracle在标准的sql语言上的扩展,pl/sql不仅允许嵌入sql语言,还可以定义变量和常量,允许使用条件语句和循环语句,允许使用列外处理各种错误,这样使得它的功能变得更加强大。 特性: 减少java程序的复杂性 一.过程,函数,触发器是pl/sql编写的 二.过程、函数、触发器是在oracle中 三. pl/sql是非常强大的数据库过程语言 四.过程,函数可以再java程序中调用 为什么学? a) 提高应用程序的运行性能 b) 模块化的设计思想[分页的过程,订单的过程,转账的过程] c) 减少网络传输量(传统的方法,用sql语句传输!现在就只需要调用存储过程) d) 提高安全性(传统sql 可以看到表名字段等…) 不好: 移植性不好,(你写好的存储过程,函数等当我们要换数据库时,这些东西就没用了)开发工具: 1. sqlplus 开发工具 是oracle公司提供的一个工具,这个因为我们在以前介绍过: 2. pl/sql developer开发工具 pl/sql developer是用于开发pl/sql块的集成开发环境(ide) 它是一个独立的产品,而不是oracle的一个附带品, createprocedure sp_pro1//存储过程名字 is begin ---执行部分 insert into mytest values(‘’,’’); end; / 查看错误信息

oracle-SQL语句执行原理和完整过程详解

SQL语句执行过程详解 一条sql,plsql的执行到底是怎样执行的呢? 一、SQL语句执行原理: 第一步:客户端把语句发给服务器端执行 当我们在客户端执行select 语句时,客户端会把这条SQL 语句发送给服务器端,让服务器端的进程来处理这语句。也就是说,Oracle 客户端是不会做任何的操作,他的主要任务就是把客户端产生的一些SQL 语句发送给服务器端。虽然在客户端也有一个数据库进程,但是,这个进程的作用跟服务器上的进程作用事不相同的。服务器上的数据库进程才会对SQL 语句进行相关的处理。不过,有个问题需要说明,就是客户端的进程跟服务器的进程是一一对应的。也就是说,在客户端连接上服务器后,在客户端与服务器端都会形成一个进程,客户端上的我们叫做客户端进程;而服务器上的我们叫做服务器进程。 第二步:语句解析 当客户端把SQL 语句传送到服务器后,服务器进程会对该语句进行解析。同理,这个解析的工作, 其会做很多小动作。 也是在服务器端所进行的。虽然这只是一个解析的动作,但是,“” 1. 查询高速缓存(library cache)。服务器进程在接到客户端传送过来的SQL 语句时,不 会直接去数据库查询。而是会先在数据库的高速缓存中去查找,是否存在相同语句的执行计划。如果在数据高速缓存中,则服务器进程就会直接执行这个SQL 语句,省去后续的工作。所以,采用高速数据缓存的话,可以提高SQL 语句的查询效率。一方面是从内存中读取数据要比从硬盘中的数据文件中读取数据效率要高,另一方面,也是因为这个语句解析的原因。 不过这里要注意一点,这个数据缓存跟有些客户端软件的数据缓存是两码事。有些客户端软件为了提高查询效率,会在应用软件的客户端设置数据缓存。由于这些数据缓存的存在,可以提高客户端应用软件的查询效率。但是,若其他人在服务器进行了相关的修改,由于应用软件数据缓存的存在,导致修改的数据不能及时反映到客户端上。从这也可以看出,应用软件的数据缓存跟数据库服务器的高速数据缓存不是一码事。 2. 语句合法性检查(data dict cache)。当在高速缓存中找不到对应的SQL 语句时,则服 务器进程就会开始检查这条语句的合法性。这里主要是对SQL 语句的语法进行检查,看看其是否合乎语法规则。如果服务器进程认为这条SQL 语句不符合语法规则的时候,就会把这个错误信息,反馈给客户端。在这个语法检查的过程中,不会对SQL 语句中所包含的表名、列名等等进行SQL 他只是语法上的检查。 3. 语言含义检查(data dict cache)。若SQL 语句符合语法上的定义的话,则服务器进程 接下去会对语句中的字段、表等内容进行检查。看看这些字段、表是否在数据库中。如果表名与列名不准确的话,则数据库会就会反馈错误信息给客户端。所以,有时候我们写select 语句的时候,若语法与表名或者列名同时写错的话,则系统是先提示说语法错误,等到语法完全正确后,再提示说列名或表名错误。 4. 获得对象解析锁(control structer)。当语法、语义都正确后,系统就会对我们需要查询的对象加锁。这主要是为了保障数据的一致性,防止我们在查询的过程中,其他用户对这个对象的结构发生改变。 5. 数据访问权限的核对(data dict cache)。当语法、语义通过检查之后,客户端还不一定 能够取得数据。服务器进程还会检查,你所连接的用户是否有这个数据访问的权限。若你连接上服务器

SQL_Server_2008安装过程图解

SQL Server 2008 中文版安装图集 一直很期待SQL Server 2008 的发布,昨天在微软网站找到了下载地址,3.28G,之所以这么大,是因为该ISO 文件同时包含了IA64、64、x86 三种版本,x86 约占1.5G 多一些,直接下载地址如下: https://www.360docs.net/doc/e18726885.html,/download/B/8/0/B808AF59-7619-4A71-A447-F597DE7 4AC44/SQLFULL_CHS.iso 如果你的机器上已安装有Visual Studio 2008,在安装之前最好安装Visual Studio 2008 SP1,为什么这么做?偶也不知道,只是SQL Server 2008 发行说明中有此一条,我也没试过不安装SP1 有什么后果。 开始安装,启动,WOW,出现了一个CMD 窗口,真不知道微软的开发人员是怎么想的,用命令行程序做载入和系统检查,而且这个CMD 窗口会一直持续到安装结束。 安装程序风格变化很大,相较2005 也有很大变化,见图(点击看大图): 上图为安装主界面,包含了有关SQL Server 2008 的各种信息,很直观,开始安装选择:全新SQL Server 独立安装或向现有安装添加功能;

一些必需条件检查; Enterprise: JD8Y6-HQG69-P9H84-XDTPG-34MBB

然后是产品序列号输入,这也是SQL Server 首次采用此种授权管理方式;从微软网站下载的版本其实和正式版本无异,你如果有正式的序列号,在此输入即可成为正式版;当然在此处你也可以选择安装企业评估版,待以后通过上图的安装中心界面可将试用版升级为其它版本的正式版。 SQL Server 2008 企业版授权协议;

SQL语句编写与优化规范

SQL语句编写与优化规范 1用SELECT查询用具体字段代替“*”,且尽可能只查询需要的字段。 SELECT * FROM DEMO_TABLE; SELECT FIELD1,FILED2 FROM DEMO_TABLE; 2多表查询时,使用表的别名,就可以减少解析的时间并减少那些由列名歧义引起的语法错误 SELECT FIELD1,FILED2 FROMDEMO_TABLE1,DEMO_TABLE2 WHERE T1_ID=T2_ID; SELECT t1.T1_ID=t2.T2_ID; 3用EXISTS替代IN,用NOT EXISTS替代NOT IN SELECT * FROM EMP ( FROM DEPT WHERE LOC = 'MELB'); SELECT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = 'MELB') 4WHERE条件连接顺序,把表关系写在最前 例如Oracle采用自下而上的顺序解析WHERE子句,表之间的条件连接必须写在其他条件之前,把可以过滤掉大量数据的条件写在WHERE子句的最后,按照过滤记录数量的多少 SELECT * FROM A a, B b WHERE a.num>3000 and b.state=2 AND a.ID=b.ID; SELECT * FROM A a, B b WHERE a.ID=b.ID and b.state=2and a.num>3000 5删除全表时,用TRUNCATE替代DELETE 当删除表中的记录时,在通常情况下, 回滚段(rollback segments ) 用来存放可以被恢复的信息. 如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况) 而当运用TRUNCATE时, 回滚段不再存放任何可被恢复的信息.

9个简单步骤,完全理解SQL

9个简单步骤,完全理解SQL 字数2219阅读58评论0喜欢3 整理自网络,我也忘了从哪个网站了。 一、SQL是一种声明式语言 首先要把这个概念记在脑中:“声明”。SQL 语言是为计算机声明了一个你想从原始数据中获得什么样的结果的一个范例,而不是告诉计算机如何能够得到结果。 简单地说,SQL 语言声明的是结果集的属性,计算机会根据SQL 所声明的内容来从数据库中挑选出符合声明的数据。 二、SQL的语法并不按照语法顺序执行 SQL 语句有一个让大部分人都感到困惑的特性,就是:SQL 语句的执行顺序跟其语句的语法顺序并不一致。SQL 语句的执行顺序是: 1. FROM 2. WHERE 3. GROUP BY 4. HAVING 5. SELECT 6. DISTINCT

7. UNION 8. ORDER BY 关于SQL 语句的执行顺序,有两个值得我们注意的地方: 1. FROM才是SQL语句执行的第一步,并非SELECT 。数据库在执行SQL 语句的第一步是将数据从硬盘加载到数据缓冲区中,以便对这些数据进行操作。但是并非如此,以Oracle 等常用数据库为例,数据是从硬盘中抽取到数据缓冲区中进行操作。 2. SELECT 是在大部分语句执行了之后才执行的,理解这一点是非常重要的, 这就是你不能在WHERE 中使用在SELECT 中设定别名的字段作为判断条件的原因。 3.SELECT A.x + A.y AS z 4.FROM A WHERE z = 10 // z在此处不可用,因为SELECT是最后执行的语句 永远要记得:SQL 语句的语法顺序和其执行顺序并不一致,这样我们就能避免一般性的错误。 三、SQL语言的核心是对表的引用 FROM 语句的“输出”是一张联合表,来自于所有引用的表在某一维度上的联合。 FROM a, b 上面这句FROM 语句的输出是一张联合表,联合了表 a 和表 b 。如果 a 表有三个字段,b 表有 5 个字段,那么这个“输出表”就有8 个字段。 四、SQL语句中推荐使用表连接

SQL中SELECT语句的执行顺序

SQL中SELECT语句的执行顺序 好像自已在书写 SQL 语句时由于不清楚各个关键字的执行顺序, 往往组织的 SQL 语句缺少很好的逻辑, 凭感觉 "拼凑" ( 不好意思, 如果您的 SQL 语句也经常 "拼凑", 那您是不是得好好反省一下呢?, 呵呵). 确实是爽了自己, 可苦了机器, 服务器还需要在我们的杂乱无章的 SQL 语句中寻找它下一句需要执行的关键字在哪里. 效率嘛, 由于我们的感觉神经对秒以下的变化实在不敏感, 暂且就认为自已写的 SQL 顺序无关紧要, "反正没什么变化!", 呵呵.其实服务器对每句 SQL 解析时间都会有详细记录的, 大家可以看一下自已按习惯写的SQL 和按标准顺序写的SQL解析时间差别有多大. 因此, 考试#大建议大家在平时工作中 SQL 语句按标准顺序写, 一是专业, 二是实用, 呵呵, 不过觉得最主要的是心里感觉舒服. 标准的 SQL 的解析顺序为: (1).FROM 子句, 组装来自不同数据源的数据 (2).WHERE 子句, 基于指定的条件对记录进行筛选 (3).GROUP BY 子句, 将数据划分为多个分组 (4).使用聚合函数进行计算 (5).使用 HAVING 子句筛选分组 (6).计算所有的表达式 (7).使用 ORDER BY 对结果集进行排序 举例说明: 在学生成绩表中 (暂记为 tb_Grade), 把 "考生姓名"内容不为空的记录按照 "考生姓名" 分组, 并且筛选分组结果, 选出 "总成绩" 大于 600 分的. 标准顺序的 SQL 语句为: select 考生姓名, max(总成绩) as max总成绩 from tb_Grade where 考生姓名 is not null group by 考生姓名 having max(总成绩) > 600 order by max总成绩 在上面的示例中 SQL 语句的执行顺序如下: (1). 首先执行 FROM 子句, 从 tb_Grade 表组装数据源的数据 (2). 执行 WHERE 子句, 筛选 tb_Grade 表中所有数据不为 NULL 的数据 (3). 执行 GROUP BY 子句, 把 tb_Grade 表按 "学生姓名" 列进行分组 (4). 计算 max() 聚集函数, 按 "总成绩" 求出总成绩中的一些数值 (5). 执行 HAVING 子句, 筛选课程的总成绩大于 600 分的. (7). 执行 ORDER BY 子句, 把最后的结果按 "Max 成绩" 进行排序. 【

相关文档
最新文档