读书人

【ROW_NUMBER()】管于ROW_NUMBER()性能

发布时间: 2012-12-17 09:31:40 作者: rapoo

【ROW_NUMBER()】管于ROW_NUMBER()性能问题
用SQL Profile观察下下面两条SQL语句执行情况,这两条SQL语句几乎一样,前者仅加了个ROW_NUMBER()而已

SQL-A:

 SELECT TOP(6) ID, CompanyName ,HtmlUrl,ROW_NUMBER() OVER (order by NEWID())as RowNumber
FROM Company
WHERE Status>=3 AND CompanyType=1

SQL Profile里面的Reads值:29144
----------------------------
SQL-B:
 SELECT TOP(6) ID, CompanyName ,HtmlUrl
FROM Company
WHERE Status>=3 AND CompanyType=1

SQL Profile里面的Reads值:16
----------------------------
这是不是ROW_NUMBER()引起的性能问题呢?
[最优解释]
你这个语句太多top和order by 了,如果你用到top,那加上order by是有必要的,为了保证顺序,所以不要去掉。我觉得要从业务上重新分析是否有更好的写法
[其他解释]
引用:
引用:引用:引用:
你这个语句太多top和order by 了,如果你用到top,那加上order by是有必要的,为了保证顺序,所以不要去掉。我觉得要从业务上重新分析是否有更好的写法
好奇怪,我很多查询语句带了order by 之后,好像会全表扫……



有索引的话可以优化的
你删除了150W 这个表的空间不见得全部释放 建议你重建以下索引 这样可以使未释放的空间释放出来
[其他解释]
A应该是引起了表扫描 请贴出执行计划

[其他解释]
引用:
引用:两个的执行计划肯定不一样的,贴出来看看
引用:A应该是引起了表扫描 请贴出执行计划



聚集索引扫描,就是把表整个扫了一遍。
看楼下回复,应该是read降下来了,可喜可贺
[其他解释]
两个的执行计划肯定不一样的,贴出来看看
[其他解释]
小弟弱弱的问一句SQL Profile是啥玩意啊?
[其他解释]
引用:
小弟弱弱的问一句SQL Profile是啥玩意啊?

[其他解释]
引用:
两个的执行计划肯定不一样的,贴出来看看

引用:
A应该是引起了表扫描 请贴出执行计划




[其他解释]
执行计划上方绿色那行字,右键→然后生成那个丢失索引的脚本。因为丢失索引,导致聚集索引扫描,而这个扫描无异于表扫描。所以I/O很大。
[其他解释]
引用:
执行计划上方绿色那行字,右键→然后生成那个丢失索引的脚本。因为丢失索引,导致聚集索引扫描,而这个扫描无异于表扫描。所以I/O很大。

他生成这么一段语句,我执行了,如何Reads降下来了
USE [xxx]
GO
CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[Company] ([CompanyType],[Status])
INCLUDE ([ID],[CompanyName],[HtmlUrl])

---------------
什么情况下才会导致索引丢失?是不是我使用了ROW_NUMBER()导致索引丢失的呢
[其他解释]
row_number的时候里面有order语句。这会导致数据重新排序。丢失索引一般是include索引,也就是你用到的列有很多没有索引在上面,这时要造成扫描表,因为没索引,所以不知道数据在哪,必须通过扫描来做。你执行了那个语句之后,再看看性能,如无意外reads会降恒多
[其他解释]
引用:
引用:小弟弱弱的问一句SQL Profile是啥玩意啊?

[其他解释]

引用:
row_number的时候里面有order语句。这会导致数据重新排序。丢失索引一般是include索引,也就是你用到的列有很多没有索引在上面,这时要造成扫描表,因为没索引,所以不知道数据在哪,必须通过扫描来做。你执行了那个语句之后,再看看性能,如无意外reads会降恒多


嗯,创建了几个索引后,Reads,降了挺多的
“row_number的时候里面有order语句。这会导致数据重新排序”,想了很久,不知道这么问这个问题了
解决这个问题,用索引是最直接的吗?
比如:需要用row_number产生自动行号,又不影响性能
------------
你看我这种SQL语句,就是我这边老出问题的,可优化的地方会是在哪呢?
除了您说的办法,创建索引,后面我取消了表的order by 排序,reads降了部分,此外这语句设计上有什么问题吗?

