SQL Server共通ページングSQL

2783 ワード

今日は退屈で友达とページを討論して、ネット上の多くが間違っていることに気づいた.ネット上でよく調べられるTop Not inやMaxのほとんどは実用的ではなく、Orderや性能の問題を無視していることが多い.そのためにインターネットで調べて、ついでに2000と2012のバージョンも補充しました.
まずネット上でよくあるSQLの間違いあるいは限界の問題を話します
select top 10 * 
from table1
where id not in(
    select top       id 
    from table1)

これにより、確かにページングデータを取得できますが、これはデフォルトのソートです.いずれかの列でソートする場合は?ではorder byはどこに追加されますか?外はすべてプラスして、明らかにだめで、外のOrderは役に立たないで、ネストするしかなくて、Ohmy god、プログラミングの3つのSelect、この効率.
効率的に使うためには、全体的な考え方は正直にRowNumberで解決していますが、SQL 2000にはRowNumberはありません.実は、私たちは臨時表を通じて自増列で解決することができます.
 
SQL 2000はテンポラリ・テーブルで解決し、テンポラリ・テーブルに自己増分列を追加することでRowNumberを解決する.
DECLARE @Start INT
DECLARE @End INT
SELECT @Start = 14000,@End = 14050


CREATE TABLE #employees (RowNumber INT IDENTITY(1,1),
LastName VARCHAR(100),FirstName VARCHAR(100),
EmailAddress VARCHAR(100))


INSERT INTO #employees (LastName, FirstName, EmailAddress)
SELECT LastName, FirstName, EmailAddress 
FROM Employee 
ORDER BY LastName, FirstName, EmailAddress
SELECT LastName, FirstName, EmailAddress 
FROM #employees
WHERE RowNumber > @Start AND RowNumber <= @End


DROP TABLE #employees


GO

  
SQL 2005/2008はRowをサポートしているためNumberは、派生テーブルによって解決されます(2つのネスト)
DECLARE @Start INT
DECLARE @End INT
SELECT @Start = 14000,@End = 14050


SELECT LastName, FirstName, EmailAddress
FROM (SELECT LastName, FirstName, EmailAddress,
ROW_NUMBER() OVER (ORDER BY LastName, FirstName, EmailAddress) AS RowNumber
FROM Employee) EmployeePage
WHERE RowNumber > @Start AND RowNumber <= @End
ORDER BY LastName, FirstName, EmailAddress
GO

  
SQL 2005/2008あるいはCTEの方式で実現して、派生表と同じで、きれいで、実行計画はすべて同じです.
DECLARE @Start INT
DECLARE @End INT
SELECT @Start = 14000,@End = 14050;


WITH EmployeePage AS
(SELECT LastName, FirstName, EmailAddress,
ROW_NUMBER() OVER (ORDER BY LastName, FirstName, EmailAddress) AS RowNumber
FROM Employee)
SELECT LastName, FirstName, EmailAddress
FROM EmployeePage
WHERE RowNumber > @Start AND RowNumber <= @End
ORDER BY LastName, FirstName, EmailAddress
GO

  
SQL SERVER 2012比較力でOFFSETをサポートし、1つのSelectで戦闘を終了
SELECT LastName, FirstName, EmailAddress
FROM Employee
ORDER BY LastName, FirstName, EmailAddress
OFFSET 14000 ROWS
FETCH NEXT 50 ROWS ONLY;

  
 
最後に、外国人の文章によると、2012年にTOP(50)を加えると、実行計画は多くの行のデータ(正確に読む)を少なくし、性能を向上させる.しかし、本人の手元に2012年がなくてもテストできません.少なくとも2008 R 2にTOP実行計画を加えなくても同じです.