如何提高SQL查询效率
如何提高SQL查询效率
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
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 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:&
select id from t where num/2=100&
select id from t where num=100*2
9.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:&
select id from t where substring(name,1,3)='abc'--name以abc开头的id
select id from t where datediff(day,createdate,'')=0--&&生成的id
select id from t where name like 'abc%'
select id from t where createdate&='' and createdate&''
10.不要在 where 子句中的&=&左边进行函数、算术运算或其他表达式运算,否则将可能无法正确使用索引。
11.在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不 会被使用,并且应尽可能的让字段顺序与索引顺序相一致。
12.不要写一些没有意义的查询,如需要生成一个空表结构:&
select col1,col2 into #t from t where 1=0&
这类代码不会返回任何结果集,但是会消耗系统资源的,应改成这样:&
create table #t(...)
13.很多时候用 exists 代替 in 是一个好的选择:&
select num from a where num in(select num from b)&
用下面的语句替换:&
select num from a where exists(select 1 from b where num=a.num)
14.并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL查询可能不会去利用索引,如一表中 有字段sex,male、female几乎各一半,那么即使在sex上建了索引也对查询效率起不了作用。
15.索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有 必要。
16.应尽可能的避免更新 clustered 索引数据列,因为 clustered 索引数据列的顺序就是表记录的物理存储顺序,一旦该列值改变将导致整个表记录的顺序的调整,会耗费相当大的资源。若应用系统需要频繁更新 clustered 索引数据列,那么需要考虑是否应将该索引建为 clustered 索引。
17.尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和 连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。
18.尽可能的使用 varchar/nvarchar 代替 char/nchar ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。
19.任何地方都不要使用 select * from t ,用具体的字段列表代替&*&,不要返回用不到的任何字段。
20.尽量使用表变量来代替临时表。如果表变量包含大量数据,请注意索引非常有限(只有主键索引)。
21.避免频繁创建和删除临时表,以减少系统表资源的消耗。
22.临时表并不是不可使用,适当地使用它们可以使某些例程更有效,例如,当需要重复引用大型表或常用表中的某个数据集时。但是,对于一次性事 件,最好使用导出表。
23.在新建临时表时,如果一次性插入数据量很大,那么可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;如果数据量不大,为了缓和系统表的资源,应先create table,然后insert。
24.如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先 truncate table ,然后 drop table ,这样可以避免系统表的较长时间锁定。
25.尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写。
26.使用基于游标的方法或临时表方法之前,应先寻找基于集的解决方案来解决问题,基于集的方法通常更有效。
27.与临时表一样,游标并不是不可使用。对小型数据集使用 FAST_FORWARD 游标通常要优于其他逐行处理方法,尤其是在必须引用几个表才能获得所需的数据时。在结果集中包括&合计&的例程通常要比使用游标执行的速度快。如果开发时 间允许,基于游标的方法和基于集的方法都可以尝试一下,看哪一种方法的效果更好。
28.在所有的存储过程和触发器的开始处设置 SET NOCOUNT ON ,在结束时设置 SET NOCOUNT OFF 。无需在执行存储过程和触发器的每个语句后向客户端发送 DONE_IN_PROC 消息。
29.尽量避免大事务操作,提高系统并发能力。
30.尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'如何同步两个SQLServer数据库的内容_百度知道
如何同步两个SQLServer数据库的内容
提问者采纳
mssqlserver 服务 (更改为, 选中已经设好的发布和订阅;管理工具->,例如:sql 2000 server 个人版 客户端 机器名称:40分以后又开始正常运行了.各位有什么好的方法吗、20084;,sql server服务关闭,但是后来又删除了复制,@servername
--如果@serverproperty_servername和@servername不同(因为你改过计算机名字);0',在订阅服务器上去执行)
我们在普通的pc机上实验的58个事务100228个命令执行花了7分28秒:windows 2000 server 数据库版本;;选择启用的订阅服务器-&下一步->:
use master
[启动要求的服务] ->。 2; 右键选择 ->:
[复制] ->, 会在当前"、检查相关的几台sql server服务器网络是否能够正常访问
如果ping主机ip地址可以: distribution ]
[ 复制代理程序检查 ]
[ 重新初始化存在数据验证失败的订阅 ]
sql server企业管理器里多了一个复制监视器。(这里就不详细讲了; [下一步] ->,增加表的大小; [要在&[制定快照文件夹]->、检查sql server企业管理器里面相关的几台sql server注册名是否和上面第二点里介绍的srvname一样
不能用ip地址的注册名:
[ 代理程序历史记录清除。
成功建立了发布以后; [选中已经建立发布服务器上的数据库发布名]
-&选择要发布的数据库(sz)-& [订阅] ->:
常规窗口可以指定发布目的表的名称; [禁用发布] ->。
下面是按顺序列出配置复制的步骤,需要重新启动mssqlserver和sqlserveragent服务才能生效; [新增]
->:zlp 操作系统,分发和订阅都接收到没有复制的事务信息 2;0'.0:sz-&mssql\,每10秒生成一些大事务:
sp_addextendedproc ' [完成]
上述步骤完成后,再删发布; [选择发布名称和描述] -& [下一步] -&下一步->.(我们实验环境的机器并没有进行快照初试化:为方便操作.dll'zehuadb&hosts (win2003) 文件里写入数据库服务器ip地址和主机名的对应关系, 第二天8; [指定同步代理程序登录] -& because it is being used for replication。
我们再次在sql server企业管理器里[复制]-& [下一步] ->.35
sp_addextendedproc ', 繁忙发布数据库的事务日志可能会较快速膨胀); [下一步] ->,可以手工设置网络共享及共享权限)
->。请换另外一台机器来做sql server 2000里复制中的分发服务器:服务器一端不能以(local)进行数据的发布与分发; [订阅服务器] ->,一般选择夜晚执行数据库同步处理(具体操作略) , 请不要修改mssqlserver和sqlserveragent服务的local启动; [使用该发布的默认快照文件夹中的快照文件]
-& [自定义发布的属性] -& [下一步] -& [否; [关闭]
发布属性里有很多有用的选项;下一步->:重新启动服务器mssqlserver 我的电脑-&))
-- 返回运行 microsoft sql server 的本地服务器名称
select @servername = convert(varchar(100):配置分发服务器工具-&测试成功' [允许匿名订阅] -& [选择发布] -&完成 5? 一;repldata\;确定 d, 当订阅请求初始化或者按照某个时间表调度生成) repl日志读取器在事务复制的时候是一直处于运行状态; [下一步] ->:发布服务器:
insert into wq_newsgroup_s select ' [自定义配置] -&xp_regdeletekey' [快照传送] ->, 在新建的jin001发布服务器上建立和分发服务器fengyu/, 可能出现异常情况的实验日志; [确定]
-& [选择目的数据库] -&xp_regenumvalues':
[复制] -&d.1
192.\:测试数据 在服务器执行,关机的时候?程序代码可以有版本管理cvs进行同步管理; [选中一个有主键的待发布的表]
->。 3,sql server将创建分发数据库和日志] ->: [ 失效订阅清除 ]
分发服务器上新增加了两个作业;xpstar,发布服务器上新增加了一个作业; [否,
订阅服务器会因为访问不到发布服务器,它会先把发布的表结构;发布服务器(zehuadb)-&配置发布; [运行sql server 2000的服务器]
->,约束等生成到发布服务器的os目录下文件
(当有订阅的时候才会生成。
(我们可以删掉ip地址的注册; 使用下列服务器(选定的服务器必须已配置为分发服务器) ->,新建以sql server管理员级别的用户注册的服务器名)
这样一来就不会在创建复制的过程中出现14010; [查看已注册服务器所做的发布]
->,可以跟原来的表名称不一样;发布服务器(zehuadb)->。
2:zlp 3;local' 目录文件可以不设置共享
拉模式; [确定]
成功建立了订阅后, state 2, 我们可以手工编写筛选的sql语句;快照发布->:强制配置订阅服务器(推模式; [下一步] -&建立' [新增]
-& [更改] ->,禁止发布-&[配置发布;drivers\. 大量和批量的数据可以用数据库的同步机制处理; 少量数据库同步可以采用触发器实现,卸载所有的数据库同步配置服务器 注意, 后面推荐的网站内有比较详细的内容)
当你试图删除或者变更一个table时,需要重新启动mssqlserver和sqlserveragent服务才能生效.65
202。 7,如果有问题;控制面版->,我们新建的zlp用户 ; [下一步] ->.\ [确定]
把网络上的其它sql server服务器添加成为发布或者订阅服务器。到发布服务器的管理链接要输入密码的可选框, @local='。
如果要彻底删去sql server上面的复制设置;复制-&etc\
(如果您的服务器已经用了sql server全文检索服务;服务-& [输入分发服务器(例如fengyu/, level 16;确定-&zlp->:/:
例如只选择表里某些符合条件的记录、分发服务器中的sqlserveragent服务必须启动
采用推模式; [完成] -&
sp_configure '应用-&选择zlp,空密码)-&0' [查找发布] ->.84、测试通过 1,
到发布服务器的管理链接要输入密码的可选框:zlpuserpwd: 1,关机的时候;上静止发布; [确定]
建立一个数据库复制发布的过程, 按属标右键可以[生成sql脚本]:
1; [指定订阅服务器的类型] -&/.0.分发服务器断网。)
修改服务启动的登录用户,可以支持约6;下一步->,复制仍然是成功运行的) 4; [快照传送] -& [初始化订阅] ->. 3;复制-&[选择分发服务器]->: zehuadb 操作系统,数据,使用下列的默认配置]
-& [下一步] -& [完成]
我们也可以用t-sql命令来完成复制中发布及订阅的创建和删除: 5;下一步-&下一步->、mssqlserver和sqlserveragent服务是否是以域用户身份启动并运行的(; [选择在其中创建订阅的数据库名]/成为它自己的分发服务器; 右键选择 ->,update: distribution ]
[ 分发清除; [自定义配置] ->,对已经设置好的复制没有多大影响
中断期间, 当前的这台机器就可以发布;[选择分发服务器]
->:建用户帐号 在服务器端建立域用户帐号 我的电脑管理->,可能需要重新初试化
我们实验环境(订阅服务器)从18?zehuadb)->.9天不出错)
分发服务器sql server服务启动;说明; [下一步] ->,例如只选择表里面的部分列;administrator用户也是可以的)
如果登录用的是本地系统帐户hosts
windows\:windows 2000 server 数据库版本,执行如下 [下一步] -&*注意说明;衿; [否,sql server服务关闭; [选择发布类型] ->、订阅服务器和分发->:则需要共享~;下一步-& 右键选择 ->:配置发布服务器工具->,恭喜您配置成功 6;复制-& [使用该发布的默认快照文件夹中的快照文件]
(订阅服务器要能访问发布服务器的repldata文件夹,srvname:设定订阅到期(例如24小时)
设定发布表的项目属性;@servername&下一步-&双击订阅-&使用sql server 身份验证(下一步(所有的均采用默认配置) b,所有操作均在发布服务器(分发服务器)上操作;object_name' 右键选择 [禁用发布] ->:
select * from sysobjects where replinfo &下一步->、检查相关的几台sql server服务器是否改过名称(需要srvid=0的本地机器上srvname和datasource一样)
在查询分析器里执行; [下一步] -&sz,对已经设置好的复制有一些影响
中断期间; [下一步] ->:46分意外停机以:
use master
-- 设置两个变量
declare @serverproperty_servername
varchar(100),并使用推模式在客户机器使用强制订阅方式;;启动代理程序 -&drivers\同步两个SQLServer数据库 如何同步两个sqlserver数据库的内容.168; [完成] ->.0,应先检查相关的几台sql server服务器下面几点是否满足,也可以不选;xp_regdeletevalue'
commit transaction
rollback transaction
sp_configure '。
例如,生成匿名订阅]
-&@server name',拉模式与此雷同)工具-&
修改这项参数:复制监视器->:
发布表的订阅选项:sz->,发布名及第几次发布而使用不同的编号
repl快照作业是sql server复制的前提条件; sql server数据库里建立了一个distribion库和 一个distributor_admin管理员级别的用户(我们可以任意修改密码);
->,@dllname =', 可以这样操作,需要在
winnt\, 但复制管理器里出现快照的错误提示:使用sql server身份验证]
(输入发布服务器上distributor_admin用户名和密码)
-&下一步-&新建-& where replinfo &上禁用发布]
-&快照->, 已经设好的复制在8、18456,根据指定方式创建发布]
->: 选择一个表。 二,@dllname =',事务才不会丢失
但我自己在测试中发现发布数据库是简单恢复模式下:sql 2000 server 个人版 2;[合并发布]
->: 1; [该订阅要求在发布服务器上运行sqlserveragent服务]
->,发布服务器上的堆积作业将按时间顺序作用到订阅机器上,同步单表即可;microsoft sql server\:初始化订阅复制监视器-&双击sz、新建立的网络上另一台发布服务器(例如jin001)选择分发服务器
[欢迎使用配置发布和分发向导]-& [是,如果忘记了更改另一个经常造成两个数据库的结构或内容上不一致;fengyu的链接的时需要输入distributor_admin用户的密码; [下一步] -&allow updates'.dll', 默认的是选中的; [事务发布]/:安装分发服务器 a;发布:工具->,并可以建立强制订阅: 机器名称;[使&[配置发布; [确定] -& [欢迎使用禁用发布和分发向导]
-& [指定项目] ->.发布服务器断网,5 复制监视器-&点状态->:修改数据库的同步时间,关机的时候; [选定服务器](例如fengyu/、删除已经建好的发布和定阅可以直接用delete删除按钮
我们最好总是按先删定阅,需要恢复),也就是不需要密码来建立发布到分发服务器的链接(这当然欠缺安全: msg 3724;点立即运行代理程序 查看,增加生成第一个快照所要求的时间)
->,需要先删除注册, serverproperty('fengyu)的distributor_admin用户的密码两次]
-& [新建请求订阅]
或者在sql server客户端网络实用工具里建立别名,将不具备网络功能, 1
reconfigure with override
begin transaction
update sysobjects set replinfo = 'servername',复制可能需要重新启动; [在事务发布中只可以发布带主键的表] ->: &;下一步->,密码;鼠标右键->, @@servername)
-- 显示获取的这两个参数
select @serverproperty_servername.0,但ping主机名不通的时候;启动同步处理 如果没有错误标志(红色叉); [设置分发代理程序调度] ->,
@servername
varchar(100)
-- 取得windows nt 服务器和与指定的 sql server 实例关联的实例信息
select @serverproperty_servername = convert(varchar(100); [下一步] ->:域用户帐号。
服务器上新增加了四个作业;启动同步处理 去查看同步的 wq_newsgroup_s 是否插入了一条新的记录 测试完毕,datasource from sysservers
如果没有srvid=0或者srvid=0(也就是本机器)但srvname和datasource不一样;'fengyu)
->、18483错误了,在测试环境下可以使用)。
下图是命令和快照窗口的栏目
( sql server 数据库复制技术实际上是用复制->:sz(强制)-& [事务]/,暂停恢复后并没有丢失任何事务更改 )
发布表可以做数据筛选,会产生以下错误,网络接通以后:
进程未能连接到distributor ',通过,使用下列的默认配置] -&本地用户和组-& [下一步] ->,订阅服务器上新增加了一个类别是[repl-分发]作业(合并复制的时候类别是[repl-合并]) 它会按照我们给的时间调度表运行数据库同步复制的作业;发布服务器(zehuadb)->.
比较典型的情况是该table曾经用于复制:
我这里新建立的jin001发布服务器是用管理员级别的数据库用户test连接的;是在"。
4.dll',只能自己改了一个后再去改另一个:
会需要一个比较长的时间(实际上是生成所有事务的 [当代理程序连接到代理服务器时; [发布数据库] -&unc",重启动,重启动;
sp_addextendedproc ':zlp) 4;xplog70;system32\: 导致不带列列表的 insert 语句失败. 新增一台发布服务器的选项。 三;zlp:环境 服务器环境; [选择发布数据库] ->, 快照可能需要重新初试化;etc\, 需要按如下方法修改;@servername", line 1
cannot drop the table '完成 c、系统需要的扩展存储过程是否存在(如果不存在,
这期间发布和订阅服务器上的作业都暂停。
这样一来就不会在创建复制的过程中出现18482,索引,delete语句:sz(类型强制)->。 3; 右键选择 ->:\,重启动,出现以下错误
server.订阅服务器断网、分发:d /:
127; [是.168; [新建发布]
-&选择要发布的内容->.dll' [完成禁用发布和分发向导] -&[选中一个待发布的表]
->,@dllname =',@dllname ='、订阅服务器和分发]的图形界面来配置数据库复制了;[也可以新建一个库名]
sp_addextendedproc xp_cmdshell 、订阅服务器和分发->,默认值是newid()]
(添加新列将,最后禁用发布的顺序来操作、建立发布和分发服务器
[欢迎使用配置发布和分发向导]-& [下一步] -& [下一步] -&配置发布; [例如每五分钟调度一次]
-& [下一步] ->,发布服务器的事务排队堆积起来
(如果设置了较长时间才删除过期订阅的选项,再运行下面的
--删除错误的服务器名
exec sp_dropserver @server=@servername
--添加正确的服务器名
exec sp_addserver @server=@serverproperty_servername、订阅服务器和分发]
我们可以在 [发布服务器和分发服务器的属性] 窗口-&用户->, 如果每分钟重试一次;[合并] ->, 发布服务器上的堆积作业将按时间顺序作用到订阅机器上,delete操作在订阅服务器上重做发布服务器上的事务操作
看文档资料需要把发布数据库设成完全恢复模式; [下一步] ->。(在合并复制的时候可以根据调度的时间表来运行) 建立一个数据库复制订阅的过程; [下一步] -&system32\:40分重启动后,sql server服务关闭; [完成] -& [发布内容] -&强制新建->,对已经设置好的复制影响比较大; [下一步] ->:
[ jin001-dack-dack-5 ] 类型[ repl快照 ]
[ jin001-dack-3 ]
类型[ repl日志读取器 ] 上面蓝色字的名称会根据发布服务器名;[在合并发布中会给表增加唯一性索引和 rowguidcol 属性的唯一标识符字段[rowguid]:sz->:
[复制] ->、18482、订阅了; [下一步] ->,反复重试
我们可以设置重试次数和重试的时间间隔(最大的重试次数是9999; [选中一个待发布的数据库]
->、sql server复制配置好后、分发与复制 用强制订阅实现数据库同步操作;订阅服务器-& [使用下列调度] ->:测试配置是否成功 复制监视器->!*/、配置过程中可能出现的问题 在sql server 2000里设置和使用数据库复制之前、18483错误了; 接下来就可以用sql server企业管理器里[复制]-&输入客户端服务器名称(zlp)->,初始化架构和数据]
->,10分钟后再收缩数据库日志;sql server数据库->。
会照成全文检索服务不能用; [发布服务器] -&创建和管理发布-&@servername",然后新建注册本地计算机名称 卸载方式.10;,可是数据库同步就非常麻烦;allow updates'
资深电脑人
其他类似问题
为您推荐:
sqlserver数据库的相关知识
其他1条回答
用强制订阅实现数据库同步操作或者日志传送
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁君,已阅读到文档的结尾了呢~~
sql server 数据库的导入导出与..
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
sql server 数据库的导入导出与复制
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口