关于sql语句,select查询时很快,加了top + 数字之后就会很慢

原创 2015年11月18日 14:15:38

在这里用到的是sqlserver 2008 r2,做了一个查询,但是发现明明只有几十条数据,select + 列名 与  select  top 100 + 列名用时却相差很多。

sql语句:

SELECT 
parent.classCode parentClassCode,
parent.className parentClassName,
inf_product_class.classCode productClassCode,
inf_product_class.className productClassName,
inf_jewelry_class.classCode jewelryClassCode,
inf_jewelry_class.className jewelryClassName,
count(inf_product_class.classCode) allItem,
count(view_shop_product_stock.nowQuantity) stockItem,
count(case when inf_shop_product.shopLifeCircle = 0 then inf_product_class.classCode end) newItem,
count(case when inf_shop_product.shopLifeCircle = 0 then view_shop_product_stock.nowQuantity end) newStockItem,
count(case when inf_shop_product.shopLifeCircle = 10 then inf_product_class.classCode end) normalItem,
count(case when inf_shop_product.shopLifeCircle = 10 then view_shop_product_stock.nowQuantity end) normalStockItem,
count(case when inf_shop_product.shopLifeCircle = 12 then inf_product_class.classCode end) downItem,
count(case when inf_shop_product.shopLifeCircle = 12 then view_shop_product_stock.nowQuantity end) downStockItem,
count(case when inf_shop_product.shopLifeCircle = 20 then inf_product_class.classCode end) preDisUseItem,
count(case when inf_shop_product.shopLifeCircle = 20 then view_shop_product_stock.nowQuantity end) preDisUseStockItem,
count(case when inf_shop_product.shopLifeCircle = 30 then inf_product_class.classCode end) disUseItem
FROM inf_shop_product
JOIN inf_product ON (inf_shop_product.productId = inf_product.productId)
JOIN inf_product_class ON (inf_product.productClassId = inf_product_class.classId)
LEFT JOIN inf_product_class parent ON (inf_product_class.parentId = parent.classId)
LEFT JOIN inf_jewelry_class ON (inf_product_class.jewelryClassId = inf_jewelry_class.classId)
LEFT JOIN view_shop_product_stock ON (
view_shop_product_stock.productId = inf_shop_product.productId
AND view_shop_product_stock.deptId = inf_shop_product.shopId 
AND view_shop_product_stock.nowQuantity > 0)
GROUP BY 
parent.classCode,
parent.className,
inf_product_class.classCode,
inf_product_class.className,
inf_jewelry_class.classCode,
inf_jewelry_class.className
ORDER BY 
parentClassCode ASC,
productClassCode ASC,
jewelryClassCode ASC


这是我原来的查询语句,各个表就是一些描述属性类的,Code,Name对应编码和字段,classId(对应之类的)是主键,未做查询。

88条数据大约用时8秒,变成select top 88 后,会用时大约50秒。

怎么改top 1,top 2 都是这样,后来搜索了很久,看到大家都说是没有索引的问题。可是这几个表都有索引啊。后来看到这个哥们写的

http://www.wuleba.com/26168.html(无意冒犯啊,只是拜一下,^_^),看到把Id列出来啦,才想到我这里可能是表里有索引但是我没有列出来。

之后我把sql语句改成了如下:

SELECT 
parent.classId parentClassId,
parent.classCode parentClassCode,
parent.className parentClassName,
inf_product_class.classId producctClassId,
inf_product_class.classCode productClassCode,
inf_product_class.className productClassName,
inf_jewelry_class.classId jewelryClassId,
inf_jewelry_class.classCode jewelryClassCode,
inf_jewelry_class.className jewelryClassName,
count(inf_product_class.classCode) allItem,
count(view_shop_product_stock.nowQuantity) stockItem,
count(case when inf_shop_product.shopLifeCircle = 0 then inf_product_class.classCode end) newItem,
count(case when inf_shop_product.shopLifeCircle = 0 then view_shop_product_stock.nowQuantity end) newStockItem,
count(case when inf_shop_product.shopLifeCircle = 10 then inf_product_class.classCode end) normalItem,
count(case when inf_shop_product.shopLifeCircle = 10 then view_shop_product_stock.nowQuantity end) normalStockItem,
count(case when inf_shop_product.shopLifeCircle = 12 then inf_product_class.classCode end) downItem,
count(case when inf_shop_product.shopLifeCircle = 12 then view_shop_product_stock.nowQuantity end) downStockItem,
count(case when inf_shop_product.shopLifeCircle = 20 then inf_product_class.classCode end) preDisUseItem,
count(case when inf_shop_product.shopLifeCircle = 20 then view_shop_product_stock.nowQuantity end) preDisUseStockItem,
count(case when inf_shop_product.shopLifeCircle = 30 then inf_product_class.classCode end) disUseItem,
FROM inf_shop_product
JOIN inf_product ON (inf_shop_product.productId = inf_product.productId)
JOIN inf_product_class ON (inf_product.productClassId = inf_product_class.classId)
LEFT JOIN inf_product_class parent ON (inf_product_class.parentId = parent.classId)
LEFT JOIN inf_jewelry_class ON (inf_product_class.jewelryClassId = inf_jewelry_class.classId)
LEFT JOIN view_shop_product_stock ON (
view_shop_product_stock.productId = inf_shop_product.productId
AND view_shop_product_stock.deptId = inf_shop_product.shopId 
AND view_shop_product_stock.nowQuantity > 0)
GROUP BY 
parent.classId,
parent.classCode,
parent.className,
inf_product_class.classId,
inf_product_class.classCode,
inf_product_class.className,
inf_jewelry_class.classId,
inf_jewelry_class.classCode,
inf_jewelry_class.className,
ORDER BY 
parentClassCode ASC,
productClassCode ASC,
jewelryClassCode ASC

这样之后,查询了一下,和加上top 88 都是很快的,不到1秒钟。注:这里的classId分别是对应表的主键,也是聚集索引。

   由于对此处的索引也是了解甚少,对上述问题的描述暂时不说了,不然越说越乱。就是使用索引会变快。


Access数据库Select Top问题

之前从未遇到过Access数据库Select Top的问题,今天是遇到了。示例如下:Select Top 6 ID,Title From Table Where IsPass=1 Order By O...
  • xijupony
  • xijupony
  • 2010年07月17日 13:31
  • 3490

小心 SQL语句SELECT TOP 的用法

  • zhuche110
  • zhuche110
  • 2008年06月22日 17:24
  • 2884

关于sql语句查询--top关键字

Top关键字: 1、首先引用一位网友出错的例子,sql="select top 30 * from data where title='"&title1&"' order by id desc" 分析...
  • u014006007
  • u014006007
  • 2016年07月04日 16:00
  • 3252

在postgresql中使用limit实现select top x

转载于:http://blog.csdn.net/seraph021724/article/details/8136788 【postgresql】在postgresql中使用limit实现se...
  • suweierxing
  • suweierxing
  • 2015年10月28日 15:48
  • 960

在数据库中sql查询很快,但在程序中查询较慢的解决方法

在写c#WS的时候,有一个方法查询速度比其他方法慢很多,但在数据库查询很快,原来是因为程序中使用参数化查询时参数类型错误的原因 代码如下              string sql = "SE...
  • u010962131
  • u010962131
  • 2015年03月16日 13:46
  • 2642

sql 查询结果if else

SELECT  s.time AS TIME, 'tts投诉' AS sugesstWall, r.region_name AS courseName, c.center_name AS ce...
  • senvil
  • senvil
  • 2015年10月04日 08:12
  • 557

SELECT TOP @NUM 的问题

    如下:     select   top   2   *   from   table1     转变成     select   top   @num   *   from   table1...
  • hyl8218
  • hyl8218
  • 2007年04月15日 16:05
  • 741

sql语句查询过慢的原因分析

有时候你在使用sql语句查询数据库,sql语句写得好正确,但则发现执行查询的时候很慢呢?数据量也不是太大,你知道其中的原因吗?本文给大家讲解一下sql查询过慢的48种原因分析,请阅读。 1、没有...
  • diligentcat
  • diligentcat
  • 2011年09月11日 08:20
  • 2423

sql的where语句中查询某个时间之后的话速度异常慢

有点2的问题!直接上图 这个时间段是很快的
  • baidu_20650485
  • baidu_20650485
  • 2014年11月14日 16:09
  • 892

如果在SELECT TOP 中使用变量

如果TOP后取得行数是动态的,这时需要用变量实现动态数值,但如果直接写成: DECLARE @LineCount INT =10 SELECT TOP @LineCount * FROM sys.t...
  • ch21st
  • ch21st
  • 2016年03月27日 12:40
  • 1881
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于sql语句,select查询时很快,加了top + 数字之后就会很慢
举报原因:
原因补充:

(最多只允许输入30个字)