sql2008查询优化
Ⅰ sqlserver2008 查询优化 select top 100 * from Table where a=0 and b=211 Order by c DESC, Id ASC
在该语法中,yyyy 为年代,mm 为月份,而 dd 则为日期。驱动程序将用等价的特定于 DBMS 的表示替换这个转义子句。例如,如果 '28- FEB-99' 符合基本数据库的格式,则驱动程序将用它替换 。
对于 TIME 和 TIMESTAMP 也有类似的转义子句:
TIMESTAMP 中的小数点后的秒(.f . . .)部分可忽略。
call 或 ? = call 表示已存储过程
如果数据库支持已存储过程,则可从 JDBC 中调用它们,语法为:
或(其中过程返回结果参数):
方括号指示其中的内容是可选的。它们不是语法的必要部分。
输入参数可以为文字或参数。有关详细信息,参见 JDBC 指南中第 7 节,“CallableStatement”。
可通过调用方法 DatabaseMetaData.supportsStoredProceres 检查数据库是否支持已存储过程。
Ⅱ 如何使用sql server 2008的查询分析优化器
本篇介绍在SQL Server中查询优化器的工作方式,也就是一个好的执行计划的形成,是如何评估出来的,作为该系列的进阶篇。
http://www.cnblogs.com/jianliutang/p/4175551.html
Ⅲ sql server数据库查询慢怎么优化
在安装有SQLServer数据库的计算机上,我们在使用数据库的过程中,有时候会在任务管理器里发现sqlservr.exe这个进程的内存和CPU占用率较高。
接下来我们来看一下,如何解决上面这个问题,需要设置SQLServer数据库的内存配置。登录数据库,这里使用的是SQLServer2008,右键点击最上方的服务器名,在弹出的菜单中,点击【属性】
打开服务器属性窗口。默认显示的是第一项【常规】内容,点击第二项【内存】进行内存配置。
点击【内存】后,打开服务器内存选项配置界面。这里的【使用AWE分配内存】可以对内存进行扩展支持,我们要做的是更改下方的最大服务器内存。这个数值根据自己服务器内存大小来做适当设置。
5
个人建议设置本机内存的一半或稍微高一点,如机器内存为2G,那么我们这里填写1000。需要注意的是内存设置调小以后,在数据库执行较复杂SQL语句的时候,可能会比较慢,出现这种情况,我们再适当上调最大内存配置大小。
Ⅳ SQL数据库查询的优化
这个问题太大了,不懂就加内存,加CPU,用RAID存储。
Ⅳ 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
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 '«c%'
若要提高效率,可以考虑全文检索。
7.如果在 where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:
select id可以改为强制查询使用索引:
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,'2005-11-30')=0--‘2005-11-30’生成的id
应改为:
select id from t where name like 'abc%'
select id from t where createdate>='2005-11-30' and createdate<'2005-12-1'
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(selectnum 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.尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。
Ⅵ sql 查询优化
4000多只是实验用最基本数据表啊。
查询速度还不能保证的话,严格的说数据库本身性能是不能让人满意的
其次,为什么同样的语句要执行数百遍,不能够公用吗?,本身减少查询的次数,也是一种优化。
从硬件上说,可以讲这两张表放入数据库缓存中进行缓存查询,这样可以极大地提高效率(数据库优化机制中,最常用的缓存其实是放在内存中的),四千多的表应该不会多大的,缓存肯定放的进去。
看你的语句,只怕是用web也就是其它语言调用数据库的,本身接口设计就是一个大问题,这需要资深人士配合。
总体老说,如果你的数据库连四千数据量的多次查询都会导致性能缓慢(尤其是不怎么占用存储的count计算都会导致性能下降)的话,首先应该考虑的数据库本身的优化。更换设备可能是一个不错的选择。
Ⅶ Sql server 2008 R2优化问题
考勤也是按照每个月一次统计吧?为何不把历史不需要频繁查询的数据放到一个历史记录表中?
首先我建议楼主制定作业,每个月考勤借宿后就把历史数据加转移到历史表中,然后再根据优化的一般原则来处理。估计让你提供硬件升级是不现实的,那么就数据库系统而言。可以通过对索引的优化或者重建或者新建来达到一定的优化效果。考勤软件一般是购买的,更改查询语句也很难实现。
Ⅷ 怎么优化 sql server2008 网络吞吐量
1.1 基本概念 与数据库技术密切相关的基本概念包括:数据、数据库、数据库管理系统和数据库系统四大概念。1. 数据(Data) 数据是对客观事物的一种描述,是由能被计算机识别与处理的数值、字符等符号构成的集合,即数据是指描述事物的符号记录。 广义地说,数据是一种物理符号的序列,用于记录事物的情况,是对客观事物及其属性进行的一种抽象化及符号化的描述。数据的概念应包括数据的内容和形式两个方面。数据的内容是指所描述的客观事物的具体特性,也就是通常所说的数据的“值”;数据的形式则是指数据内容所存储的具体形式,即数据的“类型”。故此,数据可以用数据类型和值来表示。2. 数据库(Data Base,DB) 数据库是指长期存储在计算机内部、有组织的、可共享的数据集合,即在计算机系统中按一定的数据模型组织、存储和使用的相关联的数据集合成为数据库。 数据库中的数据按照一定的数据模型组织、描述和存储,具有较小的冗余度、较高的数据独立性、易扩展性、集中性和共享性,以文件的形式存储在存储介质上的。数据库中的数据由数据库管理系统进行统一管理和控制,用户对数据库进行的各种数据操作都是通过数据库管理系统实现。3. 数据库管理系统(Data Base Management System,DBMS) 数据库管理系统是数据库系统的核心,是为数据库的建立、使用和维护而配置的软件,是位于操作系统与用户之间的一层数据管理软件。主要功能是对数据库进行定义、操作、控制和管理。1) 数据定义 数据的定义包括:定义构成数据库结构的外模式、模式和内模式,定义各个外模式和模式之间的映射,定义模式与内模式之间的映射,定义有关的约束条件。2) 数据处理对数据的处理操作主要包括对数据库数据的检索、插入、修改和删除等基本操作。3) 安全管理 对数据库的安全管理主要体现在:对数据库进行并发控制、安全性检查、完整性约束条件的检查和执行、数据库的内部维护(如索引、数据字典的自动维护)等。并且能够管理和监督用户的权限,防止拥护有任何破坏或者恶意的企图。4) 数据的组织、存储和管理 负责分类地组织、存储和管理数据库数据,确定以何种文件结构和存取方式物理地组织数据,如何实现数据之间的联系,以便提高存储空间利用以及提高随机查找、顺序查找、增加、删除和查改等操作的时间效率。5) 建立和维护数据库 建立数据库包括数据库数据的初始化与数据转换等。维护数据库包括数据库的转储与恢复、数据库的重组织与重构造、性能的监视与分析等。6) 数据通信接口提供与其他软件系统进行通信的功能。4. 数据库系统(Data Base System,DBS) 数据库系统指在计算机系统中引入数据库后的系统构成,一般有数据库、数据库管理系统、应用系统、数据库管理员和用户构成。1.2 数据库系统的特点 数据库系统的点主要有:数据的结构化、高共享性、低冗余度、易扩充、较高的独立性(物理数据独立、逻辑数据独立)以及数据由DBMS统一管理和控制(数据的安全性Security保护、数据的完整性Integrity保护、并发Concurrency控制、数据库恢复Recovery)等。第二章 数据库性能优化 数据库作为一种独立的、有组织、的可共享的数据集合,数据的查询访问是数据操作中频度最高的操作。当数据量和访问频率达到一定程度的时候,系统的响应速度就至关重要了,这时候就需要对数据库数据存储的结构和方式进行优化,使其满足系统需要的访问响应速度。2.1 性能影响因素 常见的影响数据访问速度的因素,有以下几种:1. 没有索引或者没有用到索引 数据库索引就像书籍中目录一样,使用户在访问数据库数据时,不必遍历所有数据就可以找到需要的数据。创建索引后,可以保证每行数据的唯一性,极大地提高数据检索效率,这是一中牺牲空间换取性能的方法。没有索引或者没有用到索引是数据访问速度慢最常见的因素,也是程序设计的一个缺陷所在。2. I/O吞吐量小,形成了瓶颈效应 I/O吞吐量是影响数据访问速度的客观因素(硬件因素)。在一定的硬件环境下,利用优化的部署方案可适当提高I/O吞吐量。3. 没有创建计算列导致查询不优化 计算列是一个比较特殊的列,不填写任何设计类型,用户不可以改变该列的值。计算列的值是通过一定的函数公式等以另一个或多个列的值为输入值计算出的结果。如果没相应的计算列,在一些数据查询的时候需要对已有数据进行计算,从而浪费一部分性能。4. 内存不足 对数据库数据的查询访问毫无疑问会占用大量的内存空间,当内存不足的情况下,数据的访问速度会受到明显的影响甚至访问出现超时情况,是影响数据访问速度的客观因素。5. 网络速度慢 网络速度慢是影响数据访问速度的客观因素。可通过提高网络访问的位宽来解决。6. 查询出的数据量过大 当查询出的数据量过大时,内存的占用、系统时间的占用等都影响数据访问的速度。可以采用多次查询、定位查询、和查询数据量控制来解决。7. 锁或者死锁 锁或者死锁在数据库数据访问时会造成访问者等待时间过程或者永久无法获取到资源。这是查询慢最常见的因素之一,是程序设计的缺陷,要尽量避免。8. 返回不必要的行和列 在一般的数据查询中,都尽可能多的获取数据信息,这样造成了不必要的数据遍历,大大的增加了数据访问的响应的时间。所以在一般的查询中,尽量查询少的行和列,将数据遍历时间降到最低以满足数据输出需求。9. 查询语句不够优化 在数据查询访问过程中,使用最频繁的是使用自定义的查询语句进行数据输出的。所以编写优化的查询语句能够很大程度上提高数据查询访问的速度。2.2 性能优化 数据库性能优化主要是提高数据访问的速度,即提高数据库响应速度的性能指标。性能优化主要分为主观因素和客观因素两部分的优化。这里主要针对影响性能的客观因素进行优化。2.2.1 主观因素优化 主观因素主要是指服务器的硬件环境。主要优化有以下几个方面:1、 把数据、日志、索引放到不同的I/O设备上,增加读取速度,数据量越大,提高I/O吞吐量越重要;2、 纵向、横向分割表,减少表的尺寸(sp_spaceuse);3、 升级硬件;4、 提高网络访问速度;5、 扩大服务器的内存;配置虚拟内存:虚拟内存大小应基于计算机上并发运行的服务进行配置,一般设置为物理内存的1.5倍;如果安装了全文检索功能,并打算运行Microsoft搜索服务以便执行全文索引和查询,可考虑将虚拟内存大小设置为至少计算机中物理内存的3倍;6、 增加服务器CPU个数;其中并行处理比串行处理更需要资源。SQL SERVER根据系统负载情况决定最优的并行等级,复杂的需要消耗大量的CPU的查询适合并行处理。不过更新操作UPDATE、INSERT、DELETE不能进行并行处理。 2.2.2 客观因素优化 客观因素主要指的是由于设计和开发中存在的缺陷和漏洞;主要优化有以下几个方面:1. 优化索引(1) 根据查询条件建立优化的索引、优化访问方式,限制结果集的数据量。注意填充因子要适当(最好是使用默认值0)。索引应该尽量小,使用字节数小的列建里索引(参照索引的创建),不要对有限的几个值的字段建立单一索引(如性别字段)。(2) 如果使用LIKE进行查询的话,简单的使用INDEX是不行的,全文索引又太耗费空间。LIKE ‘N%’使用索引,LIKE ‘%N’不使用索引。用LIKE‘%N%’查询时,查询耗时和字段值总长度成正比,所以不能用CHAR类型而采用VARCHAR。对于字段的值很长的字段建立全文索引。(3) 重建索引DBCC REINDEX,DBCC INDEXDEFRAG,收缩数据和日志DBCC SHRINKDB,DBCC SHRINKFILE。设置自动收缩日志,对与大的数据库不要设置数据库自动增长,它会降低服务器的性能。2. 数据库部署优化(1) DB SERVER和APPLICATION SERVER分离,OLTP和OLAP分离;(2) 使用分区视图。分布式分区视图可用于实现数据库服务器联合体,联合体是一组分开管理的服务器,他们互相协作分担系统的处理负荷。A、在实现分区视图之前,必须先水平分区表。B、在创建成员表后,在每个服务器上定义一个分布式分区视图,并且每个视图具有相同的名称。这样引用分布式分区视图名的查询可以在任何一个成员服务器上运行。系统操作如同每个成员服务器都有一个原始表的复本一样,不过每个服务器上其实只有一个成员表和一个分布式分区视图。数据的位置对应用程序是透明的。3. 查询语句优化 T-SQL的写法上有很大的讲究,DBMS处理查询计划的过程是:a、查询语句的词法、语法检查;b、将语句提交给DBMS的查询优化器;c、优化器做代数优化和存取路径的优化;d、由预编译模块生成查询规划;e、在合适的时间提交给系统处理执行;f、将执行结果返回给用户。(1) COMMIT和ROLLBACK的区别:ROLLBACK回滚所有的事务;COMMIT提交当前的事务。在动态语句中写事务,请将事务写在外面,如:BEGIN TRAN EXEC(@SQL) COMMIT TRANS或者将动态SQL写成函数或者存储过程。(2) 在大数据两的查询输出SELECT语句中尽量不要使用自定义函数,调用自定义函数的函数时系统调用是一个迭代过程,很影响查询输出性能的。在查询字段时尽可能使用小字段两输出,并在WHERE子句或者使用SELECT TOP 10/1 PERCENT来限制返回的记录数,使用SET ROWCOUNT来限制操作的记录数,避免整表扫描。返回不必要的数据,不但浪费了服务器的I/O资源,加重了网络的负担,如果表很大的话,在表扫描期间将表锁住,禁止其他的联接访问,后过很严重的。(3) SQL的注释申明对执行查询输出没有任何影响。(4) 使用计算列对数据进行简单计算,尽量避免在查询语句中对数据进行运算。(5) 尽可能不使用光标,它会占用大量的资源。如果需要ROW-BY-ROW地执行,尽量采用非光标技术,如:客户端循环、临时表、TABLE变量、子查询、CASE语句等等。(6) 使用PROFILER来跟踪查询,得到查询所需的时间,找出SQL的问题所在,用索引优化器优化索引。(7) 注意UNION和UNION ALL的区别。在没有必要的时候不要用DISINCT,它同UNION一样会降低查询速度,重复的记录在查询里是没有问题的。(8) 用sp_configure ‘query governor cost limit’或者 SET QUERY_COVERNOR_COST_LIMIT来限制查询消耗的资源。当评估查询消耗的 资源超出限制时,服务器自动取消查询,在查询之前就扼杀掉。SET LOCKTIME 设置锁的时间。(9) 不要在WHERE子句中列名加函数,如CONVERT,SUBSTRING等,如果必须用函数的时候,创建计算列在创建索引来替代。NOT IN会多次扫描表,使用EXISTS、NOT EXISTS、IN、LEFT OUTER JOIN来替代,其中EXISTS比IN更快,最慢的NOT操作。(10) 使用QUERY ANALYZER,查看SQL语句的查询计划和评估分析是否是优化的SQL。一般20%的代码占用了80%的资源,优化的重点就是这些慢的地方。(11) 如果使用了IN或者OR等时发现查询没有走索引,使用显式申明指定索引,如:Select * From FA01(INDEX=IX_SEX) Where AA0107 IN(‘01’,‘02’)。(12) 在需要对已有数据进行比较复杂计算才能获得查询的结果数据时,将需要查询的结果预先计算好放在表中,查询的时候在SELECT。(13) 数据库有一个原则是代码离数据越近越好,所有有限选择DEFAULT,依次为RULES,CONSTRAINT,PROCEDURE来编写程序的质量高,速度快。如果要插入大的二进制到IMAGE列,使用存储过程,千万不要用内嵌INSERT直接插入。因为这样应用程序首先将二进制转换成字符串,服务器收到字符后又将他转换成二进制。存储过程直接传入二进制参数即可,处理速度明显改善,如:CREATE PROCEDURE image_insert @image varbinary as Insert into table(fImage) values(@image)。(14) Between在某些时候比IN速度更快,更快地根据索引找到范围。由于IN会比较多次,所以有时会慢些。(15) 尽量不要建没有作用的事务例如产生报表时,浪费资源,只有在必须使用事务时才建立合适的事务。(16) 用OR的字句可以分解成多个查询,并通过UNION连接多个查询。速度取决与是否使用索引。如果查询需要用联合索引,用UNION ALL执行的效率更高些。(17) 尽量少用视图,视图的效率低。对视图操作比直接对表操作慢,可以用SRORED PROCEDURE来代替。特别是不要用视图嵌套,嵌套视图增加了寻找原始资料的难度。视图是存放在服务器上的被优化好了的已经产生查询规划的SQL。对单表数据检索时,不要使用指向多表的视图,否则增加了不必要的系统开销,查询也会受到干扰。没有必要时不要用DISTINCT和ORDER BY,这些动作可以改在客户端执行,增加了额外的开销,这同UNION和UNION ALL原理相同。(18) 当使用SELECT INTO和CREATE TABLE时,会锁住系统表(SYSOBJECTS,SYSINDEXES等),从而阻塞其他的连接的存取。所以千万不要在事务内部使用。如果经常要用到临时表时请使用实表或者临时表变量。尽量少用临时表,用结果集和TABLE类型的变量来代替。(19) 在使用GROUP BY HAVING子句时,在使用前剔除多余的行,尽量避免使用HAVING子句剔除行工作。剔除行最优的执行顺序是:SELECT的WHERE子句选择所有合适的行,GROUP
Ⅸ sql server 怎么优化查询
1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)
2、I/O吞吐量小,形成了瓶颈效应。
3、没有创建计算列导致查询不优化。
4、内存不足
5、网络速度慢
6、查询出的数据量过大(可以采用多次查询,其他的方法降低数据量)
7、锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷)
8、sp_lock,sp_who,活动的用户查看,原因是读写竞争资源。
9、返回了不必要的行和列
10、查询语句不好,没有优化