Hay que tomar en cuenta que, en caso de traernos una fila de una tabla muy pesada, por decir, la fila 5,124,244 puede traernos serios problemas de desempeño. Así que considera utilizar planes de ejecución para probar los métodos en Resultsets muy pesados y ver cuál te funciona mejor.
El primer paso es crear la tabla de ejemplo:
CREATE TABLE Names
(
NameID INT IDENTITY(1, 1)
PRIMARY KEY CLUSTERED,
FName VARCHAR(32)
)
GO
SET NOCOUNT ON
INSERT Names(FName) VALUES('Aaron')
INSERT Names(FName) VALUES('Greg')
INSERT Names(FName) VALUES('Alex')
INSERT Names(FName) VALUES('Luan')
INSERT Names(FName) VALUES('John')
INSERT Names(FName) VALUES('Todd')
INSERT Names(FName) VALUES('Scott')
INSERT Names(FName) VALUES('Jess')
INSERT Names(FName) VALUES('Drew')
INSERT Names(FName) VALUES('Katherine')
INSERT Names(FName) VALUES('Paul')
GO
Alternativa 1: TOP anidados
SELECT TOP 1 FName
FROM
(
SELECT TOP 10 FName
FROM Names
ORDER BY FName
) sub
ORDER BY FName DESC
Alternativa 2: NOT IN
SELECT TOP 1 FName
FROM Names WHERE FName NOT IN
(
SELECT TOP 9 FName
FROM Names
ORDER BY FName
)
ORDER BY FName
Alternativa 3: "count derivado" se asume que FName is único
SELECT FName
FROM Names
WHERE
(
SELECT COUNT(*)
FROM Names n2
WHERE n2.FName <= Names.FName ) = 10
Alternativa 4: MAX
SELECT FName = MAX(FName) FROM
(
SELECT TOP 10 FName
FROM Names
ORDER BY FName
) sub
Alternativa 5: Uso de cursores
DECLARE FNames CURSOR
LOCAL STATIC READ_ONLY FOR
SELECT FName
FROM Names
ORDER BY FName
DECLARE @FName VARCHAR(32)
OPEN FNames
FETCH RELATIVE 10 FROM FNames INTO @FName
CLOSE FNames
DEALLOCATE FNames
SELECT FName = @FName
DROP TABLE Names
GO
Referencia
No comments:
Post a Comment