Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Постраничная выборка  [new]
hdd-killer
Member

Откуда: СПб
Сообщений: 206
Имеется таблица с 6+ млн записей. Требуется реализовать постраничную выборку. Первый вариант был написан с использование ROW_NUMBER() и CTE:
WITH CTEPage AS
(
    SELECT ROW_NUMBER() OVER (ORDER BY FileSize ASC, ID ASC) n, *
    FROM table1 (nolock)
) 
SELECT * 
FROM CTEPage
WHERE n BETWEEN 2171601 AND 2171700
ORDER BY n ASC


Работает он чудовищно медленно (1,5-2 мин.). Альтернативный вариант через TOP выполняется за 2-3 сек.:
SELECT *
FROM table1 
WHERE ID IN 
      (SELECT TOP 100 ID 
      FROM table1 
      WHERE ID IN
            (SELECT TOP 2171700 ID 
            FROM table1
            ORDER BY FileSize ASC, ID ASC)  
      ORDER BY FileSize DESC, ID DESC)  
ORDER BY FileSize ASC, ID ASC


Собственно вопрос, почему так происходит (откуда такая разница)? И как все таки правильно?

з.ы.
select @@version

Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64)   Jun 17 2011 00:54:03   Copyright (c) Microsoft Corporation  Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) 

з.з.ы.
Индекса по полю FileSize нет (предполагается сортировка по любому из десятка полей, не заводить же по каждому индекс).


--------------------
"Сogitationus poenam nemo patitur"
Никто не несет наказания за мысли
26 янв 12, 12:42    [11974691]     Ответить | Цитировать Сообщить модератору
 Re: Постраничная выборка  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
Планы выполнения в студию ...
26 янв 12, 12:44    [11974717]     Ответить | Цитировать Сообщить модератору
 Re: Постраничная выборка  [new]
LeadyGaaga
Member

Откуда:
Сообщений: 37
Индекса по полю FileSize нет (предполагается сортировка по любому из десятка полей, не заводить же по каждому индекс).


Конечно не заводить, лучше на каждый запрос сортировать ну пусть не 6 млн, ну TOP(n) записей ?
26 янв 12, 12:49    [11974773]     Ответить | Цитировать Сообщить модератору
 Re: Постраничная выборка  [new]
LeadyGaaga
Member

Откуда:
Сообщений: 37
WITH CTEPage AS
(
    SELECT  ID 
              ,ROW_NUMBER() OVER (ORDER BY FileSize ASC, ID ASC) AS n 
    FROM dbo.table1 (nolock)
) 
SELECT 
           t.*
FROM CTEPage AS c
JOIN dbo.table1 AS t 
  ON c.ID = t.ID 
WHERE n BETWEEN 2171601 AND 2171700
ORDER BY c.n ASC


Такого вида запрос будет соизмеримо с top работать.
26 янв 12, 12:55    [11974823]     Ответить | Цитировать Сообщить модератору
 Re: Постраничная выборка  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31994
LeadyGaaga
Индекса по полю FileSize нет (предполагается сортировка по любому из десятка полей, не заводить же по каждому индекс).


Конечно не заводить, лучше на каждый запрос сортировать ну пусть не 6 млн, ну TOP(n) записей ?
Без индекса будет каждый раз сортироваться вся таблица.
hdd-killer
Собственно вопрос, почему так происходит (откуда такая разница)? И как все таки правильно?
Ну, не сообразил оптимизатор, как правильно сделать...

Во втором случае вы ему подсказываете оптимальную стратегию выборки, вот и быстро.

Может, попробовать обновить статистику для таблицы...
26 янв 12, 12:55    [11974824]     Ответить | Цитировать Сообщить модератору
 Re: Постраничная выборка  [new]
hdd-killer
Member

Откуда: СПб
Сообщений: 206
План для варианта с TOP:
+


100 1 SELECT * FROM Image WHERE Image.ID IN (SELECT TOP 100 Image.ID FROM Image WHERE Image.ID IN (SELECT TOP 2171700 Image.ID FROM Image ORDER BY FileSize ASC, ID ASC) ORDER BY FileSize DESC, ID DESC) ORDER BY FileSize ASC, ID ASC 1 1 0 NULL NULL NULL NULL 100 NULL NULL NULL 268,0083 NULL NULL SELECT 0 NULL
100 1 |--Sort(ORDER BY:([Djanel_Big].[dbo].[Image].[FileSize] ASC, [Djanel_Big].[dbo].[Image].[ID] ASC)) 1 2 1 Sort Sort ORDER BY:([Djanel_Big].[dbo].[Image].[FileSize] ASC, [Djanel_Big].[dbo].[Image].[ID] ASC) NULL 100 0,01126126 0,00114533 8888 268,0083 [Djanel_Big].[dbo].[Image].[ID], [Djanel_Big].[dbo].[Image].[IDSeries], [Djanel_Big].[dbo].[Image].[IDUser], [Djanel_Big].[dbo].[Image].[IDMedium], [Djanel_Big].[dbo].[Image].[IDMultiFrame], [Djanel_Big].[dbo].[Image].[UID], [Djanel_Big].[dbo].[Image].[SOPClassUID], [Djanel_Big].[dbo].[Image].[InstanceNumber], [Djanel_Big].[dbo].[Image].[CreationDate], [Djanel_Big].[dbo].[Image].[FileName], [Djanel_Big].[dbo].[Image].[FileType], [Djanel_Big].[dbo].[Image].[ContentDate], [Djanel_Big].[dbo].[Image].[ContentTime], [Djanel_Big].[dbo].[Image].[Photometric], [Djanel_Big].[dbo].[Image].[ImageType], [Djanel_Big].[dbo].[Image].[BitsStored], [Djanel_Big].[dbo].[Image].[SamplesPerPixel], [Djanel_Big].[dbo].[Image].[Height], [Djanel_Big].[dbo].[Image].[Width], [Djanel_Big].[dbo].[Image].[Frames], [Djanel_Big].[dbo].[Image].[Laterality], [Djanel_Big].[dbo].[Image].[PixelSpacing], [Djanel_Big].[dbo].[Image].[PlanarConfig], [Djanel_Big].[dbo].[Image].[PatientOrientation], [Djanel_Big].[dbo].[Image].[PatientPosition], [Djanel_Big].[dbo].[Image].[ViewPosition], [Djanel_Big].[dbo].[Image].[RegionName], [Djanel_Big].[dbo].[Image].[ContrastAgent], [Djanel_Big].[dbo].[Image].[ViewImage], [Djanel_Big].[dbo].[Image].[Comments], [Djanel_Big].[dbo].[Image].[FileSize] NULL PLAN_ROW 0 1
100 1 |--Parallelism(Gather Streams) 1 4 2 Parallelism Gather Streams NULL NULL 100 0 0,04422191 8888 267,9959 [Djanel_Big].[dbo].[Image].[ID], [Djanel_Big].[dbo].[Image].[IDSeries], [Djanel_Big].[dbo].[Image].[IDUser], [Djanel_Big].[dbo].[Image].[IDMedium], [Djanel_Big].[dbo].[Image].[IDMultiFrame], [Djanel_Big].[dbo].[Image].[UID], [Djanel_Big].[dbo].[Image].[SOPClassUID], [Djanel_Big].[dbo].[Image].[InstanceNumber], [Djanel_Big].[dbo].[Image].[CreationDate], [Djanel_Big].[dbo].[Image].[FileName], [Djanel_Big].[dbo].[Image].[FileType], [Djanel_Big].[dbo].[Image].[ContentDate], [Djanel_Big].[dbo].[Image].[ContentTime], [Djanel_Big].[dbo].[Image].[Photometric], [Djanel_Big].[dbo].[Image].[ImageType], [Djanel_Big].[dbo].[Image].[BitsStored], [Djanel_Big].[dbo].[Image].[SamplesPerPixel], [Djanel_Big].[dbo].[Image].[Height], [Djanel_Big].[dbo].[Image].[Width], [Djanel_Big].[dbo].[Image].[Frames], [Djanel_Big].[dbo].[Image].[Laterality], [Djanel_Big].[dbo].[Image].[PixelSpacing], [Djanel_Big].[dbo].[Image].[PlanarConfig], [Djanel_Big].[dbo].[Image].[PatientOrientation], [Djanel_Big].[dbo].[Image].[PatientPosition], [Djanel_Big].[dbo].[Image].[ViewPosition], [Djanel_Big].[dbo].[Image].[RegionName], [Djanel_Big].[dbo].[Image].[ContrastAgent], [Djanel_Big].[dbo].[Image].[ViewImage], [Djanel_Big].[dbo].[Image].[Comments], [Djanel_Big].[dbo].[Image].[FileSize] NULL PLAN_ROW 1 1
100 8 |--Nested Loops(Inner Join, OUTER REFERENCES:([Djanel_Big].[dbo].[Image].[ID], [Expr1010]) WITH UNORDERED PREFETCH) 1 5 4 Nested Loops Inner Join OUTER REFERENCES:([Djanel_Big].[dbo].[Image].[ID], [Expr1010]) WITH UNORDERED PREFETCH NULL 100 0 0,0001045 8888 267,9517 [Djanel_Big].[dbo].[Image].[ID], [Djanel_Big].[dbo].[Image].[IDSeries], [Djanel_Big].[dbo].[Image].[IDUser], [Djanel_Big].[dbo].[Image].[IDMedium], [Djanel_Big].[dbo].[Image].[IDMultiFrame], [Djanel_Big].[dbo].[Image].[UID], [Djanel_Big].[dbo].[Image].[SOPClassUID], [Djanel_Big].[dbo].[Image].[InstanceNumber], [Djanel_Big].[dbo].[Image].[CreationDate], [Djanel_Big].[dbo].[Image].[FileName], [Djanel_Big].[dbo].[Image].[FileType], [Djanel_Big].[dbo].[Image].[ContentDate], [Djanel_Big].[dbo].[Image].[ContentTime], [Djanel_Big].[dbo].[Image].[Photometric], [Djanel_Big].[dbo].[Image].[ImageType], [Djanel_Big].[dbo].[Image].[BitsStored], [Djanel_Big].[dbo].[Image].[SamplesPerPixel], [Djanel_Big].[dbo].[Image].[Height], [Djanel_Big].[dbo].[Image].[Width], [Djanel_Big].[dbo].[Image].[Frames], [Djanel_Big].[dbo].[Image].[Laterality], [Djanel_Big].[dbo].[Image].[PixelSpacing], [Djanel_Big].[dbo].[Image].[PlanarConfig], [Djanel_Big].[dbo].[Image].[PatientOrientation], [Djanel_Big].[dbo].[Image].[PatientPosition], [Djanel_Big].[dbo].[Image].[ViewPosition], [Djanel_Big].[dbo].[Image].[RegionName], [Djanel_Big].[dbo].[Image].[ContrastAgent], [Djanel_Big].[dbo].[Image].[ViewImage], [Djanel_Big].[dbo].[Image].[Comments], [Djanel_Big].[dbo].[Image].[FileSize] NULL PLAN_ROW 1 1
100 8 |--Parallelism(Distribute Streams, RoundRobin Partitioning) 1 7 5 Parallelism Distribute Streams NULL NULL 100 0 0,02868735 11 267,6264 [Djanel_Big].[dbo].[Image].[ID] NULL PLAN_ROW 1 1
100 1 | |--Top(TOP EXPRESSION:((100))) 1 8 7 Top Top TOP EXPRESSION:((100)) NULL 100 0 1E-05 11 267,5977 [Djanel_Big].[dbo].[Image].[ID] NULL PLAN_ROW 0 1
100 1 | |--Parallelism(Gather Streams, ORDER BY:([Djanel_Big].[dbo].[Image].[FileSize] DESC, [Djanel_Big].[dbo].[Image].[ID] DESC)) 1 9 8 Parallelism Gather Streams ORDER BY:([Djanel_Big].[dbo].[Image].[FileSize] DESC, [Djanel_Big].[dbo].[Image].[ID] DESC) NULL 100 0 0,02908279 15 267,5977 [Djanel_Big].[dbo].[Image].[ID], [Djanel_Big].[dbo].[Image].[FileSize] NULL PLAN_ROW 1 1
650 8 | |--Sort(TOP 100, ORDER BY:([Djanel_Big].[dbo].[Image].[FileSize] DESC, [Djanel_Big].[dbo].[Image].[ID] DESC)) 1 10 9 Sort TopN Sort TOP 100, ORDER BY:([Djanel_Big].[dbo].[Image].[FileSize] DESC, [Djanel_Big].[dbo].[Image].[ID] DESC) NULL 100 31,19651 19,44201 15 267,5687 [Djanel_Big].[dbo].[Image].[ID], [Djanel_Big].[dbo].[Image].[FileSize] NULL PLAN_ROW 1 1
2171700 8 | |--Hash Match(Inner Join, HASH:([Djanel_Big].[dbo].[Image].[ID])=([Djanel_Big].[dbo].[Image].[ID])) 1 12 10 Hash Match Inner Join HASH:([Djanel_Big].[dbo].[Image].[ID])=([Djanel_Big].[dbo].[Image].[ID]) NULL 2171700 0 13,56566 15 216,9301 [Djanel_Big].[dbo].[Image].[ID], [Djanel_Big].[dbo].[Image].[FileSize] NULL PLAN_ROW 1 1
2171700 8 | |--Bitmap(HASH:([Djanel_Big].[dbo].[Image].[ID]), DEFINE:([Bitmap1009])) 1 13 12 Bitmap Bitmap Create HASH:([Djanel_Big].[dbo].[Image].[ID]) [Bitmap1009] 2171700 0 5,232436 11 180,1137 [Djanel_Big].[dbo].[Image].[ID] NULL PLAN_ROW 1 1
2171700 8 | | |--Parallelism(Distribute Streams, Hash Partitioning, PARTITION COLUMNS:([Djanel_Big].[dbo].[Image].[ID])) 1 14 13 Parallelism Distribute Streams PARTITION COLUMNS:([Djanel_Big].[dbo].[Image].[ID]) NULL 2171700 0 5,232436 11 180,1137 [Djanel_Big].[dbo].[Image].[ID] NULL PLAN_ROW 1 1
2171700 1 | | |--Top(TOP EXPRESSION:((2171700))) 1 15 14 Top Top TOP EXPRESSION:((2171700)) NULL 2171700 0 0,21717 11 174,8813 [Djanel_Big].[dbo].[Image].[ID] NULL PLAN_ROW 0 1
2171700 1 | | |--Parallelism(Gather Streams, ORDER BY:([Djanel_Big].[dbo].[Image].[FileSize] ASC, [Djanel_Big].[dbo].[Image].[ID] ASC)) 1 16 15 Parallelism Gather Streams ORDER BY:([Djanel_Big].[dbo].[Image].[FileSize] ASC, [Djanel_Big].[dbo].[Image].[ID] ASC) NULL 2171700 0 12,31626 15 174,6641 [Djanel_Big].[dbo].[Image].[ID], [Djanel_Big].[dbo].[Image].[FileSize] NULL PLAN_ROW 1 1
4816634 8 | | |--Sort(TOP 2171700, ORDER BY:([Djanel_Big].[dbo].[Image].[FileSize] ASC, [Djanel_Big].[dbo].[Image].[ID] ASC)) 1 17 16 Sort TopN Sort TOP 2171700, ORDER BY:([Djanel_Big].[dbo].[Image].[FileSize] ASC, [Djanel_Big].[dbo].[Image].[ID] ASC) NULL 2171700 82,77309 60,89799 15 162,3478 [Djanel_Big].[dbo].[Image].[ID], [Djanel_Big].[dbo].[Image].[FileSize] NULL PLAN_ROW 1 1
5762510 8 | | |--Index Scan(OBJECT:([Djanel_Big].[dbo].[Image].[Idx_IDSeries_FSise])) 1 18 17 Index Scan Index Scan OBJECT:([Djanel_Big].[dbo].[Image].[Idx_IDSeries_FSise]) [Djanel_Big].[dbo].[Image].[ID], [Djanel_Big].[dbo].[Image].[FileSize] 5762510 17,09201 1,58473 15 18,67674 [Djanel_Big].[dbo].[Image].[ID], [Djanel_Big].[dbo].[Image].[FileSize] NULL PLAN_ROW 1 1
2182904 8 | |--Parallelism(Repartition Streams, Hash Partitioning, PARTITION COLUMNS:([Djanel_Big].[dbo].[Image].[ID])) 1 20 12 Parallelism Repartition Streams PARTITION COLUMNS:([Djanel_Big].[dbo].[Image].[ID]) NULL 5762510 0 4,57404 15 23,25078 [Djanel_Big].[dbo].[Image].[ID], [Djanel_Big].[dbo].[Image].[FileSize] NULL PLAN_ROW 1 1
2182904 8 | |--Index Scan(OBJECT:([Djanel_Big].[dbo].[Image].[Idx_IDSeries_FSise]), WHERE:(PROBE([Bitmap1009],[Djanel_Big].[dbo].[Image].[ID],N'[IN ROW]'))) 1 21 20 Index Scan Index Scan OBJECT:([Djanel_Big].[dbo].[Image].[Idx_IDSeries_FSise]), WHERE:(PROBE([Bitmap1009],[Djanel_Big].[dbo].[Image].[ID],N'[IN ROW]')) [Djanel_Big].[dbo].[Image].[ID], [Djanel_Big].[dbo].[Image].[FileSize] 5762510 17,09201 1,58473 15 18,67674 [Djanel_Big].[dbo].[Image].[ID], [Djanel_Big].[dbo].[Image].[FileSize] NULL PLAN_ROW 1 1
100 100 |--Clustered Index Seek(OBJECT:([Djanel_Big].[dbo].[Image].[PK_IMAGE]), SEEK:([Djanel_Big].[dbo].[Image].[ID]=[Djanel_Big].[dbo].[Image].[ID]) ORDERED FORWARD) 1 25 5 Clustered Index Seek Clustered Index Seek OBJECT:([Djanel_Big].[dbo].[Image].[PK_IMAGE]), SEEK:([Djanel_Big].[dbo].[Image].[ID]=[Djanel_Big].[dbo].[Image].[ID]) ORDERED FORWARD [Djanel_Big].[dbo].[Image].[ID], [Djanel_Big].[dbo].[Image].[IDSeries], [Djanel_Big].[dbo].[Image].[IDUser], [Djanel_Big].[dbo].[Image].[IDMedium], [Djanel_Big].[dbo].[Image].[IDMultiFrame], [Djanel_Big].[dbo].[Image].[UID], [Djanel_Big].[dbo].[Image].[SOPClassUID], [Djanel_Big].[dbo].[Image].[InstanceNumber], [Djanel_Big].[dbo].[Image].[CreationDate], [Djanel_Big].[dbo].[Image].[FileName], [Djanel_Big].[dbo].[Image].[FileType], [Djanel_Big].[dbo].[Image].[ContentDate], [Djanel_Big].[dbo].[Image].[ContentTime], [Djanel_Big].[dbo].[Image].[Photometric], [Djanel_Big].[dbo].[Image].[ImageType], [Djanel_Big].[dbo].[Image].[BitsStored], [Djanel_Big].[dbo].[Image].[SamplesPerPixel], [Djanel_Big].[dbo].[Image].[Height], [Djanel_Big].[dbo].[Image].[Width], [Djanel_Big].[dbo].[Image].[Frames], [Djanel_Big].[dbo].[Image].[Laterality], [Djanel_Big].[dbo].[Image].[PixelSpacing], [Djanel_Big].[dbo].[Image].[PlanarConfig], [Djanel_Big].[dbo].[Image].[PatientOrientation], [Djanel_Big].[dbo].[Image].[PatientPosition], [Djanel_Big].[dbo].[Image].[ViewPosition], [Djanel_Big].[dbo].[Image].[RegionName], [Djanel_Big].[dbo].[Image].[ContrastAgent], [Djanel_Big].[dbo].[Image].[ViewImage], [Djanel_Big].[dbo].[Image].[Comments], [Djanel_Big].[dbo].[Image].[FileSize] 1 0,003125 0,0001581 8888 0,325164 [Djanel_Big].[dbo].[Image].[ID], [Djanel_Big].[dbo].[Image].[IDSeries], [Djanel_Big].[dbo].[Image].[IDUser], [Djanel_Big].[dbo].[Image].[IDMedium], [Djanel_Big].[dbo].[Image].[IDMultiFrame], [Djanel_Big].[dbo].[Image].[UID], [Djanel_Big].[dbo].[Image].[SOPClassUID], [Djanel_Big].[dbo].[Image].[InstanceNumber], [Djanel_Big].[dbo].[Image].[CreationDate], [Djanel_Big].[dbo].[Image].[FileName], [Djanel_Big].[dbo].[Image].[FileType], [Djanel_Big].[dbo].[Image].[ContentDate], [Djanel_Big].[dbo].[Image].[ContentTime], [Djanel_Big].[dbo].[Image].[Photometric], [Djanel_Big].[dbo].[Image].[ImageType], [Djanel_Big].[dbo].[Image].[BitsStored], [Djanel_Big].[dbo].[Image].[SamplesPerPixel], [Djanel_Big].[dbo].[Image].[Height], [Djanel_Big].[dbo].[Image].[Width], [Djanel_Big].[dbo].[Image].[Frames], [Djanel_Big].[dbo].[Image].[Laterality], [Djanel_Big].[dbo].[Image].[PixelSpacing], [Djanel_Big].[dbo].[Image].[PlanarConfig], [Djanel_Big].[dbo].[Image].[PatientOrientation], [Djanel_Big].[dbo].[Image].[PatientPosition], [Djanel_Big].[dbo].[Image].[ViewPosition], [Djanel_Big].[dbo].[Image].[RegionName], [Djanel_Big].[dbo].[Image].[ContrastAgent], [Djanel_Big].[dbo].[Image].[ViewImage], [Djanel_Big].[dbo].[Image].[Comments], [Djanel_Big].[dbo].[Image].[FileSize] NULL PLAN_ROW 1 100


План для варианта с ROW_NUMBER():
+


100 1 WITH CTEImg AS ( SELECT ROW_NUMBER() OVER (ORDER BY FileSize ASC, ID ASC) n, FileName, ID, IDSeries, IDUser, IDMedium, IDMultiFrame, UID, SOPClassUID, InstanceNumber, CreationDate, FileType, ContentDate, ContentTime, Photometric, ImageType, BitsStored, SamplesPerPixel, Height, Width, Frames, Laterality, PixelSpacing, PlanarConfig, PatientOrientation, PatientPosition, ViewPosition, RegionName, ContrastAgent, FileSize, ViewImage, Comments FROM Image (nolock) ) SELECT FileName, ID, IDSeries, IDUser, IDMedium, IDMultiFrame, UID, SOPClassUID, InstanceNumber, CreationDate, FileType, ContentDate, ContentTime, Photometric, ImageType, BitsStored, SamplesPerPixel, Height, Width, Frames, Laterality, PixelSpacing, PlanarConfig, PatientOrientation, PatientPosition, ViewPosition, RegionName, ContrastAgent, FileSize, ViewImage, Comments FROM CTEImg WHERE n BETWEEN 2171601 AND 2171700 ORDER BY n ASC; 1 1 0 NULL NULL NULL NULL 9,000001 NULL NULL NULL 16819,54 NULL NULL SELECT 0 NULL
100 1 |--Filter(WHERE:([Expr1003]>=(2171601) AND [Expr1003]<=(2171700))) 1 2 1 Filter Filter WHERE:([Expr1003]>=(2171601) AND [Expr1003]<=(2171700)) NULL 9,000001 0 8,8E-05 8896 16819,54 [Djanel_Big].[dbo].[Image].[ID], [Djanel_Big].[dbo].[Image].[IDSeries], [Djanel_Big].[dbo].[Image].[IDUser], [Djanel_Big].[dbo].[Image].[IDMedium], [Djanel_Big].[dbo].[Image].[IDMultiFrame], [Djanel_Big].[dbo].[Image].[UID], [Djanel_Big].[dbo].[Image].[SOPClassUID], [Djanel_Big].[dbo].[Image].[InstanceNumber], [Djanel_Big].[dbo].[Image].[CreationDate], [Djanel_Big].[dbo].[Image].[FileName], [Djanel_Big].[dbo].[Image].[FileType], [Djanel_Big].[dbo].[Image].[ContentDate], [Djanel_Big].[dbo].[Image].[ContentTime], [Djanel_Big].[dbo].[Image].[Photometric], [Djanel_Big].[dbo].[Image].[ImageType], [Djanel_Big].[dbo].[Image].[BitsStored], [Djanel_Big].[dbo].[Image].[SamplesPerPixel], [Djanel_Big].[dbo].[Image].[Height], [Djanel_Big].[dbo].[Image].[Width], [Djanel_Big].[dbo].[Image].[Frames], [Djanel_Big].[dbo].[Image].[Laterality], [Djanel_Big].[dbo].[Image].[PixelSpacing], [Djanel_Big].[dbo].[Image].[PlanarConfig], [Djanel_Big].[dbo].[Image].[PatientOrientation], [Djanel_Big].[dbo].[Image].[PatientPosition], [Djanel_Big].[dbo].[Image].[ViewPosition], [Djanel_Big].[dbo].[Image].[RegionName], [Djanel_Big].[dbo].[Image].[ContrastAgent], [Djanel_Big].[dbo].[Image].[ViewImage], [Djanel_Big].[dbo].[Image].[Comments], [Djanel_Big].[dbo].[Image].[FileSize], [Expr1003] NULL PLAN_ROW 0 1
2171700 1 |--Top(TOP EXPRESSION:(CASE WHEN (2171700) IS NULL OR (2171700)<(0) THEN (0) ELSE (2171700) END)) 1 3 2 Top Top TOP EXPRESSION:(CASE WHEN (2171700) IS NULL OR (2171700)<(0) THEN (0) ELSE (2171700) END) NULL 100 0 1E-05 8896 16819,54 [Djanel_Big].[dbo].[Image].[ID], [Djanel_Big].[dbo].[Image].[IDSeries], [Djanel_Big].[dbo].[Image].[IDUser], [Djanel_Big].[dbo].[Image].[IDMedium], [Djanel_Big].[dbo].[Image].[IDMultiFrame], [Djanel_Big].[dbo].[Image].[UID], [Djanel_Big].[dbo].[Image].[SOPClassUID], [Djanel_Big].[dbo].[Image].[InstanceNumber], [Djanel_Big].[dbo].[Image].[CreationDate], [Djanel_Big].[dbo].[Image].[FileName], [Djanel_Big].[dbo].[Image].[FileType], [Djanel_Big].[dbo].[Image].[ContentDate], [Djanel_Big].[dbo].[Image].[ContentTime], [Djanel_Big].[dbo].[Image].[Photometric], [Djanel_Big].[dbo].[Image].[ImageType], [Djanel_Big].[dbo].[Image].[BitsStored], [Djanel_Big].[dbo].[Image].[SamplesPerPixel], [Djanel_Big].[dbo].[Image].[Height], [Djanel_Big].[dbo].[Image].[Width], [Djanel_Big].[dbo].[Image].[Frames], [Djanel_Big].[dbo].[Image].[Laterality], [Djanel_Big].[dbo].[Image].[PixelSpacing], [Djanel_Big].[dbo].[Image].[PlanarConfig], [Djanel_Big].[dbo].[Image].[PatientOrientation], [Djanel_Big].[dbo].[Image].[PatientPosition], [Djanel_Big].[dbo].[Image].[ViewPosition], [Djanel_Big].[dbo].[Image].[RegionName], [Djanel_Big].[dbo].[Image].[ContrastAgent], [Djanel_Big].[dbo].[Image].[ViewImage], [Djanel_Big].[dbo].[Image].[Comments], [Djanel_Big].[dbo].[Image].[FileSize], [Expr1003] NULL PLAN_ROW 0 1
2171700 1 |--Sequence Project(DEFINE:([Expr1003]=row_number)) 1 4 3 Sequence Project Compute Scalar DEFINE:([Expr1003]=row_number) [Expr1003]=row_number 100 0 0,4610008 8896 16819,54 [Djanel_Big].[dbo].[Image].[ID], [Djanel_Big].[dbo].[Image].[IDSeries], [Djanel_Big].[dbo].[Image].[IDUser], [Djanel_Big].[dbo].[Image].[IDMedium], [Djanel_Big].[dbo].[Image].[IDMultiFrame], [Djanel_Big].[dbo].[Image].[UID], [Djanel_Big].[dbo].[Image].[SOPClassUID], [Djanel_Big].[dbo].[Image].[InstanceNumber], [Djanel_Big].[dbo].[Image].[CreationDate], [Djanel_Big].[dbo].[Image].[FileName], [Djanel_Big].[dbo].[Image].[FileType], [Djanel_Big].[dbo].[Image].[ContentDate], [Djanel_Big].[dbo].[Image].[ContentTime], [Djanel_Big].[dbo].[Image].[Photometric], [Djanel_Big].[dbo].[Image].[ImageType], [Djanel_Big].[dbo].[Image].[BitsStored], [Djanel_Big].[dbo].[Image].[SamplesPerPixel], [Djanel_Big].[dbo].[Image].[Height], [Djanel_Big].[dbo].[Image].[Width], [Djanel_Big].[dbo].[Image].[Frames], [Djanel_Big].[dbo].[Image].[Laterality], [Djanel_Big].[dbo].[Image].[PixelSpacing], [Djanel_Big].[dbo].[Image].[PlanarConfig], [Djanel_Big].[dbo].[Image].[PatientOrientation], [Djanel_Big].[dbo].[Image].[PatientPosition], [Djanel_Big].[dbo].[Image].[ViewPosition], [Djanel_Big].[dbo].[Image].[RegionName], [Djanel_Big].[dbo].[Image].[ContrastAgent], [Djanel_Big].[dbo].[Image].[ViewImage], [Djanel_Big].[dbo].[Image].[Comments], [Djanel_Big].[dbo].[Image].[FileSize], [Expr1003] NULL PLAN_ROW 0 1
2171700 1 |--Segment 1 5 4 Segment Segment NULL NULL 100 0 0,1152502 8896 16819,54 [Djanel_Big].[dbo].[Image].[ID], [Djanel_Big].[dbo].[Image].[IDSeries], [Djanel_Big].[dbo].[Image].[IDUser], [Djanel_Big].[dbo].[Image].[IDMedium], [Djanel_Big].[dbo].[Image].[IDMultiFrame], [Djanel_Big].[dbo].[Image].[UID], [Djanel_Big].[dbo].[Image].[SOPClassUID], [Djanel_Big].[dbo].[Image].[InstanceNumber], [Djanel_Big].[dbo].[Image].[CreationDate], [Djanel_Big].[dbo].[Image].[FileName], [Djanel_Big].[dbo].[Image].[FileType], [Djanel_Big].[dbo].[Image].[ContentDate], [Djanel_Big].[dbo].[Image].[ContentTime], [Djanel_Big].[dbo].[Image].[Photometric], [Djanel_Big].[dbo].[Image].[ImageType], [Djanel_Big].[dbo].[Image].[BitsStored], [Djanel_Big].[dbo].[Image].[SamplesPerPixel], [Djanel_Big].[dbo].[Image].[Height], [Djanel_Big].[dbo].[Image].[Width], [Djanel_Big].[dbo].[Image].[Frames], [Djanel_Big].[dbo].[Image].[Laterality], [Djanel_Big].[dbo].[Image].[PixelSpacing], [Djanel_Big].[dbo].[Image].[PlanarConfig], [Djanel_Big].[dbo].[Image].[PatientOrientation], [Djanel_Big].[dbo].[Image].[PatientPosition], [Djanel_Big].[dbo].[Image].[ViewPosition], [Djanel_Big].[dbo].[Image].[RegionName], [Djanel_Big].[dbo].[Image].[ContrastAgent], [Djanel_Big].[dbo].[Image].[ViewImage], [Djanel_Big].[dbo].[Image].[Comments], [Djanel_Big].[dbo].[Image].[FileSize], [Segment1005] NULL PLAN_ROW 0 1
2171700 1 |--Parallelism(Gather Streams, ORDER BY:([Djanel_Big].[dbo].[Image].[FileSize] ASC, [Djanel_Big].[dbo].[Image].[ID] ASC)) 1 6 5 Parallelism Gather Streams ORDER BY:([Djanel_Big].[dbo].[Image].[FileSize] ASC, [Djanel_Big].[dbo].[Image].[ID] ASC) NULL 100 0 0,04520856 8888 16819,54 [Djanel_Big].[dbo].[Image].[ID], [Djanel_Big].[dbo].[Image].[IDSeries], [Djanel_Big].[dbo].[Image].[IDUser], [Djanel_Big].[dbo].[Image].[IDMedium], [Djanel_Big].[dbo].[Image].[IDMultiFrame], [Djanel_Big].[dbo].[Image].[UID], [Djanel_Big].[dbo].[Image].[SOPClassUID], [Djanel_Big].[dbo].[Image].[InstanceNumber], [Djanel_Big].[dbo].[Image].[CreationDate], [Djanel_Big].[dbo].[Image].[FileName], [Djanel_Big].[dbo].[Image].[FileType], [Djanel_Big].[dbo].[Image].[ContentDate], [Djanel_Big].[dbo].[Image].[ContentTime], [Djanel_Big].[dbo].[Image].[Photometric], [Djanel_Big].[dbo].[Image].[ImageType], [Djanel_Big].[dbo].[Image].[BitsStored], [Djanel_Big].[dbo].[Image].[SamplesPerPixel], [Djanel_Big].[dbo].[Image].[Height], [Djanel_Big].[dbo].[Image].[Width], [Djanel_Big].[dbo].[Image].[Frames], [Djanel_Big].[dbo].[Image].[Laterality], [Djanel_Big].[dbo].[Image].[PixelSpacing], [Djanel_Big].[dbo].[Image].[PlanarConfig], [Djanel_Big].[dbo].[Image].[PatientOrientation], [Djanel_Big].[dbo].[Image].[PatientPosition], [Djanel_Big].[dbo].[Image].[ViewPosition], [Djanel_Big].[dbo].[Image].[RegionName], [Djanel_Big].[dbo].[Image].[ContrastAgent], [Djanel_Big].[dbo].[Image].[ViewImage], [Djanel_Big].[dbo].[Image].[Comments], [Djanel_Big].[dbo].[Image].[FileSize] NULL PLAN_ROW 1 1
2172460 8 |--Sort(ORDER BY:([Djanel_Big].[dbo].[Image].[FileSize] ASC, [Djanel_Big].[dbo].[Image].[ID] ASC)) 1 7 6 Sort Sort ORDER BY:([Djanel_Big].[dbo].[Image].[FileSize] ASC, [Djanel_Big].[dbo].[Image].[ID] ASC) NULL 100 16223,28 60,89799 8888 16819,5 [Djanel_Big].[dbo].[Image].[ID], [Djanel_Big].[dbo].[Image].[IDSeries], [Djanel_Big].[dbo].[Image].[IDUser], [Djanel_Big].[dbo].[Image].[IDMedium], [Djanel_Big].[dbo].[Image].[IDMultiFrame], [Djanel_Big].[dbo].[Image].[UID], [Djanel_Big].[dbo].[Image].[SOPClassUID], [Djanel_Big].[dbo].[Image].[InstanceNumber], [Djanel_Big].[dbo].[Image].[CreationDate], [Djanel_Big].[dbo].[Image].[FileName], [Djanel_Big].[dbo].[Image].[FileType], [Djanel_Big].[dbo].[Image].[ContentDate], [Djanel_Big].[dbo].[Image].[ContentTime], [Djanel_Big].[dbo].[Image].[Photometric], [Djanel_Big].[dbo].[Image].[ImageType], [Djanel_Big].[dbo].[Image].[BitsStored], [Djanel_Big].[dbo].[Image].[SamplesPerPixel], [Djanel_Big].[dbo].[Image].[Height], [Djanel_Big].[dbo].[Image].[Width], [Djanel_Big].[dbo].[Image].[Frames], [Djanel_Big].[dbo].[Image].[Laterality], [Djanel_Big].[dbo].[Image].[PixelSpacing], [Djanel_Big].[dbo].[Image].[PlanarConfig], [Djanel_Big].[dbo].[Image].[PatientOrientation], [Djanel_Big].[dbo].[Image].[PatientPosition], [Djanel_Big].[dbo].[Image].[ViewPosition], [Djanel_Big].[dbo].[Image].[RegionName], [Djanel_Big].[dbo].[Image].[ContrastAgent], [Djanel_Big].[dbo].[Image].[ViewImage], [Djanel_Big].[dbo].[Image].[Comments], [Djanel_Big].[dbo].[Image].[FileSize] NULL PLAN_ROW 1 1
5762510 8 |--Clustered Index Scan(OBJECT:([Djanel_Big].[dbo].[Image].[PK_IMAGE])) 1 8 7 Clustered Index Scan Clustered Index Scan OBJECT:([Djanel_Big].[dbo].[Image].[PK_IMAGE]) [Djanel_Big].[dbo].[Image].[ID], [Djanel_Big].[dbo].[Image].[IDSeries], [Djanel_Big].[dbo].[Image].[IDUser], [Djanel_Big].[dbo].[Image].[IDMedium], [Djanel_Big].[dbo].[Image].[IDMultiFrame], [Djanel_Big].[dbo].[Image].[UID], [Djanel_Big].[dbo].[Image].[SOPClassUID], [Djanel_Big].[dbo].[Image].[InstanceNumber], [Djanel_Big].[dbo].[Image].[CreationDate], [Djanel_Big].[dbo].[Image].[FileName], [Djanel_Big].[dbo].[Image].[FileType], [Djanel_Big].[dbo].[Image].[ContentDate], [Djanel_Big].[dbo].[Image].[ContentTime], [Djanel_Big].[dbo].[Image].[Photometric], [Djanel_Big].[dbo].[Image].[ImageType], [Djanel_Big].[dbo].[Image].[BitsStored], [Djanel_Big].[dbo].[Image].[SamplesPerPixel], [Djanel_Big].[dbo].[Image].[Height], [Djanel_Big].[dbo].[Image].[Width], [Djanel_Big].[dbo].[Image].[Frames], [Djanel_Big].[dbo].[Image].[Laterality], [Djanel_Big].[dbo].[Image].[PixelSpacing], [Djanel_Big].[dbo].[Image].[PlanarConfig], [Djanel_Big].[dbo].[Image].[PatientOrientation], [Djanel_Big].[dbo].[Image].[PatientPosition], [Djanel_Big].[dbo].[Image].[ViewPosition], [Djanel_Big].[dbo].[Image].[RegionName], [Djanel_Big].[dbo].[Image].[ContrastAgent], [Djanel_Big].[dbo].[Image].[ViewImage], [Djanel_Big].[dbo].[Image].[Comments], [Djanel_Big].[dbo].[Image].[FileSize] 5762510 533,7343 1,58473 8888 535,319 [Djanel_Big].[dbo].[Image].[ID], [Djanel_Big].[dbo].[Image].[IDSeries], [Djanel_Big].[dbo].[Image].[IDUser], [Djanel_Big].[dbo].[Image].[IDMedium], [Djanel_Big].[dbo].[Image].[IDMultiFrame], [Djanel_Big].[dbo].[Image].[UID], [Djanel_Big].[dbo].[Image].[SOPClassUID], [Djanel_Big].[dbo].[Image].[InstanceNumber], [Djanel_Big].[dbo].[Image].[CreationDate], [Djanel_Big].[dbo].[Image].[FileName], [Djanel_Big].[dbo].[Image].[FileType], [Djanel_Big].[dbo].[Image].[ContentDate], [Djanel_Big].[dbo].[Image].[ContentTime], [Djanel_Big].[dbo].[Image].[Photometric], [Djanel_Big].[dbo].[Image].[ImageType], [Djanel_Big].[dbo].[Image].[BitsStored], [Djanel_Big].[dbo].[Image].[SamplesPerPixel], [Djanel_Big].[dbo].[Image].[Height], [Djanel_Big].[dbo].[Image].[Width], [Djanel_Big].[dbo].[Image].[Frames], [Djanel_Big].[dbo].[Image].[Laterality], [Djanel_Big].[dbo].[Image].[PixelSpacing], [Djanel_Big].[dbo].[Image].[PlanarConfig], [Djanel_Big].[dbo].[Image].[PatientOrientation], [Djanel_Big].[dbo].[Image].[PatientPosition], [Djanel_Big].[dbo].[Image].[ViewPosition], [Djanel_Big].[dbo].[Image].[RegionName], [Djanel_Big].[dbo].[Image].[ContrastAgent], [Djanel_Big].[dbo].[Image].[ViewImage], [Djanel_Big].[dbo].[Image].[Comments], [Djanel_Big].[dbo].[Image].[FileSize] NULL PLAN_ROW 1 1
26 янв 12, 12:57    [11974832]     Ответить | Цитировать Сообщить модератору
 Re: Постраничная выборка  [new]
LeadyGaaga
Member

Откуда:
Сообщений: 37
alexeyvg
Без индекса будет каждый раз сортироваться вся таблица.


В плане запроса будет Top N Sort, т.е хвост дососортироваться конечно не будет (только данные до и текщая страница).
26 янв 12, 12:58    [11974850]     Ответить | Цитировать Сообщить модератору
 Re: Постраничная выборка  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31994
alexeyvg
Во втором случае вы ему подсказываете оптимальную стратегию выборки, вот и быстро.
Ну и из второго запроса можно лишний джойн убрать...

SELECT *
FROM 
      (SELECT TOP 100 *
      FROM table1 
      WHERE ID IN
            (SELECT TOP 2171700 ID 
            FROM table1
            ORDER BY FileSize ASC, ID ASC)  
      ORDER BY FileSize DESC, ID DESC) t
ORDER BY FileSize ASC, ID ASC
26 янв 12, 12:58    [11974856]     Ответить | Цитировать Сообщить модератору
 Re: Постраничная выборка  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31994
LeadyGaaga
alexeyvg
Без индекса будет каждый раз сортироваться вся таблица.


В плане запроса будет Top N Sort, т.е хвост дососортироваться конечно не будет (только данные до и текщая страница).
так откуда он узнает, что это хвост?

В запросе:
SELECT TOP 2171700 ID 
FROM table1
ORDER BY FileSize ASC, ID ASC
сервер возмёт всю таблицу, отсортирует по полю FileSize, а потом возьмёт для дальнейшей обработки первые 2171700 записей из отсортированного списка.
26 янв 12, 13:02    [11974900]     Ответить | Цитировать Сообщить модератору
 Re: Постраничная выборка  [new]
hdd-killer
Member

Откуда: СПб
Сообщений: 206
Всем спасибо, в целом суть проблемы понятна. По поводу индексов тоже подумаю. Отдельное спасибо LeadyGaaga за оптимизированный вариант.
26 янв 12, 13:11    [11974985]     Ответить | Цитировать Сообщить модератору
 Re: Постраничная выборка  [new]
LeadyGaaga
Member

Откуда:
Сообщений: 37
alexeyvg,
Я имел ввиду что сервер честно отсортирует 2171700 записей, но остальные (хвост) аккуратно досортирован не будет.
Это поведение описано хорошо в статье :
http://sqlblog.com/blogs/paul_white/archive/2010/08/26/sorting-row-goals-and-the-top-100-problem.aspx
26 янв 12, 13:27    [11975198]     Ответить | Цитировать Сообщить модератору
 Re: Постраничная выборка  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31994
