Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 выбрать клиентов определенного типа  [new]
нуб987
Guest
что-то потерялся на простом запросе
суть примерно такая: есть около 20-ти таблиц фактов (разделенных в основном по годам и еще некоторым критериям) вида
DateTran, ClientId, ProdId, Amount
объединенных в одной вьюхе:
CREATE view FactsAll as
select DateTran, ClientId, ProdId, Amount from Facts_2000
union all
select DateTran, ClientId, ProdId, Amount from Facts_2001
union all
...
select DateTran, ClientId, ProdId, Amount from Facts_2012


Продукция делится на типы, например, железо, дерево, резина:
Гвозди, шурупы и гайки - это железо (1)
Ящики - это дерево (2)
Прокладки и уплотнители - резина (3)

Стоит задача создать ОЛАП кубик чисто по железу (т.е. чтобы во всех размерностях выдавался только тот список клиентов, продукции, их типов, которые относятся к отгрузкам железа)

Справочник продукции имеет такой вид:
idNameTypeId Field1 Field2 Field3
1Гвозди1
2Шурупы1
3Ящик2
4Прокладка3
5Гайки1
6Уплотнитель3


Есть вьюха, которая выбирает нужную продукцию по железу (там не просто по типу отсеять, а еще используются поля Field1-Field3). Т.е. вьюха выглядит как-то так:
CREATE view ProdFe as
select id, Name, TypeId
from Prod
where TypeId = 1
   and Field1 <> 999


Так вот, в ОЛАП кубе в размерности нужно получить клиентов, которым отгружали только "железо".
Пишу соответствующую вьюху в роли справочника для размерности.
Делаю так:
select distinct ClientId, Name, ...
from FactsAll f, ProdFe p, Clients c
where p.id = f.ProdId
   and c.id = f.ClientId


при выполнении этого селекта возвращается:
The query processor could not start the necessary thread resources for parallel query execution.

делаю так (отсеиваю факты по железу, чтобы потом выбрать по ним клиентов):
select ClientId, Name, ...
from Clients c
where exists(
   select 1 from FactsAll f
     where exists(select 1 from ProdFe p where p.Id = f.ProdId)
         and f.ClientId = c.id
   )

как-то очень долго думает (около 2-х минут)...

подскажите, как решить эту задачу правильно?

ПС. в каждой т.фактов примерно по 3млн.записей
в справочнике клиентов всего около 20тыс.записей, из них отгружавших "железо" около 6тыс.шт.
в справочнике продукции около 2тыс.записей, из них "железа" 700шт

ППС. Microsoft SQL Server 2000 - 8.00.2249 (Intel X86) May 1 2007 18:39:59 Copyright (c) 1988-2003 Microsoft Corporation Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
9 янв 13, 15:59    [13742231]     Ответить | Цитировать Сообщить модератору
 Re: выбрать клиентов определенного типа  [new]
нуб987
Guest
при этом клиентам естественно может отгружаться любой тип продукции (т.е. добавить клиенту поле "Тип" нельзя). Задача в том, чтобы в кубе выделить только отгрузки "железа".
ПС. Индексы на все связываемые поля есть.
9 янв 13, 16:03    [13742271]     Ответить | Цитировать Сообщить модератору
 Re: выбрать клиентов определенного типа  [new]
WarAnt
Member

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

в этом запросе:

select distinct ClientId, Name, ...
from FactsAll f, ProdFe p, Clients c
where p.id = f.ProdId
and c.id = f.ClientId

запятые замените на join и будет вам счастье
9 янв 13, 16:11    [13742346]     Ответить | Цитировать Сообщить модератору
 Re: выбрать клиентов определенного типа  [new]
нуб987
Guest
WarAnt, уж по-разному извращался и даже БОЛ перечитывал на тему джоинов, но получается либо дольше, либо так же.
Да и в данном случае лично сам не понимаю выигрыша в джоинах - те же связи в общем-то получаются. Если только я не понимаю каких-то внутренних механизмов таких связей...
14 янв 13, 03:23    [13764213]     Ответить | Цитировать Сообщить модератору
 Re: выбрать клиентов определенного типа  [new]
нуб987
Guest
еще раз поясню суть задачи: нужно выбрать из справочника клиентов только те записи, которым когда либо отгружали "железо".
"Железные" отгрузки мы можем отсеять только по справочнику продукции.
Т.е. получается, чтобы решить задачу, нам нужно сначала с помощью справочника продукции получить все факты отгрузки "железа". А по этим фактам (их миллионы) выбрать записи из справочника клиентов.

Правильно ли я делаю или такие задачи вообще по-другому и гораздо проще решаются?
14 янв 13, 03:34    [13764215]     Ответить | Цитировать Сообщить модератору
 Re: выбрать клиентов определенного типа  [new]
aleks2
Guest
нуб987
подскажите, как решить эту задачу правильно?


Научиться наконец то использовать временные таблицы и not exists().
15 янв 13, 06:17    [13770100]     Ответить | Цитировать Сообщить модератору
 Re: выбрать клиентов определенного типа  [new]
нуб987
Guest
aleks2, а временные таблицы тут каким боком?
16 янв 13, 21:38    [13781085]     Ответить | Цитировать Сообщить модератору
 Re: выбрать клиентов определенного типа  [new]
invm
Member

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

Индексированное представление вас спасет.
16 янв 13, 22:49    [13781313]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить