当前位置: 代码迷 >> Sql Server >> 2000W数据的查询太慢了,求解决办法
  详细解决方案

2000W数据的查询太慢了,求解决办法

热度:44   发布时间:2016-04-24 19:56:55.0
2000W数据的查询太慢了,求解决方法
最近很火的数据库搞到了。不过I3、4G的机器表示跑SQL语句压力太大,各位有什么办法么??
例如:
  select COUNT(CtfId) from cdsgus
就要接近3分钟。
最后把表结构给贴出来:
SELECT TOP 1000 [Name]
      ,[CardNo]
      ,[Descriot]
      ,[CtfTp]
      ,[CtfId]
      ,[Gender]
      ,[Birthday]
      ,[Address]
      ,[Zip]
      ,[Dirty]
      ,[District1]
      ,[District2]
      ,[District3]
      ,[District4]
      ,[District5]
      ,[District6]
      ,[FirstNm]
      ,[LastNm]
      ,[Duty]
      ,[Mobile]
      ,[Tel]
      ,[Fax]
      ,[EMail]
      ,[Nation]
      ,[Taste]
      ,[Education]
      ,[Company]
      ,[CTel]
      ,[CAddress]
      ,[CZip]
      ,[Family]
      ,[Version]
      ,[id]
  FROM [testdb].[dbo].[cdsgus]


最后再来个截图(带码的):
2000万 sql语句 速度慢 数据库 查询

------解决方案--------------------
建议你在你查询条件字段上建立索引,这样查询速度就快多了
------解决方案--------------------
首先这种全表扫描快不了,然后,如果ctfid不重复,可以用这个语句来查询总数:
SELECT rowcnt FROM sys.sysindexes WHERE id=OBJECT_ID('cdsgus') AND indid=0
------解决方案--------------------
address有索引的话就差不多了,但是有筛选条件的话不能用我那个语句,我那个是统计表上的数量用的
------解决方案--------------------
全表查,索引没什么用的,where条件上有索引就“可能”有效
------解决方案--------------------
再说明一下,全表扫描即使硬件很牛,也不会有明显的效果,要提高速度,还是要靠控制数据量比如加where条件等方法。或者借助其他第三方工具,或者非实时统计的前提下,定期预先统计并保存起来,获取一个大概值
------解决方案--------------------
这种情况,主要是建索引哈,我之前公司的表数据接近1.5亿条,加了索引,select count(*) 也就几秒就出来了哈。

由于原来公司的查询语句非常复杂,不过不建索引,估计查1个小时,也查询不出来。

另外,比如你用address作为查询条件,一般就对address列建一个索引,能明显提高查询速度。

升级硬件的话,主要是加内存,和多加几个硬盘。
------解决方案--------------------
通过非聚集索引让select count(*) from 的查询速度提高几十倍、甚至千倍 
http://blog.csdn.net/yupeigu/article/details/12646371
------解决方案--------------------
count(*)是直接取统计信息的吧,如果没更新统计,才全表扫描。。。。
------解决方案--------------------
引用:
count(*)是直接取统计信息的吧,如果没更新统计,才全表扫描。。。。
请教依据何来?个人认为如果你的说法是对的话,那无论表是500行还是500亿行,只要统计信息准确,应该都是秒杀吧?而且清空buffer pool,执行一次,应该会看到buffer里面会有很多页
------解决方案--------------------

CREATE INDEX Nameindex ON cdsgus (Name)
经常要查询名字,所以在名字上建索引,经过建立索引,发现一般查询完成时间不会超过5秒,没建索引前将近三分钟,大概见一个索引会占用60兆左右的空间
SELECT * FROM cdsgus WHERE Name='张三'AND Address LIKE '%湖北%'
查询湖北的张三


------解决方案--------------------
引用:
Quote: 引用:


CREATE INDEX Nameindex ON cdsgus (Name)
经常要查询名字,所以在名字上建索引,经过建立索引,发现一般查询完成时间不会超过5秒,没建索引前将近三分钟,大概见一个索引会占用60兆左右的空间
SELECT * FROM cdsgus WHERE Name='张三'AND Address LIKE '%湖北%'
查询湖北的张三


在name上创建一个索引好慢呀,还超时,怎么办??

直接用脚本操作 不要用UI 。 
------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:


CREATE INDEX Nameindex ON cdsgus (Name)
经常要查询名字,所以在名字上建索引,经过建立索引,发现一般查询完成时间不会超过5秒,没建索引前将近三分钟,大概见一个索引会占用60兆左右的空间
SELECT * FROM cdsgus WHERE Name='张三'AND Address LIKE '%湖北%'
查询湖北的张三


在name上创建一个索引好慢呀,还超时,怎么办??

直接用脚本操作 不要用UI 。 


我的双核2.7,4g内存,貌似创建索引时用了5分钟左右,没有超时,不过弹出了一个警告信息,具体也记不清了,但我没管它,直接去查询,发现速度的确比没创建索引时快了n倍
------解决方案--------------------
  相关解决方案