LeadyGaaga
alexeyvg,
Я имел ввиду что сервер честно отсортирует 2171700 записей, но остальные (хвост) аккуратно досортирован не будет.
Это поведение описано хорошо в статье :
http://sqlblog.com/blogs/paul_white/archive/2010/08/26/sorting-row-goals-and-the-top-100-problem.aspx
Если вы про вторую сортировку, то я согласен. Я про то, как ему получить эти 2171700 записей из исходной таблицы.

Статья интересная, Спасибо.
Но алгоритм "сортировки без сортировки" работает только для 100 строк, и главное, хоть и не делается полноценная сортировка всех данных, всё равно мы доллжны просканировать всю исходную таблицу, всё равно нет другого варианта получить первые записи в каком то порядке. То есть это всё равно сортировка всех данных, но она, как я понял, как бы без полноценного сохранения результата.
26 янв 12, 14:03    [11975596]     Ответить | Цитировать Сообщить модератору
 Re: Постраничная выборка  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31994
LeadyGaaga
но остальные (хвост) аккуратно досортирован не будет.
Хотел подчеркнуть, что так просто неправильно называть - понятно, что при сортировке нужно обрабатывать все данные в сортируемом списке, просто абсурдно предполагать другое.
Это просто другой алгоритм.
26 янв 12, 14:05    [11975622]     Ответить | Цитировать Сообщить модератору
 Re: Постраничная выборка  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
