关闭

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

标签: selectsqltop
284人阅读 评论(0) 收藏 举报

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

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


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:574次
    • 积分:24
    • 等级:
    • 排名:千里之外
    • 原创:2篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章存档