日期:2014-05-18  浏览次数:20471 次

sqlserver2005查询语句的性能问题
在网上查询有关查询语句的性能问题,真是众说纷纭啊!我有以下几个问题:
1.关于分页的我们用的是
 
SQL code
SELECT * FROM (SELECT TOP 100 *, ROW_NUMBER() OVER (order by id) AS Supesoft_RowNo
            FROM BaseArchives where isdelete=0 and status<>51  ) AS TempSupesoftPageTable
            WHERE TempSupesoftPageTable.Supesoft_RowNo > 90
 

查了下资料,有的说是效率最差,有的说还可以,想问下那种分页方式效率最高?
2.多表查询问题
第一种:
SQL code
select b.* from BaseArchives b,E_Fence e where b.E_Fence=e.ID and b.isdelete=0 and b.status<>51 order by b.id desc


第二种:
SQL code
select b.* from BaseArchives b where exists(select e.ID from E_Fence e where b.E_Fence=e.ID) and b.isdelete=0 and b.status<>51 order by b.id desc


第三种:
SQL code
select b.*,e.* from BaseArchives b inner join E_Fence e on b.E_Fence=e.ID where b.isdelete=0 and b.status<>51 order by b.id desc


总的是查询出9346条数据,差不到表里也就1W多条数据,我测的结果是第一和第二种差不多700-850ms,而第三种是2000多ms
不管那种1W多条数据好像都有点慢?想找解决方案
3.我想知道有哪些查询的关键字是影响查询速率的?
在线等答案啊

------解决方案--------------------
多表查询inner join 肯定比exists 效率高
可以在表上加上索引提高查询效率
------解决方案--------------------
第三种方法比较快
------解决方案--------------------
1,你写的分页很好
2,第一种和第三种其实差不多,第二种exists方式查询不是很稳定,看你内外表的数据分布情况
3,关键字不会影响效率,用错了才会影响效率
------解决方案--------------------
分页ROW_NUMBER()OVER()的效率比较高

多表连接查询 你的方法1,3其实是一样的效率,比exists子查询高 但是只限于inner join 


如果用left join 结果都可能不一样 没有可比性
------解决方案--------------------
1.把你找到的分页程序统统运行一下,哪个最快,它的效率就最高.
2.这三种查询语句差别不大,要提高速度,试着在连接列和条件列上建索引.
3.每个关键字都影响速率. where 最甚,在select 中加子查询更差.