Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Сравнение СУБД Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Оптимизация вложенных запросов с GROUP BY  [new]
Bond_JamesBond
Guest
Навеяло вот этой темой:

https://www.sql.ru/forum/actualthread.aspx?bid=7&tid=806691&pg=1

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

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

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

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

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

ЗЫ: Да я в курсе, что есть SubQuery Expressions, но они не помогают если подзапрос надо связывать по INNER, а не LEFT JOIN :(

Сообщение было отредактировано: 13 июл 11, 14:32
13 июл 11, 12:43    [10966721]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация вложенных запросов с GROUP BY  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54789

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

Вот не нужно так громко говорить "SQL сервера" про один PG. Или марки всех испытанных
серверов - в студию!

Posted via ActualForum NNTP Server 1.4

13 июл 11, 13:06    [10966929]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация вложенных запросов с GROUP BY  [new]
Bond_JamesBond
Guest
Dimitry Sibiryakov,

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

Но собственно вопрос поэтому в топике Сравнение СУБД, чтобы выяснить кто с такой проблемой сталкивался и как решал.
13 июл 11, 13:20    [10967058]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация вложенных запросов с GROUP BY  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34709

On 13.07.2011 13:43, Bond_JamesBond wrote:

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

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

Posted via ActualForum NNTP Server 1.4

13 июл 11, 13:55    [10967392]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация вложенных запросов с GROUP BY  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
я, может, не понял чего, но:
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)

ну, конечно, на более сложных запросах может всякое быть. но, по крайней мере, вот в таком примитивном случае получаем, вроде бы то, что вы и хотите?
13 июл 11, 14:31    [10967633]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация вложенных запросов с GROUP BY  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
для запроса из темы, на которую вы ссылаетесь, имеем:
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)
на небольшом объеме, правда, проверял.
13 июл 11, 14:42    [10967702]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация вложенных запросов с GROUP BY  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34709

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

13 июл 11, 14:46    [10967737]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация вложенных запросов с GROUP BY  [new]
Bond_JamesBond
Guest
MasterZiv,

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

Хм... Спасибо, посмотрю как MS SQL Server себя ведет в таких случаях... Правда за отсутствие в Window функциях нормальных Aggregate функций (хотя бы SUM) им нужно руки отрывать.
13 июл 11, 14:56    [10967819]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация вложенных запросов с GROUP BY  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
ну, добавим еще и третью таблицу, чтоб уж совсем похоже на авторский запрос было:

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
все равно, получаем:
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 может.
13 июл 11, 15:03    [10967861]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация вложенных запросов с GROUP BY  [new]
Bond_JamesBond
Guest
daw,

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

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

?
13 июл 11, 15:08    [10967915]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация вложенных запросов с GROUP BY  [new]
Bond_JamesBond
Guest
Bond_JamesBond,

Просто под рукой нет MS SQL, сейчас буду искать...
13 июл 11, 15:09    [10967923]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация вложенных запросов с GROUP BY  [new]
Bond_JamesBond
Guest
Хотя конечно самый веселый случай такой :

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:

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
13 июл 11, 15:23    [10968059]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация вложенных запросов с GROUP BY  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
ну, например, вот:
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)
13 июл 11, 15:27    [10968092]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация вложенных запросов с GROUP BY  [new]
Bond_JamesBond
Guest
Хотя последнее бред написал имел ввиду вот что:

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
13 июл 11, 15:28    [10968100]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация вложенных запросов с GROUP BY  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Bond_JamesBond
Правда за отсутствие в Window функциях нормальных Aggregate функций (хотя бы SUM) им нужно руки отрывать.


Ждите SQL Server 2011. Ну, или CTP3 ставьте, который вчера вышел.
13 июл 11, 15:31    [10968136]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация вложенных запросов с GROUP BY  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
В догонку:

OVER Clause Support Enhanced
The 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 Functions
The 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)
13 июл 11, 15:35    [10968175]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация вложенных запросов с GROUP BY  [new]
Bond_JamesBond
Guest
daw,

А насколько большие t2 и t4, а то может она cheat'ит и не включает внешнюю таблицу в Join Ordering. То есть если они большие то это будет достаточно медленный план.
13 июл 11, 15:38    [10968208]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация вложенных запросов с GROUP BY  [new]
Bond_JamesBond
Guest
pkarklin,

Это в 2011 будет?
13 июл 11, 15:39    [10968226]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация вложенных запросов с GROUP BY  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Bond_JamesBond
Это в 2011 будет?


Уже сейчас есть в SQL Server Code Name "Denali" CTP3. ;)
13 июл 11, 15:44    [10968256]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация вложенных запросов с GROUP BY  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> А насколько большие t2 и t4

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

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

13 июл 11, 16:05    [10968449]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация вложенных запросов с GROUP BY  [new]
Yo.!
Guest
11g XE на пустых таблицах выдает нормальный план

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)


если дадут скрипты заполнения можно поглядеть и с данными, но врядли план измениться без причины
13 июл 11, 16:13    [10968514]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация вложенных запросов с GROUP BY  [new]
Bond_JamesBond
Guest
Yo.!,

В той ветке вроде были
13 июл 11, 16:38    [10968741]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация вложенных запросов с GROUP BY  [new]
Yo.!
Guest
Bond_JamesBond,

ну а есть оракловые ?
13 июл 11, 16:49    [10968863]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация вложенных запросов с GROUP BY  [new]
Ggg_old
Member

Откуда: Одесса
Сообщений: 1342
автор, сформируйте пожауйста csv-фалый с тестовыми данными, и приаттачьте его сюда. Так просто будет легче искать "истину" имея у всех одну и то-же модель. Так-же прицепом сразу скрипты создания таблиц, без лишних полей.

P.S. Навскидку, особо не вдаваясь в тонкости проблемы я бы таакой скрипт как у вас не писал. Я бы Join-ами формировал саму выборку, а группировка этой выборки должна быть в секции group by главного запроса. Оптимизатор такое все равно пправильно разберет.
т.е. что-то вроде:
SELECT документы.дата, позиции.сумма 
    FROM документы 
           JOIN ON нужные_документы.ключ=документы.ключ 
           JOIN ON позиции ON позиции.документ=нужные_документы.ключ
   GROUP BY докумены.документ
13 июл 11, 19:30    [10969903]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация вложенных запросов с GROUP BY  [new]
Bond_JamesBond
Guest
Ggg_old,

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

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

ЗЫ: кстати, а никто не кинет ссылку где хотя бы контурно описывается как и когда MS SQL так проталкивает внешний контекст. Что-то не удалось установить себе 2008 сервер :( Так бы попроверял гипотезы...
13 июл 11, 23:18    [10970538]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Сравнение СУБД Ответить