Глядя на сие хочется привести маленький тест
Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64)

set nocount on;
--drop table #t
create table #t(id int identity,file_size int)
declare @i int;
set @i = 0;
while @i<6000000
begin
insert into #t(file_size)
values(checksum(newid()))
set @i=@i+1
end;

WITH CTEPage AS
(
    SELECT ROW_NUMBER() OVER (ORDER BY file_size ASC, ID ASC) n, *
    FROM #t 
) 
SELECT * 
FROM CTEPage
--inner join #t t on t.id =CTEPage.id  
WHERE n BETWEEN 2171600 AND 2171700
ORDER BY n asc

;WITH CTEPage AS
(
    SELECT ROW_NUMBER() OVER (ORDER BY file_size ASC, ID ASC) n, *
    FROM #t 
) 
SELECT t.* 
FROM CTEPage
inner join #t t on t.id =CTEPage.id  
WHERE n BETWEEN 2171600 AND 2171700
ORDER BY n asc

--set statistics time on;
SELECT *
FROM #t 
WHERE ID IN 
      (SELECT TOP 100 ID 
      FROM #t  
      WHERE ID IN
            (SELECT TOP 2171700 ID 
            FROM #t 
            ORDER BY file_size ASC, ID ASC)  
      ORDER BY file_size DESC, ID DESC)  
ORDER BY file_size ASC, ID ASC

В приложенном файле планы выполнения

К сообщению приложен файл. Размер - 136Kb
26 янв 12, 14:51    [11976097]     Ответить | Цитировать Сообщить модератору
 Re: Постраничная выборка  [new]
LeadyGaaga
Member

Откуда:
Сообщений: 37
Глядя на сие хочется привести маленький тест


Индекс на id добавьте.
26 янв 12, 14:59    [11976195]     Ответить | Цитировать Сообщить модератору
 Re: Постраничная выборка  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
LeadyGaaga,
А смысл...
я к тому,что CTE быстрее.
26 янв 12, 15:11    [11976369]     Ответить | Цитировать Сообщить модератору
 Re: Постраничная выборка  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31994
LeadyGaaga
Глядя на сие хочется привести маленький тест


Индекс на id добавьте.
Не совсем корректный тест :-)

У ТС есть ещё хитрый индекс с полем file_size, который и используется в быстром варианте запроса.
26 янв 12, 15:19    [11976471]     Ответить | Цитировать Сообщить модератору
 Re: Постраничная выборка  [new]
LeadyGaaga
Member

Откуда:
Сообщений: 37
А смысл...


Смысл, что план запроса другой будет. И таких столбцов как FileSize должно быть 10, это тоже очень важно.
26 янв 12, 15:19    [11976475]     Ответить | Цитировать Сообщить модератору
 Re: Постраничная выборка  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
LeadyGaaga,
Речь о том,что при прочих равных условиях CTE быстрее.специально делал без индексов
26 янв 12, 15:32    [11976605]     Ответить | Цитировать Сообщить модератору
 Re: Постраничная выборка  [new]
LeadyGaaga
Member

Откуда:
Сообщений: 37
Top, если его нормально написать, ну уж точно не хуже чем cte :

SET STATISTICS IO ON ;
SET STATISTICS TIME ON ;

SELECT t.*
FROM 
      ( 
		SELECT 
				TOP(100) q.ID
		               
		FROM 
			 ( 
				SELECT 
						TOP (2171700) t.ID
									 ,t.file_size
				FROM dbo.t AS t 
				ORDER BY t.id ASC, file_size ASC 
			 ) AS q 
		ORDER BY 
				 q.ID DESC
				,q.file_size  DESC   
      ) AS tp 
  JOIN dbo.t AS t 
    ON t.ID = tp.ID    
ORDER BY tp.id  
26 янв 12, 15:49    [11976799]     Ответить | Цитировать Сообщить модератору
 Re: Постраничная выборка  [new]
LeadyGaaga
Member

Откуда:
Сообщений: 37
Вот мои результаты :

top :
Table 't'. Scan count 1, logical reads 4901, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

 SQL Server Execution Times:
   CPU time = 2906 ms,  elapsed time = 2902 ms.


cte :
Table 't'. Scan count 1, logical reads 12957, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

 SQL Server Execution Times:
   CPU time = 13438 ms,  elapsed time = 17524 ms.
26 янв 12, 15:59    [11976916]     Ответить | Цитировать Сообщить модератору
 Re: Постраничная выборка  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31994
LeadyGaaga
Top, если его нормально написать, ну уж точно не хуже чем cte :
Но у вас же другой запрос.

Вы берёте записи, сортируя их по кластерному индексу, а не по file_size.
26 янв 12, 16:21    [11977133]     Ответить | Цитировать Сообщить модератору
 Re: Постраничная выборка  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
LeadyGaaga, замечательный результат один запрос работает по индексу,другой нет хорошие условия.Надо целиком описывать,при каких условия работают скрипты.
Выкладываю целый скрипт с тестовыми данными и запросами,что б все по честному.Смотрим результат,делаем выводы.

set nocount on;
create table #t
  (
    id int identity
  , file_size int
  )
declare @i int ;
set @i = 0 ;
while @i < 6000000 
  begin
    insert  into #t
            ( file_size )
    values  ( checksum(newid()) )
    set @i = @i + 1
  end ;
  
create index Ix_zz on #t(id,file_size) ;


set statistics io on ;
set statistics time on ;

with  CTEPage
        as ( select ROW_NUMBER() over ( order by ID asc, file_size asc ) n
                  , *
             from   #t
           )
  select  *
  from    CTEPage
  where   n between 2171600 and 2171700
  order by n asc



select  t.*
from    ( select top ( 100 )
                  q.ID
          from    ( select top ( 2171700 )
                            t.ID
                          , t.file_size
                    from    #t as t
                    order by t.id asc
                          , file_size asc
                  ) as q
          order by q.ID desc
                , q.file_size desc
        ) as tp
join    #t as t on t.ID = tp.ID
order by tp.id  
26 янв 12, 16:26    [11977166]     Ответить | Цитировать Сообщить модератору
 Re: Постраничная выборка  [new]
LeadyGaaga
Member

Откуда:
Сообщений: 37
alexeyvg
Но у вас же другой запрос.


Да, действительно, я поторопился. Конечно нужно FileSize ASC, ID ASC вместо ID, FileSize.
Результат получился top хуже cte :

Table 't'. Scan count 1, logical reads 12969, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

 SQL Server Execution Times:
   CPU time = 14844 ms,  elapsed time = 17817 ms.
26 янв 12, 16:36    [11977276]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить