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

Откуда: Новосибирск
Сообщений: 290
Всем привет!

Имеется запрос следующего вида

with ept as(
  select top 1000
    episode_key,
    effective_date,
    cast(priority as int) as priority,
    row_number() over(partition by episode_key order by transaction_sequence_no) as rownum
  from wl_episode_priority
),

ep as (
  select ept.*, cast(null as int) as prev_priority from ept where rownum = 1
  union all
  select ept.*, ep.priority as prev_priority from ept
    inner join ep
      on ept.episode_key = ep.episode_key
      and ept.rownum = ep.rownum + 1
)

select
  episode_key,
  effective_date
from ep
where priority > prev_priority
option (maxrecursion 0)

Обычный рекурсивный запрос где для вычисления текущей записи требуется значение предыдущей.
Порядок задан полем rownum.

Табличка wl_episode_priority 100000 записей.

Единственный индекс:
CREATE UNIQUE INDEX ix_wl_episode_priority ON wl_episode_priority (episode_key, transaction_sequence_no

Если не ограничивать ept 10000 записей, запрос не возвращается минимум первые пару минут.

Если смотреть актуальный план (тормозная часть плана в аттаче), то видно что оптимизатор перемножает ept саму с собой. RID Lookup занимает 100% времени.

В настоящее время разруливаю материализацией ept в виде временной таблицы.

Кто знает красивое решение этой (кстати, довольно стандартной) задачки?

Может есть хинты для материализации части запроса (типа WITH /*+MATERIALIZE*/ у ORACLE)?
(вряд ли это можно назвать красивым решением, т.к. если запрос вызывать для одного эпизода, то будет ненужное создание временной таблицы для всего набора)
23 июн 09, 11:09    [7331888]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит рекурсивный запрос с ROW_COUNT  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
1)
Ionah
Обычный рекурсивный запрос где для вычисления текущей записи требуется значение предыдущей.
Курсором не пробовали?
(опасливо озираясь по сторонам)

2)
Ionah
Если смотреть актуальный план (тормозная часть плана в аттаче),
то видно что оптимизатор перемножает ept саму с собой. RID Lookup занимает 100% времени.
Вы забыли план приаттачить
23 июн 09, 11:17    [7331932]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит рекурсивный запрос с ROW_COUNT  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36817
priority и effective_date надо добавить или инклудом вкрячить в индекс . Как минимум.
23 июн 09, 11:18    [7331943]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит рекурсивный запрос с ROW_COUNT  [new]
Ionah
Member

Откуда: Новосибирск
Сообщений: 290
Какого художника план не аттачится :(

К сообщению приложен файл. Размер - 0Kb
23 июн 09, 11:18    [7331944]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит рекурсивный запрос с ROW_COUNT  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36817
Ionah
Какого художника план не аттачится :(
Планы надо в текстовом виде выкладывать.
23 июн 09, 11:19    [7331950]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит рекурсивный запрос с ROW_COUNT  [new]
Ionah
Member

Откуда: Новосибирск
Сообщений: 290
Гавриленко Сергей Алексеевич
priority и effective_date надо добавить или инклудом вкрячить в индекс . Как минимум.


Я Вас правильно понял что каждое поле, которое понадобится для вычислений, нужно добавлять в индекс (или даже в первичный ключ?!?) ?
23 июн 09, 11:21    [7331963]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит рекурсивный запрос с ROW_COUNT  [new]
Senya_L
Member

Откуда: Москва
Сообщений: 5381
Ionah,

А вот такой индекс не поможет делу?
CREATE UNIQUE CLUSTERED INDEX ix_wl_episode_priority ON wl_episode_priority (transaction_sequence_no, episode_key)
23 июн 09, 11:22    [7331968]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит рекурсивный запрос с ROW_COUNT  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36817
Ionah
Гавриленко Сергей Алексеевич
priority и effective_date надо добавить или инклудом вкрячить в индекс . Как минимум.


Я Вас правильно понял что каждое поле, которое понадобится для вычислений, нужно добавлять в индекс (или даже в первичный ключ?!?) ?
Rid Lookup и есть операция, которая достает из таблицы те данные, которых нет в индексе. Соответственно, что бы ее не было, надо что или индекс по episode_key был ксластерный, или делать этот индекс покрывающим, т.е. чтобы все нужные поля для запроса были в индексе, в инклуде или в ключе.
23 июн 09, 11:24    [7331988]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит рекурсивный запрос с ROW_COUNT  [new]
Ionah
Member

Откуда: Новосибирск
Сообщений: 290
Создал такой индекс

create unique index ix1 on wl_episode_priority(episode_key, transaction_sequence_no, effective_date, priority)

Все равно колбасит 1000000 записей, медленно, но уже по одному индексу, без джойна индекса с таблицей
23 июн 09, 11:29    [7332027]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит рекурсивный запрос с ROW_COUNT  [new]
Ionah
Member

Откуда: Новосибирск
Сообщений: 290
Senya_L
Ionah,

А вот такой индекс не поможет делу?
CREATE UNIQUE CLUSTERED INDEX ix_wl_episode_priority ON wl_episode_priority (transaction_sequence_no, episode_key)


Не помог, выполняется даже дольше первоначального
23 июн 09, 11:31    [7332040]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит рекурсивный запрос с ROW_COUNT  [new]
Senya_L
Member

Откуда: Москва
Сообщений: 5381
Ionah
Senya_L
Ionah,

А вот такой индекс не поможет делу?
CREATE UNIQUE CLUSTERED INDEX ix_wl_episode_priority ON wl_episode_priority (transaction_sequence_no, episode_key)


Не помог, выполняется даже дольше первоначального
Вы же полный план не выкладываете
А проверьте такой запрос
with ept as(
  select top 1000
    episode_key,
    effective_date,
    cast(priority as int) as priority,
--    row_number() over(partition by episode_key order by transaction_sequence_no) as rownum
  from wl_episode_priority
),

ep as (
  select ept.*, cast(null as int) as prev_priority from ept where rownum = 1
  union all
  select ept.*, ep.priority as prev_priority from ept
    inner join ep
      on ept.episode_key = ep.episode_key
      and ept.rownum = ep.rownum + 1
)

select
  episode_key,
  effective_date
from ep
where priority > prev_priority
option (maxrecursion 0)
Он бессмысленный, конечно, но проверить бы надо, что не сортировка тормозит.
23 июн 09, 11:34    [7332064]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит рекурсивный запрос с ROW_COUNT  [new]
aleks2
Guest
Ionah

Все равно колбасит 1000000 записей, медленно

Дык, кто ж тебе, родимый, могет БЫСТРО пронумеровать 1000000 записей? Да еще два раза...

Учись писать триггера, чтоль... или курсор пользуй.
23 июн 09, 11:55    [7332202]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит рекурсивный запрос с ROW_COUNT  [new]
Ionah
Member

Откуда: Новосибирск
Сообщений: 290
aleks2
Ionah

Все равно колбасит 1000000 записей, медленно

Дык, кто ж тебе, родимый, могет БЫСТРО пронумеровать 1000000 записей? Да еще два раза...

Учись писать триггера, чтоль... или курсор пользуй.


ORACLE могет. Мне не надо пронумеровать 1000000 записей, всего лишь 1000, посмотрите внимательнее запрос.
24 июн 09, 02:48    [7335683]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит рекурсивный запрос с ROW_COUNT  [new]
Ionah
Member

Откуда: Новосибирск
Сообщений: 290
Ок, вот все данные

SET STATISTICS PROFILE ON
SET STATISTICS IO ON
SET STATISTICS TIME ON
go

with ept as(
  select top 1000
    episode_key,
	  effective_date,
	  cast(priority as int) as priority,
    row_number() over(partition by episode_key order by transaction_sequence_no) as rownum
  from wl_episode_priority
),

ep as (
  select ept.*, cast(null as int) as prev_priority from ept where rownum = 1
  union all
  select ept.*, ep.priority as prev_priority from ept
    inner join ep
      on ept.episode_key = ep.episode_key
      and ept.rownum = ep.rownum + 1
)

select
  episode_key,
	effective_date
from ep
where priority > prev_priority
option (maxrecursion 0)
go

select top 1000
    episode_key,
	  effective_date,
	  cast(priority as int) as priority,
    row_number() over(partition by episode_key order by transaction_sequence_no) as rownum
into #tmp
  from wl_episode_priority
go

with ept as(
  select * from #tmp
),

ep as (
  select ept.*, cast(null as int) as prev_priority from ept where rownum = 1
  union all
  select ept.*, ep.priority as prev_priority from ept
    inner join ep
      on ept.episode_key = ep.episode_key
      and ept.rownum = ep.rownum + 1
)

select
  episode_key,
	effective_date
from ep
where priority > prev_priority
option (maxrecursion 0)
go

Планы, статистика

Table 'Worktable'. Scan count 2, logical reads 4305, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'wl_episode_priority'. Scan count 1001, logical reads 1009008, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Rows                 Executes             StmtText                                                                                                                                                                                                                                                         StmtId      NodeId      Parent      PhysicalOp                     LogicalOp                      Argument                                                                                            DefinedValues                                                                                                                                                                                                                                                    EstimateRows  EstimateIO    EstimateCPU   AvgRowSize  TotalSubtreeCost OutputList                                                                                                                                                                                                                                 Warnings Type                                                             Parallel EstimateExecutions
-------------------- -------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------- ----------- ----------- ------------------------------ ------------------------------ --------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------- ------------- ------------- ----------- ---------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ -------- ---------------------------------------------------------------- -------- ------------------
48                   1                    with ept as(
  select top 1000
    episode_key,
	  effective_date,
	  cast(priority as int) as priority,
    row_number() over(partition by episode_key order by transaction_sequence_no) as rownum
  from wl_episode_priority
),

ep as (
  select ept.*, c 1           1           0           NULL                           NULL                           NULL                                                                                                NULL                                                                                                                                                                                                                                                             53.64838      NULL          NULL          NULL        32.41253         NULL                                                                                                                                                                                                                                       NULL     SELECT                                                           0        NULL
48                   1                      |--Filter(WHERE:([Recr1020]>[Recr1022]))                                                                                                                                                                                                                       1           2           1           Filter                         Filter                         WHERE:([Recr1020]>[Recr1022])                                                                       NULL                                                                                                                                                                                                                                                             53.64838      0             8.583741E-05  26          32.41253         [Recr1018], [Recr1019]                                                                                                                                                                                                                     NULL     PLAN_ROW                                                         0        1
1000                 1                           |--Index Spool(WITH STACK)                                                                                                                                                                                                                                1           3           2           Index Spool                    Lazy Spool                     WITH STACK                                                                                          NULL                                                                                                                                                                                                                                                             178.8279      0             8.941397E-07  34          32.41245         [Expr1032], [Recr1018], [Recr1019], [Recr1020], [Recr1021], [Recr1022]                                                                                                                                                                     NULL     PLAN_ROW                                                         0        1
1000                 1                                |--Concatenation                                                                                                                                                                                                                                     1           4           3           Concatenation                  Concatenation                  NULL                                                                                                [Expr1032] = ([Expr1029], [Expr1031]), [Recr1018] = ([apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[episode_key]), [Recr1019] = ([apr].[dbo].[wl_episode_priority].[effective_date], [apr].[dbo].[wl_episode_priority].[eff 178.8279      0             1.788279E-07  34          32.24189         [Expr1032], [Recr1018], [Recr1019], [Recr1020], [Recr1021], [Recr1022]                                                                                                                                                                     NULL     PLAN_ROW                                                         0        1
0                    0                                     |--Compute Scalar(DEFINE:([Expr1029]=(0)))                                                                                                                                                                                                      1           5           4           Compute Scalar                 Compute Scalar                 DEFINE:([Expr1029]=(0))                                                                             [Expr1029]=(0)                                                                                                                                                                                                                                                   1             0             1.788279E-06  34          1.788279E-06     [Expr1029], [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[effective_date], [Expr1005], [Expr1004], [Expr1006]                                                                                        NULL     PLAN_ROW                                                         0        179.8279
0                    0                                     |    |--Compute Scalar(DEFINE:([Expr1006]=NULL))                                                                                                                                                                                                1           6           5           Compute Scalar                 Compute Scalar                 DEFINE:([Expr1006]=NULL)                                                                            [Expr1006]=NULL                                                                                                                                                                                                                                                  177.8279      0             1.778279E-05  43          1.732432         [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[effective_date], [Expr1004], [Expr1005], [Expr1006]                                                                                                    NULL     PLAN_ROW                                                         0        1
888                  1                                     |         |--Filter(WHERE:([Expr1004]=(1)))                                                                                                                                                                                                     1           7           6           Filter                         Filter                         WHERE:([Expr1004]=(1))                                                                              NULL                                                                                                                                                                                                                                                             177.8279      0             0.00048       39          1.732415         [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[effective_date], [Expr1004], [Expr1005]                                                                                                                NULL     PLAN_ROW                                                         0        1
1000                 1                                     |              |--Top(TOP EXPRESSION:((1000)))                                                                                                                                                                                                  1           8           7           Top                            Top                            TOP EXPRESSION:((1000))                                                                             NULL                                                                                                                                                                                                                                                             1000          0             0.0001        39          1.731935         [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[effective_date], [Expr1004], [Expr1005]                                                                                                                NULL     PLAN_ROW                                                         0        1
0                    0                                     |                   |--Compute Scalar(DEFINE:([Expr1005]=CONVERT(int,[apr].[dbo].[wl_episode_priority].[priority],0)))                                                                                                                          1           9           8           Compute Scalar                 Compute Scalar                 DEFINE:([Expr1005]=CONVERT(int,[apr].[dbo].[wl_episode_priority].[priority],0))                     [Expr1005]=CONVERT(int,[apr].[dbo].[wl_episode_priority].[priority],0)                                                                                                                                                                                           1000          0             0.0095213     39          1.731835         [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[effective_date], [Expr1004], [Expr1005]                                                                                                                NULL     PLAN_ROW                                                         0        1
1000                 1                                     |                        |--Sequence Project(DEFINE:([Expr1004]=row_number))                                                                                                                                                                    1           10          9           Sequence Project               Compute Scalar                 DEFINE:([Expr1004]=row_number)                                                                      [Expr1004]=row_number                                                                                                                                                                                                                                            1000          0             0.0095213     44          1.731735         [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[effective_date], [apr].[dbo].[wl_episode_priority].[priority], [Expr1004]                                                                              NULL     PLAN_ROW                                                         0        1
0                    0                                     |                             |--Compute Scalar(DEFINE:([Expr1025]=(1)))                                                                                                                                                                        1           11          10          Compute Scalar                 Compute Scalar                 DEFINE:([Expr1025]=(1))                                                                             [Expr1025]=(1)                                                                                                                                                                                                                                                   1000          0             0.00190426    44          1.733639         [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[transaction_sequence_no], [apr].[dbo].[wl_episode_priority].[effective_date], [apr].[dbo].[wl_episode_priority].[priority], [Segment1024], [Expr1025]  NULL     PLAN_ROW                                                         0        1
1000                 1                                     |                                  |--Segment                                                                                                                                                                                                   1           12          11          Segment                        Segment                        [apr].[dbo].[wl_episode_priority].[episode_key]                                                     NULL                                                                                                                                                                                                                                                             1000          0             0.00190426    44          1.733639         [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[transaction_sequence_no], [apr].[dbo].[wl_episode_priority].[effective_date], [apr].[dbo].[wl_episode_priority].[priority], [Segment1024]              NULL     PLAN_ROW                                                         0        1
1000                 1                                     |                                       |--Nested Loops(Inner Join, OUTER REFERENCES:([Bmk1000], [Expr1023]) WITH ORDERED PREFETCH)                                                                                                             1           13          12          Nested Loops                   Inner Join                     OUTER REFERENCES:([Bmk1000], [Expr1023]) WITH ORDERED PREFETCH                                      NULL                                                                                                                                                                                                                                                             1000          0             0.3979903     41          1.731635         [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[transaction_sequence_no], [apr].[dbo].[wl_episode_priority].[effective_date], [apr].[dbo].[wl_episode_priority].[priority]                             NULL     PLAN_ROW                                                         0        1
1000                 1                                     |                                            |--Index Scan(OBJECT:([apr].[dbo].[wl_episode_priority].[ix1]), ORDERED FORWARD)                                                                                                                   1           15          13          Index Scan                     Index Scan                     OBJECT:([apr].[dbo].[wl_episode_priority].[ix1]), ORDERED FORWARD                                   [Bmk1000], [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[transaction_sequence_no]                                                                                                                                          1000          0.2468287     0.1048913     32          0.006939031      [Bmk1000], [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[transaction_sequence_no]                                                                                                                    NULL     PLAN_ROW                                                         0        1
1000                 1000                                  |                                            |--RID Lookup(OBJECT:([apr].[dbo].[wl_episode_priority]), SEEK:([Bmk1000]=[Bmk1000]) LOOKUP ORDERED FORWARD)                                                                                       1           17          13          RID Lookup                     RID Lookup                     OBJECT:([apr].[dbo].[wl_episode_priority]), SEEK:([Bmk1000]=[Bmk1000]) LOOKUP ORDERED FORWARD       [apr].[dbo].[wl_episode_priority].[effective_date], [apr].[dbo].[wl_episode_priority].[priority]                                                                                                                                                                 1             0.003125      0.0001581     26          1.720516         [apr].[dbo].[wl_episode_priority].[effective_date], [apr].[dbo].[wl_episode_priority].[priority]                                                                                                                                           NULL     PLAN_ROW                                                         0        1000.99
112                  1                                     |--Nested Loops(Inner Join, OUTER REFERENCES:([Expr1031], [Recr1013], [Recr1014], [Recr1015], [Recr1016], [Recr1017]))                                                                                                                          1           40          4           Nested Loops                   Inner Join                     OUTER REFERENCES:([Expr1031], [Recr1013], [Recr1014], [Recr1015], [Recr1016], [Recr1017])           NULL                                                                                                                                                                                                                                                             1.005623      0             1.502155E-05  34          30.50945         [Expr1031], [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[effective_date], [Expr1012], [Expr1011], [Recr1015]                                                                                        NULL     PLAN_ROW                                                         0        179.8279
0                    0                                          |--Compute Scalar(DEFINE:([Expr1031]=[Expr1030]+(1)))                                                                                                                                                                                      1           41          40          Compute Scalar                 Compute Scalar                 DEFINE:([Expr1031]=[Expr1030]+(1))                                                                  [Expr1031]=[Expr1030]+(1)                                                                                                                                                                                                                                        1             0             1.788279E-06  34          1.788279E-06     [Expr1031], [Recr1013], [Recr1014], [Recr1015], [Recr1016], [Recr1017]                                                                                                                                                                     NULL     PLAN_ROW                                                         0        179.8279
1000                 1                                          |    |--Table Spool(WITH STACK)                                                                                                                                                                                                            1           42          41          Table Spool                    Lazy Spool                     WITH STACK                                                                                          NULL                                                                                                                                                                                                                                                             1             0             1.788279E-06  34          1.788279E-06     [Expr1030], [Recr1013], [Recr1014], [Recr1015], [Recr1016], [Recr1017]                                                                                                                                                                     NULL     PLAN_ROW                                                         0        179.8279
112                  1000                                       |--Filter(WHERE:([apr].[dbo].[wl_episode_priority].[episode_key]=[Recr1013] AND [Expr1011]=([Recr1016]+(1))))                                                                                                                              1           46          40          Filter                         Filter                         WHERE:([apr].[dbo].[wl_episode_priority].[episode_key]=[Recr1013] AND [Expr1011]=([Recr1016]+(1)))  NULL                                                                                                                                                                                                                                                             1             0             0.00108       39          30.50944         [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[effective_date], [Expr1011], [Expr1012]                                                                                                                NULL     PLAN_ROW                                                         0        178.8279
1000000              1000                                            |--Top(TOP EXPRESSION:((1000)))                                                                                                                                                                                                       1           47          46          Top                            Top                            TOP EXPRESSION:((1000))                                                                             NULL                                                                                                                                                                                                                                                             1000          0             0.0001        39          30.3163          [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[effective_date], [Expr1011], [Expr1012]                                                                                                                NULL     PLAN_ROW                                                         0        178.8279
0                    0                                                    |--Compute Scalar(DEFINE:([Expr1012]=CONVERT(int,[apr].[dbo].[wl_episode_priority].[priority],0)))                                                                                                                               1           48          47          Compute Scalar                 Compute Scalar                 DEFINE:([Expr1012]=CONVERT(int,[apr].[dbo].[wl_episode_priority].[priority],0))                     [Expr1012]=CONVERT(int,[apr].[dbo].[wl_episode_priority].[priority],0)                                                                                                                                                                                           1000          0             0.0095213     39          30.29842         [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[effective_date], [Expr1011], [Expr1012]                                                                                                                NULL     PLAN_ROW                                                         0        178.8279
1000000              1000                                                      |--Sequence Project(DEFINE:([Expr1011]=row_number))                                                                                                                                                                         1           49          48          Sequence Project               Compute Scalar                 DEFINE:([Expr1011]=row_number)                                                                      [Expr1011]=row_number                                                                                                                                                                                                                                            1000          0             0.0095213     44          30.28054         [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[effective_date], [apr].[dbo].[wl_episode_priority].[priority], [Expr1011]                                                                              NULL     PLAN_ROW                                                         0        178.8279
0                    0                                                              |--Compute Scalar(DEFINE:([Expr1028]=(1)))                                                                                                                                                                             1           50          49          Compute Scalar                 Compute Scalar                 DEFINE:([Expr1028]=(1))                                                                             [Expr1028]=(1)                                                                                                                                                                                                                                                   1000          0             0.00190426    44          30.28244         [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[transaction_sequence_no], [apr].[dbo].[wl_episode_priority].[effective_date], [apr].[dbo].[wl_episode_priority].[priority], [Segment1027], [Expr1028]  NULL     PLAN_ROW                                                         0        178.8279
1000000              1000                                                                |--Segment                                                                                                                                                                                                        1           51          50          Segment                        Segment                        [apr].[dbo].[wl_episode_priority].[episode_key]                                                     NULL                                                                                                                                                                                                                                                             1000          0             0.00190426    44          30.28244         [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[transaction_sequence_no], [apr].[dbo].[wl_episode_priority].[effective_date], [apr].[dbo].[wl_episode_priority].[priority], [Segment1027]              NULL     PLAN_ROW                                                         0        178.8279
1000000              1000                                                                     |--Nested Loops(Inner Join, OUTER REFERENCES:([Bmk1007], [Expr1026]) WITH ORDERED PREFETCH)                                                                                                                  1           52          51          Nested Loops                   Inner Join                     OUTER REFERENCES:([Bmk1007], [Expr1026]) WITH ORDERED PREFETCH                                      NULL                                                                                                                                                                                                                                                             1000          0             0.3979903     41          30.26265         [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[transaction_sequence_no], [apr].[dbo].[wl_episode_priority].[effective_date], [apr].[dbo].[wl_episode_priority].[priority]                             NULL     PLAN_ROW                                                         0        178.8279
1000000              1000                                                                          |--Index Scan(OBJECT:([apr].[dbo].[wl_episode_priority].[ix1]), ORDERED FORWARD)                                                                                                                        1           54          52          Index Scan                     Index Scan                     OBJECT:([apr].[dbo].[wl_episode_priority].[ix1]), ORDERED FORWARD                                   [Bmk1007], [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[transaction_sequence_no]                                                                                                                                          1000          0.2468287     0.1048913     32          0.2304688        [Bmk1007], [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[transaction_sequence_no]                                                                                                                    NULL     PLAN_ROW                                                         0        178.8279
1000000              1000000                                                                       |--RID Lookup(OBJECT:([apr].[dbo].[wl_episode_priority]), SEEK:([Bmk1007]=[Bmk1007]) LOOKUP ORDERED FORWARD)                                                                                            1           56          52          RID Lookup                     RID Lookup                     OBJECT:([apr].[dbo].[wl_episode_priority]), SEEK:([Bmk1007]=[Bmk1007]) LOOKUP ORDERED FORWARD       [apr].[dbo].[wl_episode_priority].[effective_date], [apr].[dbo].[wl_episode_priority].[priority]                                                                                                                                                                 1             0.003125      0.0001581     26          32.41253         [apr].[dbo].[wl_episode_priority].[effective_date], [apr].[dbo].[wl_episode_priority].[priority]                                                                                                                                           NULL     PLAN_ROW                                                         0        357001


SQL Server Execution Times:
   CPU time = 3219 ms,  elapsed time = 3387 ms.
SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 1 ms.
Table 'wl_episode_priority'. Scan count 1, logical reads 1008, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Rows                 Executes             StmtText                                                                                                                                                                                                                                                   StmtId      NodeId      Parent      PhysicalOp                     LogicalOp                      Argument                                                                                                                                                                                                                                DefinedValues                                                                                                            EstimateRows  EstimateIO    EstimateCPU   AvgRowSize  TotalSubtreeCost OutputList                                                                                                                                                                                                                                 Warnings Type                                                             Parallel EstimateExecutions
-------------------- -------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------- ----------- ----------- ------------------------------ ------------------------------ --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------ ------------- ------------- ------------- ----------- ---------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ -------- ---------------------------------------------------------------- -------- ------------------
1000                 1                    select top 1000
    episode_key,
	  effective_date,
	  cast(priority as int) as priority,
    row_number() over(partition by episode_key order by transaction_sequence_no) as rownum
into #tmp
  from wl_episode_priority                                  1           1           0           NULL                           NULL                           NULL                                                                                                                                                                                                                                    NULL                                                                                                                     1000          NULL          NULL          NULL        1.743701         NULL                                                                                                                                                                                                                                       NULL     SELECT INTO                                                      0        NULL
1000                 1                      |--Table Insert(OBJECT:([#tmp]), SET:([#tmp].[episode_key] = [apr].[dbo].[wl_episode_priority].[episode_key],[#tmp].[effective_date] = [apr].[dbo].[wl_episode_priority].[effective_date],[#tmp].[priority] = [Expr1008],[#tmp].[rownum] = [Expr1007]))  1           2           1           Table Insert                   Insert                         OBJECT:([#tmp]), SET:([#tmp].[episode_key] = [apr].[dbo].[wl_episode_priority].[episode_key],[#tmp].[effective_date] = [apr].[dbo].[wl_episode_priority].[effective_date],[#tmp].[priority] = [Expr1008],[#tmp].[rownum] = [Expr1007])  NULL                                                                                                                     1000          0.01066644    0.001         9           1.743701         NULL                                                                                                                                                                                                                                       NULL     PLAN_ROW                                                         0        1
1000                 1                           |--Top(ROWCOUNT est 0)                                                                                                                                                                                                                              1           3           2           Top                            Top                            TOP EXPRESSION:((0))                                                                                                                                                                                                                    NULL                                                                                                                     1000          0             0.0001        38          1.732035         [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[effective_date], [Expr1007], [Expr1008]                                                                                                                NULL     PLAN_ROW                                                         0        1
1000                 1                                |--Top(TOP EXPRESSION:((1000)))                                                                                                                                                                                                                1           4           3           Top                            Top                            TOP EXPRESSION:((1000))                                                                                                                                                                                                                 NULL                                                                                                                     1000          0             0.0001        38          1.731935         [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[effective_date], [Expr1007], [Expr1008]                                                                                                                NULL     PLAN_ROW                                                         0        1
0                    0                                     |--Compute Scalar(DEFINE:([Expr1008]=CONVERT(int,[apr].[dbo].[wl_episode_priority].[priority],0)))                                                                                                                                        1           5           4           Compute Scalar                 Compute Scalar                 DEFINE:([Expr1008]=CONVERT(int,[apr].[dbo].[wl_episode_priority].[priority],0))                                                                                                                                                         [Expr1008]=CONVERT(int,[apr].[dbo].[wl_episode_priority].[priority],0)                                                   1000          0             0.0095213     38          1.731835         [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[effective_date], [Expr1007], [Expr1008]                                                                                                                NULL     PLAN_ROW                                                         0        1
1000                 1                                          |--Sequence Project(DEFINE:([Expr1007]=row_number))                                                                                                                                                                                  1           6           5           Sequence Project               Compute Scalar                 DEFINE:([Expr1007]=row_number)                                                                                                                                                                                                          [Expr1007]=row_number                                                                                                    1000          0             0.0095213     43          1.731735         [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[effective_date], [apr].[dbo].[wl_episode_priority].[priority], [Expr1007]                                                                              NULL     PLAN_ROW                                                         0        1
0                    0                                               |--Compute Scalar(DEFINE:([Expr1011]=(1)))                                                                                                                                                                                      1           7           6           Compute Scalar                 Compute Scalar                 DEFINE:([Expr1011]=(1))                                                                                                                                                                                                                 [Expr1011]=(1)                                                                                                           1000          0             0.00190426    43          1.733639         [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[transaction_sequence_no], [apr].[dbo].[wl_episode_priority].[effective_date], [apr].[dbo].[wl_episode_priority].[priority], [Segment1010], [Expr1011]  NULL     PLAN_ROW                                                         0        1
1000                 1                                                    |--Segment                                                                                                                                                                                                                 1           8           7           Segment                        Segment                        [apr].[dbo].[wl_episode_priority].[episode_key]                                                                                                                                                                                         NULL                                                                                                                     1000          0             0.00190426    43          1.733639         [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[transaction_sequence_no], [apr].[dbo].[wl_episode_priority].[effective_date], [apr].[dbo].[wl_episode_priority].[priority], [Segment1010]              NULL     PLAN_ROW                                                         0        1
1000                 1                                                         |--Nested Loops(Inner Join, OUTER REFERENCES:([Bmk1003], [Expr1009]) WITH ORDERED PREFETCH)                                                                                                                           1           9           8           Nested Loops                   Inner Join                     OUTER REFERENCES:([Bmk1003], [Expr1009]) WITH ORDERED PREFETCH                                                                                                                                                                          NULL                                                                                                                     1000          0             0.3979903     40          1.731635         [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[transaction_sequence_no], [apr].[dbo].[wl_episode_priority].[effective_date], [apr].[dbo].[wl_episode_priority].[priority]                             NULL     PLAN_ROW                                                         0        1
1000                 1                                                              |--Index Scan(OBJECT:([apr].[dbo].[wl_episode_priority].[ix1]), ORDERED FORWARD)                                                                                                                                 1           11          9           Index Scan                     Index Scan                     OBJECT:([apr].[dbo].[wl_episode_priority].[ix1]), ORDERED FORWARD                                                                                                                                                                       [Bmk1003], [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[transaction_sequence_no]  1000          0.2468287     0.1048913     31          0.006939031      [Bmk1003], [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[transaction_sequence_no]                                                                                                                    NULL     PLAN_ROW                                                         0        1
1000                 1000                                                           |--RID Lookup(OBJECT:([apr].[dbo].[wl_episode_priority]), SEEK:([Bmk1003]=[Bmk1003]) LOOKUP ORDERED FORWARD)                                                                                                     1           13          9           RID Lookup                     RID Lookup                     OBJECT:([apr].[dbo].[wl_episode_priority]), SEEK:([Bmk1003]=[Bmk1003]) LOOKUP ORDERED FORWARD                                                                                                                                           [apr].[dbo].[wl_episode_priority].[effective_date], [apr].[dbo].[wl_episode_priority].[priority]                         1             0.003125      0.0001581     26          1.720516         [apr].[dbo].[wl_episode_priority].[effective_date], [apr].[dbo].[wl_episode_priority].[priority]                                                                                                                                           NULL     PLAN_ROW                                                         0        1000.99


SQL Server Execution Times:
   CPU time = 16 ms,  elapsed time = 50 ms.
SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 1 ms.


Table 'Worktable'. Scan count 1002, logical reads 8343, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table '#tmp________________________________________________________________________________________________________________000000000CB3'. Scan count 2, logical reads 14, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Rows                 Executes             StmtText                                                                                                                                                                                                                                                         StmtId      NodeId      Parent      PhysicalOp                     LogicalOp                      Argument                                                                                                 DefinedValues                                                                                                                                                                                                                                                    EstimateRows  EstimateIO    EstimateCPU   AvgRowSize  TotalSubtreeCost OutputList                                                                                                                                                             Warnings Type                                                             Parallel EstimateExecutions
-------------------- -------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------- ----------- ----------- ------------------------------ ------------------------------ -------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------- ------------- ------------- ----------- ---------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------- ---------------------------------------------------------------- -------- ------------------
48                   1                    with ept as(
  select * from #tmp
),

ep as (
  select ept.*, cast(null as int) as prev_priority from ept where rownum = 1
  union all
  select ept.*, ep.priority as prev_priority from ept
    inner join ep
      on ept.episode_key = ep.episode_key 1           1           0           NULL                           NULL                           NULL                                                                                                     NULL                                                                                                                                                                                                                                                             266.7         NULL          NULL          NULL        0.3119977        NULL                                                                                                                                                                   NULL     SELECT                                                           0        NULL
48                   1                      |--Filter(WHERE:([Recr1016]>[Recr1018]))                                                                                                                                                                                                                       1           2           1           Filter                         Filter                         WHERE:([Recr1016]>[Recr1018])                                                                            NULL                                                                                                                                                                                                                                                             266.7         0             0.00042672    26          0.3119977        [Recr1014], [Recr1015]                                                                                                                                                 NULL     PLAN_ROW                                                         0        1
1000                 1                           |--Index Spool(WITH STACK)                                                                                                                                                                                                                                1           3           2           Index Spool                    Lazy Spool                     WITH STACK                                                                                               NULL                                                                                                                                                                                                                                                             889           0             4.445E-06     34          0.311571         [Expr1022], [Recr1014], [Recr1015], [Recr1016], [Recr1017], [Recr1018]                                                                                                 NULL     PLAN_ROW                                                         0        1
1000                 1                                |--Concatenation                                                                                                                                                                                                                                     1           4           3           Concatenation                  Concatenation                  NULL                                                                                                     [Expr1022] = ([Expr1019], [Expr1021]), [Recr1014] = ([tempdb].[dbo].[#tmp].[episode_key], [tempdb].[dbo].[#tmp].[episode_key]), [Recr1015] = ([tempdb].[dbo].[#tmp].[effective_date], [tempdb].[dbo].[#tmp].[effective_date]), [Recr1016] = ([tempdb].[dbo].[#tm 889           0             8.89E-07      34          0.3112908        [Expr1022], [Recr1014], [Recr1015], [Recr1016], [Recr1017], [Recr1018]                                                                                                 NULL     PLAN_ROW                                                         0        1
0                    0                                     |--Compute Scalar(DEFINE:([Expr1019]=(0)))                                                                                                                                                                                                      1           5           4           Compute Scalar                 Compute Scalar                 DEFINE:([Expr1019]=(0))                                                                                  [Expr1019]=(0)                                                                                                                                                                                                                                                   1             0             8.89E-06      34          8.89E-06         [Expr1019], [tempdb].[dbo].[#tmp].[episode_key], [tempdb].[dbo].[#tmp].[effective_date], [tempdb].[dbo].[#tmp].[priority], [tempdb].[dbo].[#tmp].[rownum], [Expr1004]  NULL     PLAN_ROW                                                         0        890
0                    0                                     |    |--Compute Scalar(DEFINE:([Expr1004]=NULL))                                                                                                                                                                                                1           6           5           Compute Scalar                 Compute Scalar                 DEFINE:([Expr1004]=NULL)                                                                                 [Expr1004]=NULL                                                                                                                                                                                                                                                  888           0             8.88E-05      43          0.009395245      [tempdb].[dbo].[#tmp].[episode_key], [tempdb].[dbo].[#tmp].[effective_date], [tempdb].[dbo].[#tmp].[priority], [tempdb].[dbo].[#tmp].[rownum], [Expr1004]              NULL     PLAN_ROW                                                         0        1
888                  1                                     |         |--Table Scan(OBJECT:([tempdb].[dbo].[#tmp]), WHERE:([tempdb].[dbo].[#tmp].[rownum]=(1)))                                                                                                                                             1           7           6           Table Scan                     Table Scan                     OBJECT:([tempdb].[dbo].[#tmp]), WHERE:([tempdb].[dbo].[#tmp].[rownum]=(1))                               [tempdb].[dbo].[#tmp].[episode_key], [tempdb].[dbo].[#tmp].[effective_date], [tempdb].[dbo].[#tmp].[priority], [tempdb].[dbo].[#tmp].[rownum]                                                                                                                    888           0.007569444   0.001257      39          0.008826445      [tempdb].[dbo].[#tmp].[episode_key], [tempdb].[dbo].[#tmp].[effective_date], [tempdb].[dbo].[#tmp].[priority], [tempdb].[dbo].[#tmp].[rownum]                          NULL     PLAN_ROW                                                         0        1
112                  1                                     |--Nested Loops(Inner Join, OUTER REFERENCES:([Expr1021], [Recr1009], [Recr1010], [Recr1011], [Recr1012], [Recr1013]))                                                                                                                          1           14          4           Nested Loops                   Inner Join                     OUTER REFERENCES:([Expr1021], [Recr1009], [Recr1010], [Recr1011], [Recr1012], [Recr1013])                NULL                                                                                                                                                                                                                                                             1.001126      0             7.4676E-05    34          0.3018947        [Expr1021], [tempdb].[dbo].[#tmp].[episode_key], [tempdb].[dbo].[#tmp].[effective_date], [tempdb].[dbo].[#tmp].[priority], [tempdb].[dbo].[#tmp].[rownum], [Recr1011]  NULL     PLAN_ROW                                                         0        890
0                    0                                          |--Compute Scalar(DEFINE:([Expr1021]=[Expr1020]+(1)))                                                                                                                                                                                      1           15          14          Compute Scalar                 Compute Scalar                 DEFINE:([Expr1021]=[Expr1020]+(1))                                                                       [Expr1021]=[Expr1020]+(1)                                                                                                                                                                                                                                        1             0             8.89E-06      34          8.89E-06         [Expr1021], [Recr1009], [Recr1010], [Recr1011], [Recr1012], [Recr1013]                                                                                                 NULL     PLAN_ROW                                                         0        890
1000                 1                                          |    |--Table Spool(WITH STACK)                                                                                                                                                                                                            1           16          15          Table Spool                    Lazy Spool                     WITH STACK                                                                                               NULL                                                                                                                                                                                                                                                             1             0             8.89E-06      34          8.89E-06         [Expr1020], [Recr1009], [Recr1010], [Recr1011], [Recr1012], [Recr1013]                                                                                                 NULL     PLAN_ROW                                                         0        890
112                  1000                                       |--Index Spool(SEEK:([tempdb].[dbo].[#tmp].[episode_key]=[Recr1009] AND [tempdb].[dbo].[#tmp].[rownum]=[Recr1012]+(1)))                                                                                                                    1           20          14          Index Spool                    Eager Spool                    SEEK:([tempdb].[dbo].[#tmp].[episode_key]=[Recr1009] AND [tempdb].[dbo].[#tmp].[rownum]=[Recr1012]+(1))  NULL                                                                                                                                                                                                                                                             1             0.04690878    0.0012581     39          0.3018111        [tempdb].[dbo].[#tmp].[episode_key], [tempdb].[dbo].[#tmp].[effective_date], [tempdb].[dbo].[#tmp].[priority], [tempdb].[dbo].[#tmp].[rownum]                          NULL     PLAN_ROW                                                         0        889
1000                 1                                               |--Table Scan(OBJECT:([tempdb].[dbo].[#tmp]))                                                                                                                                                                                         1           21          20          Table Scan                     Table Scan                     OBJECT:([tempdb].[dbo].[#tmp])                                                                           [tempdb].[dbo].[#tmp].[episode_key], [tempdb].[dbo].[#tmp].[effective_date], [tempdb].[dbo].[#tmp].[priority], [tempdb].[dbo].[#tmp].[rownum]                                                                                                                    1000          0.007569444   0.001257      39          0.008826445      [tempdb].[dbo].[#tmp].[episode_key], [tempdb].[dbo].[#tmp].[effective_date], [tempdb].[dbo].[#tmp].[priority], [tempdb].[dbo].[#tmp].[rownum]                          NULL     PLAN_ROW                                                         0        1


SQL Server Execution Times:
   CPU time = 31 ms,  elapsed time = 179 ms.


Как сделать быстро без материализации ept в виде временной таблицы и вообще без создания левых объектов в базе - одним запросом?

Задача абсолютно стандартная и тривиальная - вычисления на основании предыдущей записи.
В ORACLE это делается на счет раз без всяких приседаний с временными таблицами.
24 июн 09, 03:19    [7335702]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит рекурсивный запрос с ROW_COUNT  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Вот у вас стоит top 1000...
Стесняюсь спросить, а по какому столбцу эти первые 1000?
24 июн 09, 06:29    [7335771]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит рекурсивный запрос с ROW_COUNT  [new]
Ionah
Member

Откуда: Новосибирск
Сообщений: 290
tpg
Вот у вас стоит top 1000...
Стесняюсь спросить, а по какому столбцу эти первые 1000?


Почему первые N строк должны быть обязательно по какому-то столбцу?
Можно ведь просто ограничить выборку первыми N записями?
Ваш вопрос как-то относится к причинам медленной выборки?

Как вы сами считаете - в чем причина того что оптимизатор перемножает исходную таблицу с самой собой? Знаете как оптимизировать?
24 июн 09, 07:16    [7335786]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит рекурсивный запрос с ROW_COUNT  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Ionah
Можно ведь просто ограничить выборку первыми N записями?
Говорить о первых/последних можно только в контексте каких-то конкретных столбцов: идентификатор, дата создания и т.п.

Сообщение было отредактировано: 24 июн 09, 07:27
24 июн 09, 07:26    [7335792]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит рекурсивный запрос с ROW_COUNT  [new]
Glamorama
Member

Откуда:
Сообщений: 152
а можно дурацкий вопрос - в чем вообще задача состоит?? может тут в оригинале и рекурсия никакая не нужна
24 июн 09, 08:27    [7335825]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит рекурсивный запрос с ROW_COUNT  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Ionah
ORACLE могет.
А что это Вы всё время какой-то Oracle вспоминаете?
Это что, поможет решить проблему?
Ionah
Почему первые N строк должны быть обязательно по какому-то столбцу?
Можно ведь просто ограничить выборку первыми N записями?
SQL не предполагает хранение строк в каком-то определённом порядке.
Поэтому понятие "первые N записей" не определено.
24 июн 09, 08:45    [7335840]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит рекурсивный запрос с ROW_COUNT  [new]
Ionah
Member

Откуда: Новосибирск
Сообщений: 290
iap
Ionah
Почему первые N строк должны быть обязательно по какому-то столбцу?
Можно ведь просто ограничить выборку первыми N записями?
SQL не предполагает хранение строк в каком-то определённом порядке. Поэтому понятие "первые N записей" не определено.


Как Ваше утверждение "Поэтому понятие "первые N записей" не определено." связано с темой?
Я и не говорил что мне нужны строго определенная последовательность для того чтобы показать проблему.
24 июн 09, 10:15    [7336050]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит рекурсивный запрос с ROW_COUNT  [new]
Ionah
Member

Откуда: Новосибирск
Сообщений: 290
Убрал top 1000

Разница в сотню раз : 2058 ms vs 22 ms

Это всего-лишь 1000 записей. Интересно что будет если задействовать все 100000.

Есть идеи как разрулить?

Планы, статистика:

Table 'Worktable'. Scan count 2, logical reads 4305, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'wl_episode_priority'. Scan count 1001, logical reads 9009, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Rows                 Executes             StmtText                                                                                                                                                                                                                                                         StmtId      NodeId      Parent      PhysicalOp                     LogicalOp                      Argument                                                                                                                         DefinedValues                                                                                                                                                                                                                                                    EstimateRows  EstimateIO    EstimateCPU   AvgRowSize  TotalSubtreeCost OutputList                                                                                                                                                                                                                                 Warnings Type                                                             Parallel EstimateExecutions
-------------------- -------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------- ----------- ----------- ------------------------------ ------------------------------ -------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------- ------------- ------------- ----------- ---------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ -------- ---------------------------------------------------------------- -------- ------------------
48                   1                    with ept as(
  select
    episode_key,
	  effective_date,
	  cast(priority as int) as priority,
    row_number() over(partition by episode_key order by transaction_sequence_no) as rownum
  from wl_episode_priority
),

ep as (
  select ept.*, cast 1           1           0           NULL                           NULL                           NULL                                                                                                                             NULL                                                                                                                                                                                                                                                             53.64838      NULL          NULL          NULL        5.311042         NULL                                                                                                                                                                                                                                       NULL     SELECT                                                           0        NULL
48                   1                      |--Filter(WHERE:([Recr1018]>[Recr1020]))                                                                                                                                                                                                                       1           2           1           Filter                         Filter                         WHERE:([Recr1018]>[Recr1020])                                                                                                    NULL                                                                                                                                                                                                                                                             53.64838      0             8.583741E-05  26          5.311042         [Recr1016], [Recr1017]                                                                                                                                                                                                                     NULL     PLAN_ROW                                                         0        1
1000                 1                           |--Index Spool(WITH STACK)                                                                                                                                                                                                                                1           3           2           Index Spool                    Lazy Spool                     WITH STACK                                                                                                                       NULL                                                                                                                                                                                                                                                             178.8279      0             8.941397E-07  34          5.310956         [Expr1028], [Recr1016], [Recr1017], [Recr1018], [Recr1019], [Recr1020]                                                                                                                                                                     NULL     PLAN_ROW                                                         0        1
1000                 1                                |--Concatenation                                                                                                                                                                                                                                     1           4           3           Concatenation                  Concatenation                  NULL                                                                                                                             [Expr1028] = ([Expr1025], [Expr1027]), [Recr1016] = ([apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[episode_key]), [Recr1017] = ([apr].[dbo].[wl_episode_priority].[effective_date], [apr].[dbo].[wl_episode_priority].[eff 178.8279      0             1.788279E-07  34          5.281668         [Expr1028], [Recr1016], [Recr1017], [Recr1018], [Recr1019], [Recr1020]                                                                                                                                                                     NULL     PLAN_ROW                                                         0        1
0                    0                                     |--Compute Scalar(DEFINE:([Expr1025]=(0)))                                                                                                                                                                                                      1           5           4           Compute Scalar                 Compute Scalar                 DEFINE:([Expr1025]=(0))                                                                                                          [Expr1025]=(0)                                                                                                                                                                                                                                                   1             0             1.788279E-06  34          1.788279E-06     [Expr1025], [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[effective_date], [Expr1004], [Expr1003], [Expr1005]                                                                                        NULL     PLAN_ROW                                                         0        179.8279
0                    0                                     |    |--Compute Scalar(DEFINE:([Expr1005]=NULL))                                                                                                                                                                                                1           6           5           Compute Scalar                 Compute Scalar                 DEFINE:([Expr1005]=NULL)                                                                                                         [Expr1005]=NULL                                                                                                                                                                                                                                                  177.8279      0             1.778279E-05  43          0.03643215       [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[effective_date], [Expr1003], [Expr1004], [Expr1005]                                                                                                    NULL     PLAN_ROW                                                         0        1
888                  1                                     |         |--Filter(WHERE:([Expr1003]=(1)))                                                                                                                                                                                                     1           7           6           Filter                         Filter                         WHERE:([Expr1003]=(1))                                                                                                           NULL                                                                                                                                                                                                                                                             177.8279      0             0.00048       39          0.03641437       [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[effective_date], [Expr1003], [Expr1004]                                                                                                                NULL     PLAN_ROW                                                         0        1
0                    0                                     |              |--Compute Scalar(DEFINE:([Expr1004]=CONVERT(int,[apr].[dbo].[wl_episode_priority].[priority],0)))                                                                                                                               1           8           7           Compute Scalar                 Compute Scalar                 DEFINE:([Expr1004]=CONVERT(int,[apr].[dbo].[wl_episode_priority].[priority],0))                                                  [Expr1004]=CONVERT(int,[apr].[dbo].[wl_episode_priority].[priority],0)                                                                                                                                                                                           1000          0             0.0001        39          0.03593437       [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[effective_date], [Expr1003], [Expr1004]                                                                                                                NULL     PLAN_ROW                                                         0        1
1000                 1                                     |                   |--Sequence Project(DEFINE:([Expr1003]=row_number))                                                                                                                                                                         1           9           8           Sequence Project               Compute Scalar                 DEFINE:([Expr1003]=row_number)                                                                                                   [Expr1003]=row_number                                                                                                                                                                                                                                            1000          0             0.0001        44          0.03583437       [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[effective_date], [apr].[dbo].[wl_episode_priority].[priority], [Expr1003]                                                                              NULL     PLAN_ROW                                                         0        1
0                    0                                     |                        |--Compute Scalar(DEFINE:([Expr1022]=(1)))                                                                                                                                                                             1           10          9           Compute Scalar                 Compute Scalar                 DEFINE:([Expr1022]=(1))                                                                                                          [Expr1022]=(1)                                                                                                                                                                                                                                                   1000          0             2E-05         44          0.03585437       [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[transaction_sequence_no], [apr].[dbo].[wl_episode_priority].[effective_date], [apr].[dbo].[wl_episode_priority].[priority], [Segment1021], [Expr1022]  NULL     PLAN_ROW                                                         0        1
1000                 1                                     |                             |--Segment                                                                                                                                                                                                        1           11          10          Segment                        Segment                        [apr].[dbo].[wl_episode_priority].[episode_key]                                                                                  NULL                                                                                                                                                                                                                                                             1000          0             2E-05         44          0.03585437       [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[transaction_sequence_no], [apr].[dbo].[wl_episode_priority].[effective_date], [apr].[dbo].[wl_episode_priority].[priority], [Segment1021]              NULL     PLAN_ROW                                                         0        1
1000                 1                                     |                                  |--Sort(ORDER BY:([apr].[dbo].[wl_episode_priority].[episode_key] ASC, [apr].[dbo].[wl_episode_priority].[transaction_sequence_no] ASC))                                                                     1           12          11          Sort                           Sort                           ORDER BY:([apr].[dbo].[wl_episode_priority].[episode_key] ASC, [apr].[dbo].[wl_episode_priority].[transaction_sequence_no] ASC)  NULL                                                                                                                                                                                                                                                             1000          0.01126126    0.01564666    41          0.03573437       [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[transaction_sequence_no], [apr].[dbo].[wl_episode_priority].[effective_date], [apr].[dbo].[wl_episode_priority].[priority]                             NULL     PLAN_ROW                                                         0        1
1000                 1                                     |                                       |--Clustered Index Scan(OBJECT:([apr].[dbo].[wl_episode_priority].[ix_wl_episode_priority]))                                                                                                            1           13          12          Clustered Index Scan           Clustered Index Scan           OBJECT:([apr].[dbo].[wl_episode_priority].[ix_wl_episode_priority])                                                              [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[transaction_sequence_no], [apr].[dbo].[wl_episode_priority].[effective_date], [apr].[dbo].[wl_episode_priority].[priority]                                                   1000          0.007569444   0.001257      41          0.008826445      [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[transaction_sequence_no], [apr].[dbo].[wl_episode_priority].[effective_date], [apr].[dbo].[wl_episode_priority].[priority]                             NULL     PLAN_ROW                                                         0        1
112                  1                                     |--Nested Loops(Inner Join, OUTER REFERENCES:([Expr1027], [Recr1011], [Recr1012], [Recr1013], [Recr1014], [Recr1015]))                                                                                                                          1           30          4           Nested Loops                   Inner Join                     OUTER REFERENCES:([Expr1027], [Recr1011], [Recr1012], [Recr1013], [Recr1014], [Recr1015])                                        NULL                                                                                                                                                                                                                                                             1.005623      0             1.502155E-05  34          5.245235         [Expr1027], [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[effective_date], [Expr1010], [Expr1009], [Recr1013]                                                                                        NULL     PLAN_ROW                                                         0        179.8279
0                    0                                          |--Compute Scalar(DEFINE:([Expr1027]=[Expr1026]+(1)))                                                                                                                                                                                      1           31          30          Compute Scalar                 Compute Scalar                 DEFINE:([Expr1027]=[Expr1026]+(1))                                                                                               [Expr1027]=[Expr1026]+(1)                                                                                                                                                                                                                                        1             0             1.788279E-06  34          1.788279E-06     [Expr1027], [Recr1011], [Recr1012], [Recr1013], [Recr1014], [Recr1015]                                                                                                                                                                     NULL     PLAN_ROW                                                         0        179.8279
1000                 1                                          |    |--Table Spool(WITH STACK)                                                                                                                                                                                                            1           32          31          Table Spool                    Lazy Spool                     WITH STACK                                                                                                                       NULL                                                                                                                                                                                                                                                             1             0             1.788279E-06  34          1.788279E-06     [Expr1026], [Recr1011], [Recr1012], [Recr1013], [Recr1014], [Recr1015]                                                                                                                                                                     NULL     PLAN_ROW                                                         0        179.8279
112                  1000                                       |--Filter(WHERE:([apr].[dbo].[wl_episode_priority].[episode_key]=[Recr1011] AND [Expr1009]=([Recr1014]+(1))))                                                                                                                              1           36          30          Filter                         Filter                         WHERE:([apr].[dbo].[wl_episode_priority].[episode_key]=[Recr1011] AND [Expr1009]=([Recr1014]+(1)))                               NULL                                                                                                                                                                                                                                                             1             0             0.00108       39          5.245219         [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[effective_date], [Expr1009], [Expr1010]                                                                                                                NULL     PLAN_ROW                                                         0        178.8279
0                    0                                               |--Compute Scalar(DEFINE:([Expr1010]=CONVERT(int,[apr].[dbo].[wl_episode_priority].[priority],0)))                                                                                                                                    1           37          36          Compute Scalar                 Compute Scalar                 DEFINE:([Expr1010]=CONVERT(int,[apr].[dbo].[wl_episode_priority].[priority],0))                                                  [Expr1010]=CONVERT(int,[apr].[dbo].[wl_episode_priority].[priority],0)                                                                                                                                                                                           1000          0             0.0001        39          5.052084         [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[effective_date], [Expr1009], [Expr1010]                                                                                                                NULL     PLAN_ROW                                                         0        178.8279
1000000              1000                                                 |--Sequence Project(DEFINE:([Expr1009]=row_number))                                                                                                                                                                              1           38          37          Sequence Project               Compute Scalar                 DEFINE:([Expr1009]=row_number)                                                                                                   [Expr1009]=row_number                                                                                                                                                                                                                                            1000          0             0.0001        44          5.034202         [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[effective_date], [apr].[dbo].[wl_episode_priority].[priority], [Expr1009]                                                                              NULL     PLAN_ROW                                                         0        178.8279
0                    0                                                         |--Compute Scalar(DEFINE:([Expr1024]=(1)))                                                                                                                                                                                  1           39          38          Compute Scalar                 Compute Scalar                 DEFINE:([Expr1024]=(1))                                                                                                          [Expr1024]=(1)                                                                                                                                                                                                                                                   1000          0             2E-05         44          5.034222         [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[transaction_sequence_no], [apr].[dbo].[wl_episode_priority].[effective_date], [apr].[dbo].[wl_episode_priority].[priority], [Segment1023], [Expr1024]  NULL     PLAN_ROW                                                         0        178.8279
1000000              1000                                                           |--Segment                                                                                                                                                                                                             1           40          39          Segment                        Segment                        [apr].[dbo].[wl_episode_priority].[episode_key]                                                                                  NULL                                                                                                                                                                                                                                                             1000          0             2E-05         44          5.034222         [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[transaction_sequence_no], [apr].[dbo].[wl_episode_priority].[effective_date], [apr].[dbo].[wl_episode_priority].[priority], [Segment1023]              NULL     PLAN_ROW                                                         0        178.8279
1000000              1000                                                                |--Sort(ORDER BY:([apr].[dbo].[wl_episode_priority].[episode_key] ASC, [apr].[dbo].[wl_episode_priority].[transaction_sequence_no] ASC))                                                                          1           41          40          Sort                           Sort                           ORDER BY:([apr].[dbo].[wl_episode_priority].[episode_key] ASC, [apr].[dbo].[wl_episode_priority].[transaction_sequence_no] ASC)  NULL                                                                                                                                                                                                                                                             1000          0.01126126    0.01564666    41          5.016319         [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[transaction_sequence_no], [apr].[dbo].[wl_episode_priority].[effective_date], [apr].[dbo].[wl_episode_priority].[priority]                             NULL     PLAN_ROW                                                         0        178.8279
1000000              1000                                                                     |--Clustered Index Scan(OBJECT:([apr].[dbo].[wl_episode_priority].[ix_wl_episode_priority]))                                                                                                                 1           42          41          Clustered Index Scan           Clustered Index Scan           OBJECT:([apr].[dbo].[wl_episode_priority].[ix_wl_episode_priority])                                                              [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[transaction_sequence_no], [apr].[dbo].[wl_episode_priority].[effective_date], [apr].[dbo].[wl_episode_priority].[priority]                                                   1000          0.007647945   0.0011785     41          0.2044372        [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[transaction_sequence_no], [apr].[dbo].[wl_episode_priority].[effective_date], [apr].[dbo].[wl_episode_priority].[priority]                             NULL     PLAN_ROW                                                         0        178.8279

(23 row(s) affected)


SQL Server Execution Times:
   CPU time = 2047 ms,  elapsed time = 2058 ms.
SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 1 ms.
Table 'wl_episode_priority'. Scan count 1, logical reads 9, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(1000 row(s) affected)
Rows                 Executes             StmtText                                                                                                                                                                                                                                                   StmtId      NodeId      Parent      PhysicalOp                     LogicalOp                      Argument                                                                                                                                                                                                                                DefinedValues                                                                                                                                                                                                   EstimateRows  EstimateIO    EstimateCPU   AvgRowSize  TotalSubtreeCost OutputList                                                                                                                                                                                                                                 Warnings Type                                                             Parallel EstimateExecutions
-------------------- -------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------- ----------- ----------- ------------------------------ ------------------------------ --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------- ------------- ------------- ----------- ---------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ -------- ---------------------------------------------------------------- -------- ------------------
1000                 1                    select
    episode_key,
	  effective_date,
	  cast(priority as int) as priority,
    row_number() over(partition by episode_key order by transaction_sequence_no) as rownum
into #tmp
  from wl_episode_priority                                     1           1           0           NULL                           NULL                           NULL                                                                                                                                                                                                                                    NULL                                                                                                                                                                                                            1000          NULL          NULL          NULL        0.04770081       NULL                                                                                                                                                                                                                                       NULL     SELECT INTO                                                      0        NULL
1000                 1                      |--Table Insert(OBJECT:([#tmp]), SET:([#tmp].[episode_key] = [apr].[dbo].[wl_episode_priority].[episode_key],[#tmp].[effective_date] = [apr].[dbo].[wl_episode_priority].[effective_date],[#tmp].[priority] = [Expr1007],[#tmp].[rownum] = [Expr1006]))  1           2           1           Table Insert                   Insert                         OBJECT:([#tmp]), SET:([#tmp].[episode_key] = [apr].[dbo].[wl_episode_priority].[episode_key],[#tmp].[effective_date] = [apr].[dbo].[wl_episode_priority].[effective_date],[#tmp].[priority] = [Expr1007],[#tmp].[rownum] = [Expr1006])  NULL                                                                                                                                                                                                            1000          0.01066644    0.001         9           0.04770081       NULL                                                                                                                                                                                                                                       NULL     PLAN_ROW                                                         0        1
0                    0                           |--Compute Scalar(DEFINE:([Expr1007]=CONVERT(int,[apr].[dbo].[wl_episode_priority].[priority],0)))                                                                                                                                                  1           3           2           Compute Scalar                 Compute Scalar                 DEFINE:([Expr1007]=CONVERT(int,[apr].[dbo].[wl_episode_priority].[priority],0))                                                                                                                                                         [Expr1007]=CONVERT(int,[apr].[dbo].[wl_episode_priority].[priority],0)                                                                                                                                          1000          0             0.0001        38          0.03603437       [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[effective_date], [Expr1006], [Expr1007]                                                                                                                NULL     PLAN_ROW                                                         0        1
1000                 1                                |--Top(ROWCOUNT est 0)                                                                                                                                                                                                                         1           4           3           Top                            Top                            TOP EXPRESSION:((0))                                                                                                                                                                                                                    NULL                                                                                                                                                                                                            1000          0             0.0001        43          0.03593437       [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[effective_date], [apr].[dbo].[wl_episode_priority].[priority], [Expr1006]                                                                              NULL     PLAN_ROW                                                         0        1
1000                 1                                     |--Sequence Project(DEFINE:([Expr1006]=row_number))                                                                                                                                                                                       1           5           4           Sequence Project               Compute Scalar                 DEFINE:([Expr1006]=row_number)                                                                                                                                                                                                          [Expr1006]=row_number                                                                                                                                                                                           1000          0             0.0001        43          0.03583437       [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[effective_date], [apr].[dbo].[wl_episode_priority].[priority], [Expr1006]                                                                              NULL     PLAN_ROW                                                         0        1
0                    0                                          |--Compute Scalar(DEFINE:([Expr1009]=(1)))                                                                                                                                                                                           1           6           5           Compute Scalar                 Compute Scalar                 DEFINE:([Expr1009]=(1))                                                                                                                                                                                                                 [Expr1009]=(1)                                                                                                                                                                                                  1000          0             2E-05         43          0.03585437       [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[transaction_sequence_no], [apr].[dbo].[wl_episode_priority].[effective_date], [apr].[dbo].[wl_episode_priority].[priority], [Segment1008], [Expr1009]  NULL     PLAN_ROW                                                         0        1
1000                 1                                               |--Segment                                                                                                                                                                                                                      1           7           6           Segment                        Segment                        [apr].[dbo].[wl_episode_priority].[episode_key]                                                                                                                                                                                         NULL                                                                                                                                                                                                            1000          0             2E-05         43          0.03585437       [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[transaction_sequence_no], [apr].[dbo].[wl_episode_priority].[effective_date], [apr].[dbo].[wl_episode_priority].[priority], [Segment1008]              NULL     PLAN_ROW                                                         0        1
1000                 1                                                    |--Sort(ORDER BY:([apr].[dbo].[wl_episode_priority].[episode_key] ASC, [apr].[dbo].[wl_episode_priority].[transaction_sequence_no] ASC))                                                                                   1           8           7           Sort                           Sort                           ORDER BY:([apr].[dbo].[wl_episode_priority].[episode_key] ASC, [apr].[dbo].[wl_episode_priority].[transaction_sequence_no] ASC)                                                                                                         NULL                                                                                                                                                                                                            1000          0.01126126    0.01564666    40          0.03573437       [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[transaction_sequence_no], [apr].[dbo].[wl_episode_priority].[effective_date], [apr].[dbo].[wl_episode_priority].[priority]                             NULL     PLAN_ROW                                                         0        1
1000                 1                                                         |--Clustered Index Scan(OBJECT:([apr].[dbo].[wl_episode_priority].[ix_wl_episode_priority]))                                                                                                                          1           9           8           Clustered Index Scan           Clustered Index Scan           OBJECT:([apr].[dbo].[wl_episode_priority].[ix_wl_episode_priority])                                                                                                                                                                     [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[transaction_sequence_no], [apr].[dbo].[wl_episode_priority].[effective_date], [apr].[dbo].[wl_episode_priority].[priority]  1000          0.007569444   0.001257      40          0.008826445      [apr].[dbo].[wl_episode_priority].[episode_key], [apr].[dbo].[wl_episode_priority].[transaction_sequence_no], [apr].[dbo].[wl_episode_priority].[effective_date], [apr].[dbo].[wl_episode_priority].[priority]                             NULL     PLAN_ROW                                                         0        1

(9 row(s) affected)


SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 6 ms.
SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 1 ms.


Table 'Worktable'. Scan count 1002, logical reads 8343, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table '#tmp________________________________________________________________________________________________________________000000000E1D'. Scan count 2, logical reads 14, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Rows                 Executes             StmtText                                                                                                                                                                                                                                                         StmtId      NodeId      Parent      PhysicalOp                     LogicalOp                      Argument                                                                                                 DefinedValues                                                                                                                                                                                                                                                    EstimateRows  EstimateIO    EstimateCPU   AvgRowSize  TotalSubtreeCost OutputList                                                                                                                                                             Warnings Type                                                             Parallel EstimateExecutions
-------------------- -------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------- ----------- ----------- ------------------------------ ------------------------------ -------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------- ------------- ------------- ----------- ---------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------- ---------------------------------------------------------------- -------- ------------------
48                   1                    with ept as(
  select * from #tmp
),

ep as (
  select ept.*, cast(null as int) as prev_priority from ept where rownum = 1
  union all
  select ept.*, ep.priority as prev_priority from ept
    inner join ep
      on ept.episode_key = ep.episode_ke 1           1           0           NULL                           NULL                           NULL                                                                                                     NULL                                                                                                                                                                                                                                                             266.7         NULL          NULL          NULL        0.3119977        NULL                                                                                                                                                                   NULL     SELECT                                                           0        NULL
48                   1                      |--Filter(WHERE:([Recr1016]>[Recr1018]))                                                                                                                                                                                                                       1           2           1           Filter                         Filter                         WHERE:([Recr1016]>[Recr1018])                                                                            NULL                                                                                                                                                                                                                                                             266.7         0             0.00042672    26          0.3119977        [Recr1014], [Recr1015]                                                                                                                                                 NULL     PLAN_ROW                                                         0        1
1000                 1                           |--Index Spool(WITH STACK)                                                                                                                                                                                                                                1           3           2           Index Spool                    Lazy Spool                     WITH STACK                                                                                               NULL                                                                                                                                                                                                                                                             889           0             4.445E-06     34          0.311571         [Expr1022], [Recr1014], [Recr1015], [Recr1016], [Recr1017], [Recr1018]                                                                                                 NULL     PLAN_ROW                                                         0        1
1000                 1                                |--Concatenation                                                                                                                                                                                                                                     1           4           3           Concatenation                  Concatenation                  NULL                                                                                                     [Expr1022] = ([Expr1019], [Expr1021]), [Recr1014] = ([tempdb].[dbo].[#tmp].[episode_key], [tempdb].[dbo].[#tmp].[episode_key]), [Recr1015] = ([tempdb].[dbo].[#tmp].[effective_date], [tempdb].[dbo].[#tmp].[effective_date]), [Recr1016] = ([tempdb].[dbo].[#tm 889           0             8.89E-07      34          0.3112908        [Expr1022], [Recr1014], [Recr1015], [Recr1016], [Recr1017], [Recr1018]                                                                                                 NULL     PLAN_ROW                                                         0        1
0                    0                                     |--Compute Scalar(DEFINE:([Expr1019]=(0)))                                                                                                                                                                                                      1           5           4           Compute Scalar                 Compute Scalar                 DEFINE:([Expr1019]=(0))                                                                                  [Expr1019]=(0)                                                                                                                                                                                                                                                   1             0             8.89E-06      34          8.89E-06         [Expr1019], [tempdb].[dbo].[#tmp].[episode_key], [tempdb].[dbo].[#tmp].[effective_date], [tempdb].[dbo].[#tmp].[priority], [tempdb].[dbo].[#tmp].[rownum], [Expr1004]  NULL     PLAN_ROW                                                         0        890
0                    0                                     |    |--Compute Scalar(DEFINE:([Expr1004]=NULL))                                                                                                                                                                                                1           6           5           Compute Scalar                 Compute Scalar                 DEFINE:([Expr1004]=NULL)                                                                                 [Expr1004]=NULL                                                                                                                                                                                                                                                  888           0             8.88E-05      43          0.009395245      [tempdb].[dbo].[#tmp].[episode_key], [tempdb].[dbo].[#tmp].[effective_date], [tempdb].[dbo].[#tmp].[priority], [tempdb].[dbo].[#tmp].[rownum], [Expr1004]              NULL     PLAN_ROW                                                         0        1
888                  1                                     |         |--Table Scan(OBJECT:([tempdb].[dbo].[#tmp]), WHERE:([tempdb].[dbo].[#tmp].[rownum]=(1)))                                                                                                                                             1           7           6           Table Scan                     Table Scan                     OBJECT:([tempdb].[dbo].[#tmp]), WHERE:([tempdb].[dbo].[#tmp].[rownum]=(1))                               [tempdb].[dbo].[#tmp].[episode_key], [tempdb].[dbo].[#tmp].[effective_date], [tempdb].[dbo].[#tmp].[priority], [tempdb].[dbo].[#tmp].[rownum]                                                                                                                    888           0.007569444   0.001257      39          0.008826445      [tempdb].[dbo].[#tmp].[episode_key], [tempdb].[dbo].[#tmp].[effective_date], [tempdb].[dbo].[#tmp].[priority], [tempdb].[dbo].[#tmp].[rownum]                          NULL     PLAN_ROW                                                         0        1
112                  1                                     |--Nested Loops(Inner Join, OUTER REFERENCES:([Expr1021], [Recr1009], [Recr1010], [Recr1011], [Recr1012], [Recr1013]))                                                                                                                          1           14          4           Nested Loops                   Inner Join                     OUTER REFERENCES:([Expr1021], [Recr1009], [Recr1010], [Recr1011], [Recr1012], [Recr1013])                NULL                                                                                                                                                                                                                                                             1.001126      0             7.4676E-05    34          0.3018947        [Expr1021], [tempdb].[dbo].[#tmp].[episode_key], [tempdb].[dbo].[#tmp].[effective_date], [tempdb].[dbo].[#tmp].[priority], [tempdb].[dbo].[#tmp].[rownum], [Recr1011]  NULL     PLAN_ROW                                                         0        890
0                    0                                          |--Compute Scalar(DEFINE:([Expr1021]=[Expr1020]+(1)))                                                                                                                                                                                      1           15          14          Compute Scalar                 Compute Scalar                 DEFINE:([Expr1021]=[Expr1020]+(1))                                                                       [Expr1021]=[Expr1020]+(1)                                                                                                                                                                                                                                        1             0             8.89E-06      34          8.89E-06         [Expr1021], [Recr1009], [Recr1010], [Recr1011], [Recr1012], [Recr1013]                                                                                                 NULL     PLAN_ROW                                                         0        890
1000                 1                                          |    |--Table Spool(WITH STACK)                                                                                                                                                                                                            1           16          15          Table Spool                    Lazy Spool                     WITH STACK                                                                                               NULL                                                                                                                                                                                                                                                             1             0             8.89E-06      34          8.89E-06         [Expr1020], [Recr1009], [Recr1010], [Recr1011], [Recr1012], [Recr1013]                                                                                                 NULL     PLAN_ROW                                                         0        890
112                  1000                                       |--Index Spool(SEEK:([tempdb].[dbo].[#tmp].[episode_key]=[Recr1009] AND [tempdb].[dbo].[#tmp].[rownum]=[Recr1012]+(1)))                                                                                                                    1           20          14          Index Spool                    Eager Spool                    SEEK:([tempdb].[dbo].[#tmp].[episode_key]=[Recr1009] AND [tempdb].[dbo].[#tmp].[rownum]=[Recr1012]+(1))  NULL                                                                                                                                                                                                                                                             1             0.04690878    0.0012581     39          0.3018111        [tempdb].[dbo].[#tmp].[episode_key], [tempdb].[dbo].[#tmp].[effective_date], [tempdb].[dbo].[#tmp].[priority], [tempdb].[dbo].[#tmp].[rownum]                          NULL     PLAN_ROW                                                         0        889
1000                 1                                               |--Table Scan(OBJECT:([tempdb].[dbo].[#tmp]))                                                                                                                                                                                         1           21          20          Table Scan                     Table Scan                     OBJECT:([tempdb].[dbo].[#tmp])                                                                           [tempdb].[dbo].[#tmp].[episode_key], [tempdb].[dbo].[#tmp].[effective_date], [tempdb].[dbo].[#tmp].[priority], [tempdb].[dbo].[#tmp].[rownum]                                                                                                                    1000          0.007569444   0.001257      39          0.008826445      [tempdb].[dbo].[#tmp].[episode_key], [tempdb].[dbo].[#tmp].[effective_date], [tempdb].[dbo].[#tmp].[priority], [tempdb].[dbo].[#tmp].[rownum]                          NULL     PLAN_ROW                                                         0        1

(12 row(s) affected)


SQL Server Execution Times:
   CPU time = 16 ms,  elapsed time = 22 ms.
24 июн 09, 10:20    [7336074]     Ответить | Цитировать Сообщить модератору
 Re: Тормозит рекурсивный запрос с ROW_COUNT  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3208
Ionah
ORACLE могет. Мне не надо пронумеровать 1000000 записей, всего лишь 1000, посмотрите внимательнее запрос.
Скажите, вам что-нибудь говорит словосочетание "декартово произведение" (оно же cartesian product)? Смотрите внимательно на план полного запроса, у вас миллион раз выполняется действие
|--RID Lookup(OBJECT:([apr].[dbo].[wl_episode_priority]), SEEK:([Bmk1007]=[Bmk1007]) LOOKUP ORDERED FORWARD)
Учитывая, что лукап сама по себе весьма затратная операция, возводить ее в квадрат, а потом ожидать какой-либо эффективности бессмысленно. Так что либо покрывающий индекс, либо кэширование. Кстати, вы еще не все выжали из временных таблиц, на них же можно индексы делать, в т.ч. первичные и альтернативные ключи.

Еще очень смущает то, что поле, по которому вы делаете своего полу-декарта, у вас другого типа:
cast(priority as int) as priority
Извините, вы действительно считаете, что сервер должен на лету индексы создавать / модифицировать? Ну так возвращайтесь обратно на оракл, какие проблемы - вам же никто не запрещает под него разрабатывать, насколько я понимаю. И кстати, в вашей временной таблице это поле уже оказывается нужного типа, это тоже может быть причиной ускорения запроса.

Да, материалайза в MSSQL нет - если к CTE делается 1000 обращений, то оно выполняется 1000 раз. Соответственно, в некоторых случаях решение "в один селект" оказывается не лучшим вариантом. Ваш случай как раз из таких.
24 июн 09, 10:48    [7336214]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить