2000W数据的查询太慢了,求解决办法
2000W数据的查询太慢了,求解决方法
最近很火的数据库搞到了。不过I3、4G的机器表示跑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.****.net/yupeigu/article/details/12646371
------解决方案--------------------
count(*)是直接取统计信息的吧,如果没更新统计,才全表扫描。。。。
------解决方案--------------------
请教依据何来?个人认为如果你的说法是对的话,那无论表是500行还是500亿行,只要统计信息准确,应该都是秒杀吧?而且清空buffer pool,执行一次,应该会看到buffer里面会有很多页
------解决方案--------------------
CREATE INDEX Nameindex ON cdsgus (Name)
经常要查询名字,所以在名字上建索引,经过建立索引,发现一般查询完成时间不会超过5秒,没建索引前将近三分钟,大概见一个索引会占用60兆左右的空间
SELECT * FROM cdsgus WHERE Name='张三'AND Address LIKE '%湖北%'
查询湖北的张三
------解决方案--------------------
直接用脚本操作 不要用UI 。
------解决方案--------------------
我的双核2.7,4g内存,貌似创建索引时用了5分钟左右,没有超时,不过弹出了一个警告信息,具体也记不清了,但我没管它,直接去查询,发现速度的确比没创建索引时快了n倍
------解决方案--------------------
最近很火的数据库搞到了。不过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.****.net/yupeigu/article/details/12646371
------解决方案--------------------
count(*)是直接取统计信息的吧,如果没更新统计,才全表扫描。。。。
------解决方案--------------------
请教依据何来?个人认为如果你的说法是对的话,那无论表是500行还是500亿行,只要统计信息准确,应该都是秒杀吧?而且清空buffer pool,执行一次,应该会看到buffer里面会有很多页
------解决方案--------------------
CREATE INDEX Nameindex ON cdsgus (Name)
经常要查询名字,所以在名字上建索引,经过建立索引,发现一般查询完成时间不会超过5秒,没建索引前将近三分钟,大概见一个索引会占用60兆左右的空间
SELECT * FROM cdsgus WHERE Name='张三'AND Address LIKE '%湖北%'
查询湖北的张三
------解决方案--------------------
直接用脚本操作 不要用UI 。
------解决方案--------------------
CREATE INDEX Nameindex ON cdsgus (Name)
经常要查询名字,所以在名字上建索引,经过建立索引,发现一般查询完成时间不会超过5秒,没建索引前将近三分钟,大概见一个索引会占用60兆左右的空间
SELECT * FROM cdsgus WHERE Name='张三'AND Address LIKE '%湖北%'
查询湖北的张三![]()
在name上创建一个索引好慢呀,还超时,怎么办??
直接用脚本操作 不要用UI 。
我的双核2.7,4g内存,貌似创建索引时用了5分钟左右,没有超时,不过弹出了一个警告信息,具体也记不清了,但我没管它,直接去查询,发现速度的确比没创建索引时快了n倍
------解决方案--------------------