此条最简单的select语句如何优化

咏帆 2009-07-04 09:31:33
有如下表:

CREATE TABLE [dbo].[tb](
[ID] [int] IDENTITY(1,1) NOT NULL,
[A] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[B] [datetime] NULL,
CONSTRAINT [PK_tb] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]


此表有200多万条记录,在要此表上执行一条简单的select语句,
如:

select B from tb where A='adfsadfksfk'


此条语句每天要执行200万次左右,请问有什么办法让这知select语句执行得更快

补充:以在A字段上建立了索引,暂时无法从硬件上面来增加CPU,内存等.

在线等,谢谢大家.
...全文
117 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzz1975 2009-07-05
  • 打赏
  • 举报
回复
转贴
查询速度慢的原因很多,常见如下几种:
  
  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分离
nocross2009 2009-07-05
  • 打赏
  • 举报
回复
将A列改成聚集索引,200万条数据不多,改成聚集索引后看看查询IO消耗,不过,一秒种23次查询的确对服务器硬件要求很高。如果还不成,那只能考虑硬件升级了。
pqcong1982 2009-07-04
  • 打赏
  • 举报
回复
ID跟A的索引顺序调整一下.把A调到ID的上面.可以再优化一点.
htl258_Tony 2009-07-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 playwarcraft 的回复:]
每天要执行200万次左右 , 1天24hours*60m*60s ,平均每秒23次操作。。。。
这这。。。
[/Quote].
csdyyr 2009-07-04
  • 打赏
  • 举报
回复
--try
(A,B)两字段建立复合索引。
咏帆 2009-07-04
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 claro 的回复:]
查询语句没优化的可能,因为简单到极致。
建议考虑数据库分区减少查询数据量等其他方式。
[/Quote]

请问:如何减少查询数据量呢?因为必需要从这200多万条记录中查询

关于分区:这200多万条记录已经在一个表里面了,怎么再将他分区呢?(分区我还没用过的,我的理解是:建立数据库分区后,只有后来新增的数据在会分布到新的分区上面吧)
--小F-- 2009-07-04
  • 打赏
  • 举报
回复
只剩下分区和升级硬件了
feixianxxx 2009-07-04
  • 打赏
  • 举报
回复
语句 就这么简单 还怎么优化。。。
feixianxxx 2009-07-04
  • 打赏
  • 举报
回复
数据库分区
claro 2009-07-04
  • 打赏
  • 举报
回复
查询语句没优化的可能,因为简单到极致。
建议考虑数据库分区减少查询数据量等其他方式。
咏帆 2009-07-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 playwarcraft 的回复:]
每天要执行200万次左右 , 1天24hours*60m*60s ,平均每秒23次操作。。。。
这这。。。
[/Quote]

是的,我们的一个应用用户量比较大!
csdyyr 2009-07-04
  • 打赏
  • 举报
回复
连-->两
csdyyr 2009-07-04
  • 打赏
  • 举报
回复
(A,B)连字段建立索引。
playwarcraft 2009-07-04
  • 打赏
  • 举报
回复
每天要执行200万次左右 , 1天24hours*60m*60s ,平均每秒23次操作。。。。
这这。。。
ChinaJiaBing 2009-07-04
  • 打赏
  • 举报
回复
CREATE TABLE [dbo].[tb](
[ID] [int] IDENTITY(1,1) NOT NULL,
[A] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[B] [datetime] NULL,
CONSTRAINT [PK_tb] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]



此表有200多万条记录,在要此表上执行一条简单的select语句,
如:
SQL code
select B from tb where A='adfsadfksfk'

改建的都建了.
提升硬件配置...


咏帆 2009-07-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 liangck 的回复:]
没优化了.
[/Quote]


有什么办法让这条语句执行得更快些呢
liangCK 2009-07-04
  • 打赏
  • 举报
回复
没优化了.
cxmcxm 2009-07-04
  • 打赏
  • 举报
回复
1.对A列建索引
2.如果A列内容是有规律的,可根据规律将表拆分为多个,先对查询的值进行比较,再决定到哪个表查询.
hui_hui_2007 2009-07-04
  • 打赏
  • 举报
回复
你的表,如果不是经常更新,增加记录,在 id 列上建聚集索引就不好的。
因为你的 where 条件用不到 id 列。
你用到的是A列呀。
hui_hui_2007 2009-07-04
  • 打赏
  • 举报
回复
你以将自增列做为聚集索引,能不能将A列改为聚集索引呢?
如果你的 where 条件总是判断 A 时。
加载更多回复(4)

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