powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Оптимизация вложенных запросов с GROUP BY
25 сообщений из 33, страница 1 из 2
Оптимизация вложенных запросов с GROUP BY
    #37349526
Bond_JamesBond
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Навеяло вот этой темой:

/topic/806691&pg=1

Суть в том что если в запросе с маленьким количеством ключей, используется внутренний запрос с Group By и большой статистикой ключей, то SQL сервера похоже не догадываются проталкивать "внешнее" условие внутрь. То есть если у меня есть временная таблица документов и мне нужно рассчитать скажем сумму по документу, то мне придется вручную проталкивать JOIN в подзапрос.

Так вот этот запрос будет очень медленно работать (высчитывая подзапрос по всей базе)
Код: plaintext
SELECT документ.дата, суммы.сумма \n    FROM нужные_документы \n    JOIN документы ON нужные_документы.ключ=документы.ключ \n    JOIN (SELECT документ, SUM(сумма) FROM позиции GROUP BY документ) суммы ON суммы.документ=нужные_документы.ключ

Если же внутри добавить JOIN нужные_документы.ключ=позиции.документ все будет очень быстро.

Мы сделали автоматическое проталкивание ключей внутрь, если они join\'ся с небольшими временными таблицами (как в примере).Но сейчас хотим обобщить и проталкивать внутрь условия, когда внешняя статистика значительно меньше внутренней. Но для этого надо рассчитывать эту статистику, что по сути эквивалентно задаче Join Ordering, то есть по сути надо дублировать этот механизм SQL сервера в нашем компиляторе запросов.

Соответственно вопрос почему этого не делают сами SQL сервера. Или может я просто чего-то не понимаю.

ЗЫ: Да я в курсе, что есть SubQuery Expressions, но они не помогают если подзапрос надо связывать по INNER, а не LEFT JOIN :(
...
Рейтинг: 0 / 0
Оптимизация вложенных запросов с GROUP BY
    #37349591
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bond_JamesBondСоответственно вопрос почему этого не делают сами SQL сервера.

Вот не нужно так громко говорить "SQL сервера" про один PG. Или марки всех испытанных
серверов - в студию!
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Оптимизация вложенных запросов с GROUP BY
    #37349635
Bond_JamesBond
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

В том же топике тестили Oracle. MS SQL никогда не отличался чем-то инновационным...

Но собственно вопрос поэтому в топике Сравнение СУБД, чтобы выяснить кто с такой проблемой сталкивался и как решал.
...
Рейтинг: 0 / 0
Оптимизация вложенных запросов с GROUP BY
    #37349738
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 13.07.2011 13:43, Bond_JamesBond wrote:

> Соответственно вопрос почему этого не делают сами SQL сервера. Или может я
> просто чего-то не понимаю.

Хочу напомнить, что SQL Server -- это продукт фирмы Microsoft.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Оптимизация вложенных запросов с GROUP BY
    #37349810
Фотография daw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я, может, не понял чего, но:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
create table t1 (id int primary key)
go
create table t2 (id int, ssum money)
go
create index idx_t2 on t2(id)
go
with cte as
(select  1  n
 union all
 select n +  1  from cte
 where n <  20 
)
insert into t1 select n from cte
option (maxrecursion  0 );

with cte as
(select  1  n
 union all
 select n +  1  from cte
 where n <  2000 
)
insert into t2 select n, n *  10  from cte cross join (select  1  c union all select  2 ) tt
option (maxrecursion  0 );
go
set statistics profile on
go
select * from t1 inner join (select id, sum(ssum) ssum from t2 group by id) t on t1.id = t.id
go
set statistics profile off
go
drop table t1
go
drop table t2
go
--select * from t1 inner join (select id, sum(ssum) ssum from t2 group by id) t on t1.id = t.id
--  |--Compute Scalar(DEFINE:([Expr1007]=CASE WHEN [Expr1013]=(0) THEN NULL ELSE [Expr1014] END))
--       |--Stream Aggregate(GROUP BY:([TESTDB].[dbo].[t1].[id]) DEFINE:([Expr1013]=COUNT_BIG([TESTDB].[dbo].[t2].[ssum]), [Expr1014]=SUM([TESTDB].[dbo].[t2].[ssum]), [TESTDB].[dbo].[t2].[id]=ANY([TESTDB].[dbo].[t2].[id])))
--            |--Nested Loops(Inner Join, OUTER REFERENCES:([Bmk1003]))
--                 |--Nested Loops(Inner Join, OUTER REFERENCES:([TESTDB].[dbo].[t1].[id]))
--                 |    |--Clustered Index Scan(OBJECT:([TESTDB].[dbo].[t1].[PK__t1__3213E83F3552E9B6]), ORDERED FORWARD)
--                 |    |--Index Seek(OBJECT:([TESTDB].[dbo].[t2].[idx_t2]), SEEK:([TESTDB].[dbo].[t2].[id]=[TESTDB].[dbo].[t1].[id]) ORDERED FORWARD)
--                 |--RID Lookup(OBJECT:([TESTDB].[dbo].[t2]), SEEK:([Bmk1003]=[Bmk1003]) LOOKUP ORDERED FORWARD)

Microsoft SQL Server 2008 (SP2) - 10.0.4000.0 (X64) Sep 16 2010 19:43:16 Copyright (c) 1988-2008 Microsoft Corporation Express Edition with Advanced Services (64-bit) on Windows NT 5.2 <X64> (Build 3790: Service Pack 2)

ну, конечно, на более сложных запросах может всякое быть. но, по крайней мере, вот в таком примитивном случае получаем, вроде бы то, что вы и хотите?
...
Рейтинг: 0 / 0
Оптимизация вложенных запросов с GROUP BY
    #37349848
Фотография daw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для запроса из темы, на которую вы ссылаетесь, имеем:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SELECT t0.key0 AS jkey0,t0.key1 AS jkey1  ,t1.e0 AS jprop0   FROM viewtable t0   left JOIN   (SELECT t0.key1 AS k0,t1.key0 AS k1    ,SUM(t0.balanceSklFreeQuantity) AS e0    FROM orders t1     JOIN base_3 t0 ON t0.key0=t1.outCStore    WHERE t0.balanceSklFreeQuantity IS NOT NULL    GROUP BY t0.key1,t1.key0) t1  ON t1.k0=t0.key0 AND t1.k1=t0.key1
  |--Nested Loops(Left Outer Join, OUTER REFERENCES:([t0].[key0], [t0].[key1]))
       |--Clustered Index Scan(OBJECT:([TESTDB].[dbo].[viewtable].[viewtable_45824011_pkey] AS [t0]))
       |--Compute Scalar(DEFINE:([Expr1009]=[Expr1006]))
            |--Stream Aggregate(DEFINE:([Expr1006]=SUM([TESTDB].[dbo].[base_3].[balancesklfreequantity] as [t0].[balancesklfreequantity])))
                 |--Nested Loops(Inner Join, OUTER REFERENCES:([t1].[outcstore]))
                      |--Clustered Index Seek(OBJECT:([TESTDB].[dbo].[orders].[pk_orders] AS [t1]), SEEK:([t1].[key0]=[TESTDB].[dbo].[viewtable].[key1] as [t0].[key1]) ORDERED FORWARD)
                      |--Clustered Index Seek(OBJECT:([TESTDB].[dbo].[base_3].[pk_base_3] AS [t0]), SEEK:([t0].[key0]=[TESTDB].[dbo].[orders].[outcstore] as [t1].[outcstore] AND [t0].[key1]=[TESTDB].[dbo].[viewtable].[key0] as [t0].[key0]),  WHERE:([TESTDB].[dbo].[base_3].[balancesklfreequantity] as [t0].[balancesklfreequantity] IS NOT NULL) ORDERED FORWARD)
на небольшом объеме, правда, проверял.
...
Рейтинг: 0 / 0
Оптимизация вложенных запросов с GROUP BY
    #37349866
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 13.07.2011 15:31, daw wrote:
> select *from t1inner join (select id,sum(ssum) ssumfrom t2group by id) ton t1.id = t.id
> go

В таком простейшем случае внешний запрос
вообще ничего не делает, его можно просто выкинуть, что СУБД и
делает, скорее всего.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Оптимизация вложенных запросов с GROUP BY
    #37349895
Bond_JamesBond
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

Нет, почему, он как раз все правильно делает в отличии от остальных...

Хм... Спасибо, посмотрю как MS SQL Server себя ведет в таких случаях... Правда за отсутствие в Window функциях нормальных Aggregate функций (хотя бы SUM) им нужно руки отрывать.
...
Рейтинг: 0 / 0
Оптимизация вложенных запросов с GROUP BY
    #37349908
Фотография daw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну, добавим еще и третью таблицу, чтоб уж совсем похоже на авторский запрос было:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
insert into t3 select n, replicate('a',  100 ) from cte tt
option (maxrecursion  0 );
go
set statistics profile on
go
select * 
from t1 
  inner join t3 on
    t1.id = t3.id
  inner join (select id, sum(ssum) ssum from t2 group by id) t on t1.id = t.id
все равно, получаем:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select *   from t1     inner join t3 on      t1.id = t3.id    inner join (select id, sum(ssum) ssum from t2 group by id) t on t1.id = t.id
  |--Nested Loops(Inner Join, OUTER REFERENCES:([TESTDB].[dbo].[t2].[id]))
       |--Compute Scalar(DEFINE:([Expr1010]=CASE WHEN [Expr1015]=(0) THEN NULL ELSE [Expr1016] END))
       |    |--Stream Aggregate(GROUP BY:([TESTDB].[dbo].[t1].[id]) DEFINE:([Expr1015]=COUNT_BIG([TESTDB].[dbo].[t2].[ssum]), [Expr1016]=SUM([TESTDB].[dbo].[t2].[ssum]), [TESTDB].[dbo].[t2].[id]=ANY([TESTDB].[dbo].[t2].[id])))
       |         |--Nested Loops(Inner Join, OUTER REFERENCES:([Bmk1006]))
       |              |--Nested Loops(Inner Join, OUTER REFERENCES:([TESTDB].[dbo].[t1].[id]))
       |              |    |--Clustered Index Scan(OBJECT:([TESTDB].[dbo].[t1].[PK__t1__3213E83F6D9742D9]), ORDERED FORWARD)
       |              |    |--Index Seek(OBJECT:([TESTDB].[dbo].[t2].[idx_t2]), SEEK:([TESTDB].[dbo].[t2].[id]=[TESTDB].[dbo].[t1].[id]) ORDERED FORWARD)
       |              |--RID Lookup(OBJECT:([TESTDB].[dbo].[t2]), SEEK:([Bmk1006]=[Bmk1006]) LOOKUP ORDERED FORWARD)
       |--Clustered Index Seek(OBJECT:([TESTDB].[dbo].[t3].[PK__t3__3213E83F725BF7F6]), SEEK:([TESTDB].[dbo].[t3].[id]=[TESTDB].[dbo].[t2].[id]) ORDERED FORWARD)
нет, оптимизатор не господь бог, конечно, прямых рук он не отменяет и помогать желательно всеми силами - с этим я ни разу спорить не собираюсь. но кой-чего даже и в ms sql может.
...
Рейтинг: 0 / 0
Оптимизация вложенных запросов с GROUP BY
    #37349926
Bond_JamesBond
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
daw,

А если внутрь запрос вставить join, то есть

Код: plaintext
1.
2.
3.
4.
select * 
from t1 
  inner join t3 on
    t1.id = t3.id
  inner join (select t4.group, sum(ssum) ssum from t2 JOIN t4 ON t2.id=t4.id group by t4.group) t on t1.id = t.id

?
...
Рейтинг: 0 / 0
Оптимизация вложенных запросов с GROUP BY
    #37349928
Bond_JamesBond
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bond_JamesBond,

Просто под рукой нет MS SQL, сейчас буду искать...
...
Рейтинг: 0 / 0
Оптимизация вложенных запросов с GROUP BY
    #37349979
Bond_JamesBond
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя конечно самый веселый случай такой :

Код: plaintext
1.
2.
3.
4.
5.
select * 
from t1 
  inner join t3 on
    t1.id = t3.id
  inner join (select id, sum(ssum) ssum from t2 group by id) t on t.id = t3.value

И evaluate:

Код: plaintext
1.
2.
3.
4.
5.
select * 
from t1 
  inner join t3 on
    t1.id = t3.id
  inner join (select t2.id, sum(ssum) ssum from t1 inner join t3 ON t1.id=t3.id inner join t2 ON t2.id=t3.value group by t2.id) t on t.id = t3.value
...
Рейтинг: 0 / 0
Оптимизация вложенных запросов с GROUP BY
    #37349991
Фотография daw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну, например, вот:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
create table t4 (id int primary key);
with cte as
(select  1  n
 union all
 select n +  1  from cte
 where n <  2000 
)
insert into t4 select n from cte tt
option (maxrecursion  0 );


select *   from t1     inner join t3 on      t1.id = t3.id    inner join (select t4.id, sum(ssum) ssum from t2 join t4 on t2.id = t4.id group by t4.id) t on t1.id = t.id
  |--Nested Loops(Inner Join, OUTER REFERENCES:([TESTDB].[dbo].[t4].[id]))
       |--Compute Scalar(DEFINE:([Expr1013]=CASE WHEN [Expr1014]=(0) THEN NULL ELSE [Expr1015] END))
       |    |--Stream Aggregate(GROUP BY:([TESTDB].[dbo].[t1].[id]) DEFINE:([Expr1014]=COUNT_BIG([TESTDB].[dbo].[t2].[ssum]), [Expr1015]=SUM([TESTDB].[dbo].[t2].[ssum]), [TESTDB].[dbo].[t4].[id]=ANY([TESTDB].[dbo].[t1].[id])))
       |         |--Sort(ORDER BY:([TESTDB].[dbo].[t1].[id] ASC))
       |              |--Hash Match(Inner Join, HASH:([TESTDB].[dbo].[t1].[id])=([TESTDB].[dbo].[t4].[id]))
       |                   |--Clustered Index Scan(OBJECT:([TESTDB].[dbo].[t1].[PK__t1__3213E83F53A266AC]))
       |                   |--Hash Match(Inner Join, HASH:([TESTDB].[dbo].[t4].[id])=([TESTDB].[dbo].[t2].[id]), RESIDUAL:([TESTDB].[dbo].[t4].[id]=[TESTDB].[dbo].[t2].[id]))
       |                        |--Clustered Index Scan(OBJECT:([TESTDB].[dbo].[t4].[PK__t4__3213E83F5C37ACAD]))
       |                        |--Table Scan(OBJECT:([TESTDB].[dbo].[t2]))
       |--Clustered Index Seek(OBJECT:([TESTDB].[dbo].[t3].[PK__t3__3213E83F58671BC9]), SEEK:([TESTDB].[dbo].[t3].[id]=[TESTDB].[dbo].[t4].[id]) ORDERED FORWARD)
...
Рейтинг: 0 / 0
Оптимизация вложенных запросов с GROUP BY
    #37349994
Bond_JamesBond
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя последнее бред написал имел ввиду вот что:

Код: plaintext
1.
2.
3.
4.
5.
select * 
from t1 
  inner join t3 on
    t1.id = t3.id
  inner join (select id, sum(ssum) ssum from t2 join (select t3.value from t1 inner join t3 ON t1.id=t3.id group by t3.value) it ON t2.id=it.value group by id) t on t.id = t3.value
...
Рейтинг: 0 / 0
Оптимизация вложенных запросов с GROUP BY
    #37350005
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bond_JamesBondПравда за отсутствие в Window функциях нормальных Aggregate функций (хотя бы SUM) им нужно руки отрывать.

Ждите SQL Server 2011. Ну, или CTP3 ставьте, который вчера вышел.
...
Рейтинг: 0 / 0
Оптимизация вложенных запросов с GROUP BY
    #37350017
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В догонку:

OVER Clause Support EnhancedThe OVER clause has been extended to support window functions. Window functions perform a calculation across a set of rows that are in some relationship to the current row. For example, you can use the ROWS or RANGE clause over a set of rows to calculate a moving average or cumulative total. For more information, see OVER Clause (Transact-SQL).

In addition, ordering rows within a partition is now supported in the aggregate functions that allow the OVER clause to be specified.

Analytic FunctionsThe following analytic functions have been added.

CUME_DIST (Transact-SQL)LAST_VALUE (Transact-SQL)PERCENTILE_DISC (Transact-SQL)FIRST_VALUE (Transact-SQL)LEAD (Transact-SQL)PERCENT_RANK (Transact-SQL)LAG (Transact-SQL)PERCENTILE_CONT (Transact-SQL)
...
Рейтинг: 0 / 0
Оптимизация вложенных запросов с GROUP BY
    #37350029
Bond_JamesBond
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
daw,

А насколько большие t2 и t4, а то может она cheat'ит и не включает внешнюю таблицу в Join Ordering. То есть если они большие то это будет достаточно медленный план.
...
Рейтинг: 0 / 0
Оптимизация вложенных запросов с GROUP BY
    #37350034
Bond_JamesBond
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pkarklin,

Это в 2011 будет?
...
Рейтинг: 0 / 0
Оптимизация вложенных запросов с GROUP BY
    #37350045
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bond_JamesBondЭто в 2011 будет?

Уже сейчас есть в SQL Server Code Name "Denali" CTP3. ;)
...
Рейтинг: 0 / 0
Оптимизация вложенных запросов с GROUP BY
    #37350124
Фотография daw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> А насколько большие t2 и t4

так, я же скрипты заполнения привел - по паре тысяч строк.
если по 20 000 запихать, план уже другой получается.
но это уже ни о чем разговор, по-моему - сферические таблицы и запрос в вакууме. :)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
select *   from t1     inner join t3 on      t1.id = t3.id    inner join (select t4.id, sum(ssum) ssum from t2 join t4 
on t2.id = t4.id group by t4.id) t on t1.id = t.id
   |--Compute Scalar(DEFINE:([Expr1013]=CASE WHEN [Expr1016]=(0) THEN NULL ELSE [Expr1017] END))
        |--Stream Aggregate(GROUP BY:([TESTDB].[dbo].[t1].[id]) 
DEFINE:([Expr1016]=COUNT_BIG([TESTDB].[dbo].[t2].[ssum]), [Expr1017]=SUM([TESTDB].[dbo].[t2].[ssum]), 
[TESTDB].[dbo].[t3].[id]=ANY([TESTDB].[dbo].[t3].[id]), [TESTDB].[dbo].[t3].[aaa]=ANY([TESTDB].[dbo].[t3].[aaa]), 
[TESTDB].[dbo].[t4].[id]=ANY([TESTDB].[dbo].[t4].[id])))
             |--Nested Loops(Inner Join, OUTER REFERENCES:([TESTDB].[dbo].[t2].[id], [Expr1015]) WITH ORDERED PREFETCH)
                  |--Nested Loops(Inner Join, OUTER REFERENCES:([Bmk1006], [Expr1014]) WITH ORDERED PREFETCH)
                  |    |--Nested Loops(Inner Join, OUTER REFERENCES:([TESTDB].[dbo].[t3].[id]))
                  |    |    |--Nested Loops(Inner Join, OUTER REFERENCES:([TESTDB].[dbo].[t1].[id]))
                  |    |    |    |--Clustered Index Scan(OBJECT:([TESTDB].[dbo].[t1].[PK__t1__3213E83F60083D91]), 
ORDERED FORWARD)
                  |    |    |    |--Clustered Index Seek(OBJECT:([TESTDB].[dbo].[t3].[PK__t3__3213E83F64CCF2AE]), 
SEEK:([TESTDB].[dbo].[t3].[id]=[TESTDB].[dbo].[t1].[id]) ORDERED FORWARD)
                  |    |    |--Index Seek(OBJECT:([TESTDB].[dbo].[t2].[idx_t2]), 
SEEK:([TESTDB].[dbo].[t2].[id]=[TESTDB].[dbo].[t3].[id]) ORDERED FORWARD)
                  |    |--RID Lookup(OBJECT:([TESTDB].[dbo].[t2]), SEEK:([Bmk1006]=[Bmk1006]) LOOKUP ORDERED FORWARD)
                  |--Clustered Index Seek(OBJECT:([TESTDB].[dbo].[t4].[PK__t4__3213E83F689D8392]), 
SEEK:([TESTDB].[dbo].[t4].[id]=[TESTDB].[dbo].[t2].[id]) ORDERED FORWARD)



Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Оптимизация вложенных запросов с GROUP BY
    #37350145
Yo.!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
11g XE на пустых таблицах выдает нормальный план
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
SQL> SELECT t0.key0 AS jkey0,
  2         t0.key1 AS jkey1,
  3         t1.e0 AS jprop0,
  4         t1.cnt
  5  FROM viewtable t0
  6       LEFT JOIN
  7       (
  8        SELECT t0.key1 AS k0,
  9               t1.key0 AS k1,
 10               SUM(t0.balanceSklFreeQuantity) AS e0, count(1) as cnt
 11        FROM orders t1
 12             JOIN base_3 t0 ON t0.key0 = t1.outCStore
 13        GROUP BY t0.key1,
 14                 t1.key0
 15       ) t1 ON t1.k0 = t0.key0 AND t1.k1 = t0.key1;

no rows selected


Execution Plan
----------------------------------------------------------
Plan hash value: 2279736500

---------------------------------------------------------------------------------------------
| Id  | Operation                       | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                |           |     1 |    56 |     5   (0)| 00:00:01 |
|   1 |  NESTED LOOPS OUTER             |           |     1 |    56 |     5   (0)| 00:00:01 |
|   2 |   TABLE ACCESS FULL             | VIEWTABLE |     1 |    26 |     2   (0)| 00:00:01 |
|   3 |   VIEW PUSHED PREDICATE         |           |     1 |    30 |     3   (0)| 00:00:01 |
|   4 |    SORT GROUP BY                |           |     1 |    65 |     3   (0)| 00:00:01 |
|   5 |     NESTED LOOPS                |           |     1 |    65 |     3   (0)| 00:00:01 |
|   6 |      TABLE ACCESS BY INDEX ROWID| ORDERS    |     1 |    26 |     1   (0)| 00:00:01 |
|*  7 |       INDEX UNIQUE SCAN         | PK_ORDERS |     1 |       |     1   (0)| 00:00:01 |
|*  8 |      TABLE ACCESS FULL          | BASE_3    |     1 |    39 |     2   (0)| 00:00:01 |
---------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   7 - access("T1"."KEY0"="T0"."KEY1")
   8 - filter("T0"."KEY1"="T0"."KEY0" AND "T0"."KEY0"="T1"."OUTCSTORE")

