用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是有必要的,为了保证顺序,所以不要去掉。我觉得要从业务上重新分析是否有更好的写法
------其他解决方案--------------------
有索引的话可以优化的
你删除了150W 这个表的空间不见得全部释放 建议你重建以下索引 这样可以使未释放的空间释放出来
------其他解决方案--------------------
A应该是引起了表扫描 请贴出执行计划
------其他解决方案--------------------
聚集索引扫描,就是把表整个扫了一遍。
看楼下回复,应该是read降下来了,可喜可贺
------其他解决方案--------------------
两个的执行计划肯定不一样的,贴出来看看
------其他解决方案--------------------
小弟弱弱的问一句SQL Profile是啥玩意啊?
------其他解决方案--------------------
------其他解决方案--------------------
------其他解决方案--------------------
执行计划上方绿色那行字,右键→然后生成那个丢失索引的脚本。因为丢失索引,导致聚集索引扫描,而这个扫描无异于表扫描。所以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会降恒多
------其他解决方案--------------------
------其他解决方案--------------------