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

在这里用到的是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分别是对应表的主键,也是聚集索引。

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


阅读更多
文章标签: select sql top
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