Note
-----
   - dynamic sampling used for this statement (level=2)


если дадут скрипты заполнения можно поглядеть и с данными, но врядли план измениться без причины
...
Рейтинг: 0 / 0
Оптимизация вложенных запросов с GROUP BY
    #37350206
Bond_JamesBond
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yo.!,

В той ветке вроде были
...
Рейтинг: 0 / 0
Оптимизация вложенных запросов с GROUP BY
    #37350244
Yo.!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bond_JamesBond,

ну а есть оракловые ?
...
Рейтинг: 0 / 0
Оптимизация вложенных запросов с GROUP BY
    #37350540
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор, сформируйте пожауйста csv-фалый с тестовыми данными, и приаттачьте его сюда. Так просто будет легче искать "истину" имея у всех одну и то-же модель. Так-же прицепом сразу скрипты создания таблиц, без лишних полей.

P.S. Навскидку, особо не вдаваясь в тонкости проблемы я бы таакой скрипт как у вас не писал. Я бы Join-ами формировал саму выборку, а группировка этой выборки должна быть в секции group by главного запроса. Оптимизатор такое все равно пправильно разберет.
т.е. что-то вроде:
Код: plaintext
1.
2.
3.
4.
5.
SELECT документы.дата, позиции.сумма 
    FROM документы 
           JOIN ON нужные_документы.ключ=документы.ключ 
           JOIN ON позиции ON позиции.документ=нужные_документы.ключ
   GROUP BY докумены.документ
...
Рейтинг: 0 / 0
Оптимизация вложенных запросов с GROUP BY
    #37350679
Bond_JamesBond
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ggg_old,

А вы уверены что она не ругнется, что документы.дата не в GROUP BY?

Честно говоря не совсем понимаю как сделать файл, который можно приаттачить ко всем СУБД.

ЗЫ: кстати, а никто не кинет ссылку где хотя бы контурно описывается как и когда MS SQL так проталкивает внешний контекст. Что-то не удалось установить себе 2008 сервер :( Так бы попроверял гипотезы...
...
Рейтинг: 0 / 0
25 сообщений из 33, страница 1 из 2
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Оптимизация вложенных запросов с GROUP BY
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]