SELECT DISTINCTTOP (18) v.ID,v.MarketName,v.HtmlUrl,ROW_NUMBER() OVER (order by NEWID())as RowNumber
FROM
(
SELECT TOP(50) v.ID,v.MarketName,v.HtmlUrl
FROM Market AS v INNER JOIN Market AS m ON v.ParentID=m.ID
WHERE v.Status>=3 AND v.IsMarket=0 AND m.BusinessType=1 AND m.Status>=3 AND m.MarketType<>4
--ORDER BY v.ID DESC
UNION
SELECT TOP(20) v.ID,v.MarketName,v.HtmlUrl
FROM Market AS v INNER JOIN Market AS m ON v.ParentID=m.ID
WHERE v.Status>=3 AND v.IsMarket=0 AND m.BusinessType=1 AND m.Status>=3 AND m.MarketType<>4
--ORDER BY v.Status DESC,v.ID DESC
) AS v
--ORDER BY RowNumber ASC

[其他解释]
引用:
你这个语句太多top和order by 了,如果你用到top,那加上order by是有必要的,为了保证顺序,所以不要去掉。我觉得要从业务上重新分析是否有更好的写法

好奇怪,我很多查询语句带了order by 之后,好像会全表扫描,即便加索引也是这样,这怎么办?
[其他解释]
我在那除数据之后,在程序逻辑代码里面用linq排序,这算不算得上是个解决办法呢?
[其他解释]
我从数据库读取想要的数据之后,在程序逻辑代码里面用linq排序,这算不算得上是个解决办法呢?
[其他解释]
学习
引用:
引用:
两个的执行计划肯定不一样的,贴出来看看
引用:
A应该是引起了表扫描 请贴出执行计划

[其他解释]
引用:
引用:引用:
你这个语句太多top和order by 了,如果你用到top,那加上order by是有必要的,为了保证顺序,所以不要去掉。我觉得要从业务上重新分析是否有更好的写法
好奇怪,我很多查询语句带了order by 之后,好像会全表扫描,即便加索引也是这样,这怎么办?order b……


order by ,distinct都不是个好东西
[其他解释]
引用:
引用:
你这个语句太多top和order by 了,如果你用到top,那加上order by是有必要的,为了保证顺序,所以不要去掉。我觉得要从业务上重新分析是否有更好的写法
好奇怪,我很多查询语句带了order by 之后,好像会全表扫描,即便加索引也是这样,这怎么办?
order by 本来就会造成全表扫描
[其他解释]
现在正在看有关索引的资料,这个有用,以后再看看。
[其他解释]
这得根据实际情况来使用排序。。。。
[其他解释]
引用:
引用:
引用:引用:
你这个语句太多top和order by 了,如果你用到top,那加上order by是有必要的,为了保证顺序,所以不要去掉。我觉得要从业务上重新分析是否有更好的写法
好奇怪,我很多查询语句带了order by 之后,好像会全表扫描,即便加索引也是这样……

方法1:使用trauncate,先把要留下的数据插入一个表,truncate源表,然后把数据差回来,但是这样要锁表。降低并发性。
方法2:每次delete少量数据,多次delete。同时delete的where语句要高效。且数据库的恢复模式可以改为简单

[其他解释]

引用:
引用:引用:
你这个语句太多top和order by 了,如果你用到top,那加上order by是有必要的,为了保证顺序,所以不要去掉。我觉得要从业务上重新分析是否有更好的写法
好奇怪,我很多查询语句带了order by 之后,好像会全表扫描,即便加索引也是这样,这怎么办?order b……


引用:
引用:引用:引用:
你这个语句太多top和order by 了,如果你用到top,那加上order by是有必要的,为了保证顺序,所以不要去掉。我觉得要从业务上重新分析是否有更好的写法
好奇怪,我很多查询语句带了order by 之后,好像会全表扫……

我滴娘啊!我之前接触的小数据量的project使用了oder by 实现了业务需求,一碰到大的project,而且访问的人多了,这数据库就受伤了
我还有个问题,一个表里面,200W数据量,我仅使用传统delete删除150W数据,这会降低oder by带来的负面效果,使用delete删除的时候还需要其他什么操作能达到优化作用呢?
千万~亿级别的数据量我滴娘啊,我太想知道它是怎么实现快速查询的。

读书人网 >SQL Server

热点推荐