关于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分别是对应表的主键,也是聚集索引。

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


东京银行很快就会推出自己的数字货…

比特币的协议和其底层区块链技术,没想到成为传统金融行业的意外礼物。数字货币也许将会改变全球金融服务,无论是对于银行或者政府提供的现有基础建设。银 行决定深入研究该项技术,并且最终发行自己的数字货币,也...

安装Ubuntu系统后软件以及系统更新时就算网速很快下载速度也会很慢的解决方法

想要提高下载速度(达到自己宽带应该有的速度)。 1、先打开 /etc/apt/sources.list文件,然后修改,不过不能直接修改,要在终端里面修改。 2、首先:cd /etc/apt/ ...

.Net 2.0的WinFom程序打了数字签名之后程序启动很慢

节前碰到一个客户,程序打开发现速度很慢,核查了一下发现在程序打开的时候会进行很多的http的请求,集中在访问微软的数字证书的网站。程序是.Net2.0的,为了避免被360误杀有数字签名,检查系统日志发...
  • bdstjk
  • bdstjk
  • 2013年03月27日 14:32
  • 1834

“取出数据表中第10条到第20条记录”的sql语句+select top 用法

1. 首先,select top用法: 参考问题  select top n * from和select * from的区别 select * from table --  取所有数据,返回无序集...

处理一条很慢SQL语句过程

select p.surplus_capital from clspuser.crf_p2p_rpt_bill_pen_new p ,salaryuser.crf_salary_pi_accoun...

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

有点2的问题!直接上图 这个时间段是很快的

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

Top关键字: 1、首先引用一位网友出错的例子,sql="select top 30 * from data where title='"&title1&"' order by id desc" 分析...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于sql语句,select查询时很快,加了top + 数字之后就会很慢
举报原因:
原因补充:

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