SQL Server查询速度慢的原因有很,常见的有以下几种:
1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)
2、I/O吞吐量小,形成了瓶颈效应。
3、没有创建计算列导致查询不优化。
4、内存不足
5、网络速度慢
6、查询出的数据量过大(可以采用多次查询,其他的方法降低数据量)
7、锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷)
8、sp_lock,sp_who,活动的用户查看,原因是读写竞争资源。
9、返回了不必要的行和列
10、查询语句不好,没有优化
●可以通过以下方法来优化查询 :
1、把数据、日志、索引放到不同的I/O设备上,增加读取速度,以前可以将Tempdb应放在RAID0上,SQL2000不在支持。数据量(尺寸)越大,提高I/O越重要.
2、纵向、横向分割表,减少表的尺寸(sp_spaceuse)
3、升级硬件
4、根据查询条件,建立索引,优化索引、优化访问方式,限制结果集的数据量。注意填充因子要适当(最好是使用默认值0)。索引应该尽量小,使用字节数小的列建索引好(参照索引的创建),不要对有限的几个值的字段建单一索引如性别字段
5、提高网速;
6、扩大服务器的内存,Windows 2000和SQL server 2000能支持4-8G的内存。
配 置虚拟内存:虚拟内存大小应基于计算机上并发运行的服务进行配置。运行 Microsoft SQL Server? 2000 时,可考虑将虚拟内存大小设置为计算机中安装的物理内存的 1.5 倍。如果另外安装了全文检索功能,并打算运行 Microsoft 搜索服务以便执行全文索引和查询,可考虑:将虚拟内存大小配置为至少是计算机中安装的物理内存的 3 倍。将 SQL Server max server memory 服务器配置选项配置为物理内存的 1.5 倍(虚拟内存大小设置的一半)。
7、增加服务器CPU个数;但是必须 明白并行处理串行处理更需要资源例如内存。使用并行还是串行程是MsSQL自动评估选择的。单个任务分解成多个任务,就可以在处理器上运行。例如耽搁查询 的排序、连接、扫描和GROUP BY字句同时执行,SQL SERVER根据系统的负载情况决定最优的并行等级,复杂的需要消耗大量的CPU的查询最适合并行处理。但是更新操作UPDATE,INSERT, DELETE还不能并行处理。
8、如果是使用like进行查询的话,简单的使用index是不行的,但是全文索引,耗空间。 like ''a%'' 使用索引 like ''%a'' 不使用索引用 like ''%a%'' 查询时,查询耗时和字段值总长度成正比,所以不能用CHAR类型,而是VARCHAR。对于字段的值很长的建全文索引。
9、DB Server 和APPLication Server 分离;OLTP和OLAP分离
10、分布式分区视图可用于实现数据库服务器联合体。
联合体是一组分开管理的服务器,但它们相互协作分担系统的处理负荷。这种通过分区数据形成数据库服务器联合体的机制能够扩大一组服务器,以支持大型的多层 Web 站点的处理需要。有关更多信息,参见设计联合数据库服务器。(参照SQL帮助文件''分区视图'')
a、在实现分区视图之前,必须先水平分区表
b、 在创建成员表后,在每个成员服务器上定义一个分布式分区视图,并且每个视图具有相同的名称。这样,引用分布式分区视图名的查询可以在任何一个成员服务器上 运行。系统操作如同每个成员服务器上都有一个原始表的复本一样,但其实每个服务器上只有一个成员表和一个分布式分区视图。数据的位置对应用程序是透明的。
11、重建索引 DBCC REINDEX ,DBCC INDEXDEFRAG,收缩数据和日志 DBCC SHRINKDB,DBCC SHRINKFILE. 设置自动收缩日志.对于大的数据库不要设置数据库自动增长,它会降低服务器的性能。
在T-sql的写法上有很大的讲究,下面列出常见的要点:首先,DBMS处理查询计划的过程是这样的:
1、 查询语句的词法、语法检查
2、 将语句提交给DBMS的查询优化器
3、 优化器做代数优化和存取路径的优化
4、 由预编译模块生成查询规划
5、 然后在合适的时间提交给系统处理执行
6、 最后将执行结果返回给用户。
软件开发网 www.mscto.com
其次,看一下SQL SERVER的数据存放的结构:一个页面的大小为8K(8060)字节,8个页面为一个盘区,按照B树存放。
12、 Commit和rollback的区别 Rollback:回滚所有的事物。 Commit:提交当前的事物. 没有必要在动态SQL里写事物,如果要写请写在外面如: begin tran exec(@s) commit trans 或者将动态SQL 写成函数或者存储过程。
13、在查询Select语句中用Where字句限制返回的行数,避免表扫描,如果返回不必要的数据,浪费了服务器的I/O资源,加重了网络的负担降低性能。如果表很大,在表扫描的期间将表锁住,禁止其他的联接访问表,后果严重。
14、SQL的注释申明对执行没有任何影响
15、 尽可能不使用光标,它占用大量的资源。如果需要row-by-row地执行,尽量采用非光标技术,如:在客户端循环,用临时表,Table变量,用子查 询,用Case语句等等。游标可以按照它所支持的提取选项进行分类: 只进 必须按照从第一行到最后一行的顺序提取行。FETCH NEXT 是唯一允许的提取操作,也是默认方式。可滚动性 可以在游标中任何地方随机提取任意行。游标的技术在SQL2000下变得功能很强大,他的目的是支持循环。有四个并发选项 READ_ONLY:不允许通过游标定位更新(Update),且在组成结果集的行中没有锁。 OPTIMISTIC WITH valueS:乐观并发控制是事务控制理论的一个标准部分。乐观并发控制用于这样的情形,即在打开游标及更新行的间隔中,只有很小的机会让第二个用户更新 某一行。当某个游标以此选项打开时,没有锁控制其中的行,这将有助于最大化其处理能力。如果用户试图修改某一行,则此行的当前值会与最后一次提取此行时获 取的值进行比较。如果任何值发生改变,则服务器就会知道其他人已更新了此行,并会返回一个错误。如果值是一样的,服务器就执行修改。 选择这个并发选项OPTIMISTIC WITH ROW VERSIONING:此乐观并发控制选项基于行版本控制。使用行版本控制,其中的表必须具有某种版本标识符,服务器可用它来确定该行在读入游标后是否有 所更改。在 SQL Server 中,这个性能由 timestamp 数据类型提供,它是一个二进制数字,表示数据库中更改的相对顺序。每个数据库都有一个全局当前时间戳值:@@DBTS。每次以任何方式更改带有 timestamp 列的行时,SQL Server 先在时间戳列中存储当前的 @@DBTS 值,然后增加 @@DBTS 的值。如果某 个表具有 timestamp 列,则时间戳会被记到行级。服务器就可以比较某行的当前时间戳值和上次提取时所存储的时间戳值,从而确定该行是否已更新。服务器不必比较所有列的值,只需 比较 timestamp 列即可。如果应用程序对没有 timestamp 列的表要求基于行版本控制的乐观并发,则游标默认为基于数值的乐观并发控制。 SCROLL LOCKS 这个选项实现悲观并发控制。在悲观并发控制中,在把数据库的行读入游标结果集时,应用程序将试图锁定数据库行。在使用服务器游标时,将行读入游标时会在其 上放置一个更新锁。如果在事务内打开游标,则该事务更新锁将一直保持到事务被提交或回滚;当提取下一行时,将除去游标锁。如果在事务外打开游标,则提取下 一行时,锁就被丢弃。因此,每当用户需要完全的悲观并发控制时,游标都应在事务内打开。更新锁将阻止任何其它任务获取更新锁或排它锁,从而阻止其它任务更 新该行。然而,更新锁并不阻止共享锁,所以它不会阻止其它任务读取行,除非第二个任务也在要求带更新锁的读取。滚动锁根据在游标定义的 SELECT 语句中指定的锁提示,这些游标并发选项可以生成滚动锁。滚动锁在提取时在每行上获取,并保持到下次提取或者游标关闭,以先发生者为准。下次提取时,服务器 为新提取中的行获取滚动锁,并释放上次提取中行的滚动锁。滚动锁独立于事务锁,并可以保持到一个提交或回滚操作之后。如果提交时关闭游标的选项为关,则 COMMIT 语句并不关闭任何打开的游标,而且滚动锁被保留到提交之后,以维护对所提取数据的隔离。所获取滚动锁的类型取决于游标并发选项和游标 SELECT 语句中的锁提示。锁提示 只读 乐观数值 乐观行版本控制 锁定无提示 未锁定 未锁定 未锁定 更新 NOLOCK 未锁定 未锁定 未锁定 未锁定 HOLDLOCK 共享 共享 共享 更新 UPDLOCK 错误 更新 更新 更新 TABLOCKX 错误 未锁定 未锁定 更新其它 未锁定 未锁定 未锁定 更新 *指定 NOLOCK 提示将使指定了该提示的表在游标内是只读的。
16、用Profiler来跟踪查询,得到查询所需的时间,找出SQL的问题所在;用索引优化器优化索引
17、注意UNion和UNion all 的区别。UNION all好
18、注意使用DISTINCT,在没有必要时不要用,它同UNION一样会使查询变慢。重复的记录在查询里是没有问题的
19、查询时不要返回不需要的行、列
20、 用sp_configure ''query governor cost limit''或者SET QUERY_GOVERNOR_COST_LIMIT来限制查询消耗的资源。当评估查询消耗的资源超出限制时,服务器自动取消查询,在查询之前就扼杀掉。 SET LOCKTIME设置锁的时间
21、用select top 100 / 10 Percent 来限制用户返回的行数或者SET ROWCOUNT来限制操作的行
22、 在SQL2000以前,一般不要用如下的字句: "IS NULL", "<>", "!=", "!>", "!<", "NOT", "NOT EXISTS", "NOT IN", "NOT LIKE", and "LIKE ''%500''",因为他们不走索引全是表扫描。也不要在WHere字句中的列名加函数,如Convert,substring等,如果必须用函数的时 候,创建计算列再创建索引来替代.还可以变通写法:WHERE SUBSTRING(firstname,1,1) = ''m''改为WHERE firstname like ''m%''(索引扫描),一定要将函数和列名分开。并且索引不能建得太多和太大。NOT IN会多次扫描表,使用EXISTS、NOT EXISTS ,IN , LEFT OUTER JOIN 来替代,特别是左连接,而Exists比IN更快,最慢的是NOT操作.如果列的值含有空,以前它的索引不起作用,现在2000的优化器能够处理了。相同 的是IS NULL,“NOT", "NOT EXISTS", "NOT IN"能优化她,而”<>”等还是不能优化,用不到索引。
23、使用Query Analyzer,查看SQL语句的查询计划和评估分析是否是优化的SQL。一般的20%的代码占据了80%的资源,我们优化的重点是这些慢的地方。
24、如果使用了IN或者OR等时发现查询没有走索引,使用显示申明指定索引: SELECT * FROM PersonMember (INDEX = IX_Title) WHERE processid IN (‘男’,‘女’)
25、将需要查询的结果预先计算好放在表中,查询的时候再SELECT。这在SQL7.0以前是最重要的手段。例如医院的住院费计算。
26、MIN() 和 MAX()能使用到合适的索引。
27、 数据库有一个原则是代码离数据越近越好,所以优先选择Default,依次为Rules,Triggers, Constraint(约束如外健主健CheckUNIQUE……,数据类型的最大长度等等都是约束),Procedure.这样不仅维护工作小,编写程 序质量高,并且执行的速度快。
28、如果要插入大的二进制值到Image列,使用存储过程,千万不要用内嵌INsert来插入(不知JAVA 是否)。因为这样应用程序首先将二进制值转换成字符串(尺寸是它的两倍),服务器受到字符后又将他转换成二进制值.存储过程就没有这些动作: 方法:Create procedure p_insert as insert into table(Fimage) values (@image), 在前台调用这个存储过程传入二进制参数,这样处理速度明显改善。
posted @
2009-01-05 10:47 石正 阅读(427) |
评论 (0) |
编辑 收藏
Gartner Group公布了IT业界未来四年来的十大新技术.
多核心处理器,虚拟化和社交网络排行前三,同时一些用户端技术也占了榜单的数个位置. Gartner建议CIO建立一个正式的机制,建立虚拟团队,选拔优秀的工作人员来研究新的思路和创新,特别是消费者所关注的新Web2.0技术,并运用这些技术来解决问题.
1. 多核心和混合处理器
2. 虚拟化和构造计算
3. 社交网络和社交软件
4. 云计算/Web平台
5. Web Mashups
6. 用户界面(加速计,无线界面,全息和三维成像等)
7. 普及计算
8. 上下文计算
9. 增强实体
10. 语义学
posted @
2008-06-17 08:52 石正 阅读(265) |
评论 (0) |
编辑 收藏
十大最不可思议的
计算机
http://club2.cat898.com/newbbs/dispbbs.asp?boardid=41&id=2189094
据英国《新科学家》杂志报道,现今的计算机利用
电子脉冲和磁体实现
信息操作和
数据储存,但是随着技术发展,还有其它更为怪异的方法处理这些信息。《新科学家》杂志列出了10大最不可思议的计算方式,包括光计算、量子计算、神经计算以及水波计算等。
1、光计算
光线传输编码信息不足为奇,因为全球通信全部依靠光缆来传输,但用光信号来处理数据和进行计算还是不切实际的。研究光计算机还是值得做的,因为使用光能加快计算机的速度和处理的数据量。
但对光的诱捕、储存以及操作依然非常困难。美国伊利诺伊州立大学保罗·布劳恩等人的研究让我们更接近这一目标。他们已经研制成一款三维光学波导光子晶体,可以诱捕光,使其降低速度,并在锐角转角处让光弯曲,而不必担心光逃逸。同时,美国哈佛大学的米哈伊尔·卢金已经开发出一种光晶体管,可以让单个光子从一个光
信号转换成另外一个光信号。
2、量子计算
如果你不再想打破所有传
统计算的规则,那么量子计算方式将最为现实。量子计算不使用传统计算的基本信息比特,而利用量子
机械效应创造量子比特,可实现平行计算,并且随着量子比特数的增加,它们处理数据的速度将呈指数形式上升,将能完成现代计算机所不能完成的事情,比如快速分解大质数、破解密码锁等。
3、DNA计算
DNA可能是完成计算的最完美材料。DNA计算的创始人是美国南加州大学的莱昂那多·阿德莱曼教授,他于1994年利用DNA计算方法解决了一个著名的数学难题“七顶点哈密尔顿路径”。最近,科学家们开始利用DNA计算来创造生物计算机,放在人体或生物体工作,其计算结果可通过荧光蛋白的活动来读取。
4、可逆计算
可逆计算通过恢复和重新利用丢失数据的这些能量来减少计算机的能耗。美国佛罗里达大学的迈克尔·弗兰克正在开发这样一种方法:每个输入操作都会产生一个输出信号,将输出信号的能量保存起来,为新的信号输入提供能量,从而创造出一种零热量产生的计算方式。
5、撞球计算
传统的计算涉及电子通过电路内部每一个分子时产生的连锁反应,而科学家们正在尝试其它种类的连锁反应,包括多米诺或者大理石的连锁反应。
但是
制作这样的微处理器可能需要很大空间,除非多米诺或者大理石也很小。美国IBM公司的研究人员已经开始实验这种逻辑电路,通过使用原子互相撞击传递信息。尽管这种逻辑门只能使用一次,但是它却比现有的最小晶体管还要小很多。
6、神经元计算
研究神经元通常是指模仿人类大脑的计算方式。芝加哥
西北大学的费尔迪南多·莫沙-伊万迪正在研究如何利用七鳃鳗的大脑细胞控制机器人。
从机器人身上的光敏感元件上输出信号传递给神经元,神经元的反馈再反过来用来控制机器人的动作。此外,英国纽卡斯尔大学的神经学家克莱尔·林德受《星球大战》电影中记录的一只蝗虫的启发,开发出一种非常精确的故障排除系统。美国国防部高级研究计划署近来正在利用飞蛾大脑的电子元件,尝试遥控半机械昆虫间谍——飞蛾。
7、核磁共振计算
如果你知道如何操作水,那么每杯水就是一台电脑。英国约克大学的苏珊·斯特尼及其同事使用核磁共振强磁场来控制和观察分子的交互作用,这种方法能够以三维方式表现信息。如果研究能够成功,只要一杯水就可以模拟大气。然而这个研究小组只完成了原理证明。
8、Glooper计算机
这可能是最不可思议的计算机之一,它使用gloopware当硬件。英国西英格兰大学的安德鲁·亚当马特兹可以在一种化学制剂中制造干涉离子波,其行为要充当逻辑门。此波通过脉冲循环化学反应产生。亚当马特兹安德鲁已经展示其化学逻辑门可用于制造机器手臂。当机器人手指进行模仿动作时,化学反应就被触发,进而控制这只手。
9、霉变计算机
即使像粘菌这样的原始生物也可以被用来解决现今计算机难以处理的问题。日本北海道大学的Toshiyuki Nakagaki及其同事首次证实粘菌能够找到最短路线通过迷宫。
在他们的试验中,一种阿米巴门原生质粘菌起初也是尝试所有路径走出迷宫的。当这种生物找出最短路径通往有食物的出口时就不再找别的路线了,直奔食物去了。对于计算机专家们来说,这是一个非常有趣的实验,可解决行销推销员的问题。
10、水波计算
最不可思议的就是计算机竟然以水波为动力。英国苏塞克斯大学的克莉森西娅·费尔南多等利用波动箱和高架
摄像机,用水波动模式制造出一种逻辑门,称作“异或门(exclusive OR gate)”。人造神经网络感知器可以模仿一些逻辑门,但不能模仿异或门。费尔南多实现了这种逻辑门的工作原理。
posted @
2008-04-17 17:49 石正 阅读(276) |
评论 (0) |
编辑 收藏
驻伊美军机器人叛乱平息 20年内不再考虑机器人
http://club2.cat898.com/newbbs/dispbbs.asp?boardid=41&id=2189098
去年刚刚进驻伊拉克的美军重装遥控机器人系统SWORDS,也许永远都不会有机会上阵杀敌,摧城拔寨了。事实上,这种配备有M249轻机枪的机器人从未放过一枪一弹,便被迅速撤出战场——因为它们做了更可怕的事情:将枪口对向它们的人类指挥官。
在
新闻发布会上,美国陆军地面作战指挥官凯文·法赫称,这些机器人“将它们的机枪指向未受批准的方向”。显然,这意味着这些机器人遭遇了严重
事故,将枪口指向友军部队。而这也导致了这支机器人部队在正式部署前线仅11小时便被召回。
法赫证实机器人并未开火,也没有任何人类在此次事变中伤亡。但这并不意味着零损失,所有关于机器人作战的研究项目都可能因之取消。法赫称:“一旦遇到如此严重的事变,我们必须花上10年乃至20年,推倒重来。”因此,我们必须再等上很久才能看到机器人和人类并肩作战了。
这不仅仅对于机器人工业是重大损失,而且也树立了一个重要先例:关于机器人的任何试验都必须以无人类伤亡为绝对前提。也许对一切事故的极度厌恶,终将导致此领域的任何创新都步履维艰。
posted @
2008-04-17 17:32 石正 阅读(216) |
评论 (0) |
编辑 收藏
http://www.ugia.cn/?p=121
http://hi.baidu.com/momoca/blog/item/422a73f023999fafa40f52b1.html
posted @
2008-04-02 11:03 石正 阅读(591) |
评论 (0) |
编辑 收藏
软件企业技术路线:项目\产品\队伍
项目为企业近期发展发展积累资金;
产品为企业中期发展创造条件;
队伍是企业长期发展的根本;
企业可以根据自身的长期发展计划,制定近期的发展计划;
在有条件时,应该首先建设队伍,其次设计产品,再次做项目;
实际执行时,往往是3者混合进行的;
作为企业的主要负责人,管理人员,乃至对企业发展关心的员工,都应该明确企业发展的基本规律.来指导日常的工作实践。
posted @
2008-03-03 08:30 石正 阅读(1157) |
评论 (1) |
编辑 收藏
杀人的历史评传——刘邦杀韩信
http://club2.cat898.com/newbbs/dispbbs.asp?boardid=2&id=2067439
posted @
2008-02-27 11:18 石正 阅读(356) |
评论 (0) |
编辑 收藏
匈牙利科学家发明狗吠
翻译机 准确率达43%
http://club2.cat898.com/newbbs/dispbbs.asp?boardid=41&id=2040695
为了让狗的主人能够更好的了解自己
爱犬发出的叫声所表达的含义,匈牙利科学家日前发明了一种
计算机程序,该程序可以将狗的叫声“翻译”成人类能够听懂的语言。该程序
分析的准确率高达43%。
据报道,这个特殊的计算机程序是在分析了来自匈牙利14个地区6000多只牧羊犬在6种不同场合的叫声后设计而成的。这六种场合分别为:当只有一条狗时的叫声、狗之间发生冲突时候的叫声、当狗看到球后的叫声、当狗玩耍时发出的叫声和当狗看到陌生者时的叫声以及散步时发出的叫声。
据了解,来自匈牙利埃托沃罗兰德
大学的生态学
研究者查巴和他率领的科研团队通过研究发现,安装这种特殊软件程序的计算机能够准确分析出狗发出叫声所表达的含义。他们将狗的叫声被用录音设备记录下来,随后在计算机上进行数字化处理,然后研究人员使用计算机软件研究这些狗的叫声,以便分析这些叫声的不同之处。
研究人员发现,计算机基本能正确的辨别狗的叫声,计算机在分析狗所表达“打架”和“陌生者”这两种叫声时非常准确,高达43%。尽管辨别的
成功率不是很高,但是这个数字是人类无法比拟的。科学家表示,这个分析软件的识别率还有待于改善。
通过研究发现,狗之所以发出的叫声不同是由于它们的情绪受到相应影响的原因所致。查巴说:“如果这种设备研制成功投入使用的话,将有助于人类了解他们的爱犬日常都在‘说’些什么。”查巴表示,通过研究狗儿们发出不同的叫声可以分析出它们传递着相应的信息,这使得没有养狗经验的人也能知道狗为什么而叫。
据悉,该科研团队还计划研究其它动物的叫声,以便发现它们之间的共同之处。有关该研究的结果已经刊登在近日出版的《动物识别能力》杂志上。
posted @
2008-01-22 13:55 石正 阅读(276) |
评论 (0) |
编辑 收藏
浅陋见解,仅供参考。抛砖引玉,多加指教!