Имя: Пароль:
1C
1С v8
как ускорить срез последних на каждую дату
0 Холодильник
 
14.11.13
16:01
Проблема - долго выполняется запрос.
самое узкое место - где получают таблицу актуальных данных из РС.
на входе в пакетный запрос таблица :

Товар        Дата
стол         01.05
Стул         12.09

в регистре(РС, периодический, день) хранятся данные в таком разрезе:
Измерения:
Товар

Ресурсы:
Ресурс


итого по каждому товару в РС хранится 100500 записей на каждую дату с различными значениями ресурса.

нужно получить самое позднее значения на дату товара из входной таблицы.



Классическая схема решения - входящую таблицу связываем с РС по условию Товар=Товар и дата>=период. Группируем по макс дате, помещаем во временную табл, затем её связываем вновь с РС по товар = Товар и Датамакс = период.

но это выполняется оч долго - если входящая таблица имеет 100 строк, а на каждый товар в РС имеется более 10000 записей(Период<Дата), то получае 1000000 строк в таблице, которую группируем.


Нет ли более быстрых схем решения?
1 1dvd
 
14.11.13
16:02
Запроос покажи. В частности Левое соединение .... ПО ...
2 Холодильник
 
14.11.13
16:07
а что там показывать

     |ВЫБРАТЬ
                   |    ВТ_Входная.Период,
                   |    ВТ_Входная.Товар,
                   |    МАКСИМУМ(МойРС.Период) КАК Макспериод
                   |ПОМЕСТИТЬ Связь_ПериодРС
                   |ИЗ
                   |    ВТ_ВходнаяКАК ВТ_Входная
                   |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.МойРС КАК МойРС
                   |        ПО ВТ_Входная.Товар= МойРС.Товар
                   |            И ВТ_Входная.Период >= МойРС.Период
                   |
                   |СГРУППИРОВАТЬ ПО
                   |    ВТ_Входная.Период,
                   |    ВТ_Входная.Товар
3 butterbean
 
14.11.13
16:08
если все это критично и постоянно используется - храните таблицу на каждый день
4 bolobol
 
14.11.13
16:09
Проиндексируйте
5 Холодильник
 
14.11.13
16:10
а потом

|ВЫБРАТЬ
                   |    МойРС.Период,
                   |    МойРС.Товар,
                   |    МойРС.Ресурс
                   |ИЗ
                   |   РегистрСведений.МойРС КАК МойРС
                   |        ЛЕВОЕ СОЕДИНЕНИЕ Связь_ПериодРС КАК Связь_ПериодРС
                   |        ПО МойРС.Товар= Связь_ПериодРС.Товар
                   |            И МойРС.Период = Связь_ПериодРС.Период
6 Classic
 
14.11.13
16:10
(2)
Индексируй ВТ
здесь поиск по индексу используется и в соединении и в группировке
7 Холодильник
 
14.11.13
16:10
т.е. правое соединение
8 Холодильник
 
14.11.13
16:15
по какому полю индексировать?
9 Classic
 
14.11.13
16:17
По товару и периоду.
В принципе можно и просто по товару, но в группировке тогда его первым поставь.
10 К_Дач
 
14.11.13
16:18
СКД. Связь наборов данных. Аналогично получению курсов валют на дату
11 К_Дач
 
14.11.13
16:18
Явно будет быстрее, чем твое: "ВТ_Входная.Период >= МойРС.Период"
12 H A D G E H O G s
 
14.11.13
16:19
У тебя кривой запрос.
13 H A D G E H O G s
 
14.11.13
16:19
В (5)
14 Classic
 
14.11.13
16:20
(13)
Он потом написал, что правое :)
15 Classic
 
14.11.13
16:20
Правда связь надо не по периоду, а по макспериоду делать
16 H A D G E H O G s
 
14.11.13
16:21
|            И МойРС.Период = Связь_ПериодРС.Период
заменить на
|            И МойРС.Период = Связь_ПериодРС.Макспериод
17 Sorm
 
14.11.13
16:22
(15)(16)+
(0) Проиндексировать однако...
18 Холодильник
 
14.11.13
16:23
(16) да-да.. это я для примера писал
19 H A D G E H O G s
 
14.11.13
16:23
Я бы в ВТ отобрал бы Регистр с отбором по Товару и периоду, чебынет.
20 H A D G E H O G s
 
14.11.13
16:23
попробовал бы.
21 H A D G E H O G s
 
14.11.13
16:24
(17) Че вам это индексирование втемяшилось то...
22 H A D G E H O G s
 
14.11.13
16:25
если входящая таблица имеет 100 строк...
в первом пакете имеем сто строк максимум, че вы тут индексировать собрались?
23 andew
 
14.11.13
16:25
(21) гы-гы
24 Холодильник
 
14.11.13
16:26
(19) это как? задать условия для РС?
25 H A D G E H O G s
 
14.11.13
16:26
2 раза ползают по таблице регистра, вот тут цимес.
26 H A D G E H O G s
 
14.11.13
16:26
счаст попробую написать
27 К_Дач
 
14.11.13
16:28
"итого по каждому товару в РС хранится 100500 записей на каждую дату с различными значениями ресурса.

нужно получить самое позднее значения на дату товара из входной таблицы. "

так при таком раскладе, если у тебя на дату 100500 значений ресурса для товара - ты их все и получишь. Или я чет не понял?
28 Холодильник
 
14.11.13
16:29
(27) мне нужно - самое позднее на дату из входной таблицы
29 andew
 
14.11.13
16:29
(10) +1
30 Classic
 
14.11.13
16:30
ВЫБРАТЬ
    вт.Товар,
    РС.Измерение
Из вт КАК вт
   ЛЕВОЕ СОЕДИНЕНИЕ РС КАК РС
   ПО вт.Товар = РС.Товар
      И РС.Период В
      (ВЫБРАТЬ ПЕРВЫЕ 1
      ИЗ РС КАК РС1
      ГДЕ РС1.Товар = РС.Товар
          И РС1.Период <= вт.период
      УПОРЯДОЧИТЬ ПО РС1.Период УБЫВ
      )
31 Холодильник
 
14.11.13
16:32
к первому подзапросу добавил
|ИНДЕКСИРОВАТЬ ПО
                   |    Период,
                   |    товар

теперь запрос выполнился за 122сек, вместо прежних 121
32 H A D G E H O G s
 
14.11.13
16:33
(31) А ты догадайся почему.
33 К_Дач
 
14.11.13
16:34
У тебя периодичность "в пределах секунды" что ли?
34 Холодильник
 
14.11.13
16:34
(32) а хз.. с индексацией раньше не работал
(33) в днях, написал ж
35 H A D G E H O G s
 
14.11.13
16:35
(30) Это что за покемон?
36 Fragster
 
модератор
14.11.13
16:36
ВЫБРАТЬ
    1 КАК Период,
    "А" КАК Значение
ПОМЕСТИТЬ Данные

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    2,
    "Б"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    4,
    "А"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    9,
    "Б"
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    Данные.Период,
    Данные.Значение,
    ДанныеПредыдущие.Период КАК Период1,
    ДанныеПредыдущие.Значение КАК Значение1
ИЗ
    Данные КАК Данные
        ЛЕВОЕ СОЕДИНЕНИЕ Данные КАК ДанныеПредыдущие
        ПО Данные.Значение = ДанныеПредыдущие.Значение
            И (ДанныеПредыдущие.Период В
                (ВЫБРАТЬ ПЕРВЫЕ 1
                    ДанныеУсловие.Период
                ИЗ
                    Данные КАК ДанныеУсловие
                ГДЕ
                    ДанныеУсловие.Значение = Данные.Значение
                    И ДанныеУсловие.Период < Данные.Период
                УПОРЯДОЧИТЬ ПО
                    ДанныеУсловие.Период УБЫВ))
37 Fragster
 
модератор
14.11.13
16:37
главное в скуле индекс подшаманить по Данные.Значение + Данные.Период Убыв
38 К_Дач
 
14.11.13
16:38
Тогда я не понимаю тебя, фраза: "самое позднее на дату из входной таблицы"

Таблица:

Самовар 10.05

РС:

10.05 Самовар 26,75
10.05 Самовар 32,56
10.05 Самовар 98,47
10.05 Самовар 77,84

Теперь объясни мне, какое значение из приведенного примера ты хочешь получить.
39 Fragster
 
модератор
14.11.13
16:38
(37)+ или выбирать во временную таблицу РазностьДат(КонецДня, Период) и сортировать по возрастанию и юзать стандартные индексы 1с
40 Sorm
 
14.11.13
16:39
(36) Сколько раз выполнится "ВЫБРАТЬ ПЕРВЫЕ 1
                    ДанныеУсловие.Период
                ИЗ
                    Данные КАК ДанныеУсловие
                ГДЕ
                    ДанныеУсловие.Значение = Данные.Значение
                    И ДанныеУсловие.Период < Данные.Период
                УПОРЯДОЧИТЬ ПО
                    ДанныеУсловие.Период УБЫВ" ?
41 К_Дач
 
14.11.13
16:40
+38 и как вообще такая ситуация может быть в регистре сведений
42 Холодильник
 
14.11.13
16:40
(38) чувак, в периодическом (день) регистре ты не сможешь внести несколько записей с 10.05 Самовар

РС тебе такого не позволит сделать, записи должны быть уникальны
43 Fragster
 
модератор
14.11.13
16:40
(40) я план запроса не смотрел этой штуки, если честно :)

с выделением  максимумов в пределах каждого дня и соединением по = работает быстрее, да
44 Ненавижу 1С
 
гуру
14.11.13
16:41
45 К_Дач
 
14.11.13
16:42
(42) так я про тоже! А ты написал в (0) что у тебя на КАЖДУЮ дату 100500 записей.
46 Fragster
 
модератор
14.11.13
16:42
(40) наверное по количеству строк основной таблицы
47 Холодильник
 
14.11.13
16:43
(45) ок, не на каждую.. вобщем - это тот же РС Курсы валют
48 К_Дач
 
14.11.13
16:48
(47) ну наконец-то, тогда вот тебе пример:

Набор1:

//////

ВЫБРАТЬ
    НАЧАЛОПЕРИОДА(ХозрасчетныйОбороты.Период, ДЕНЬ) КАК ДатаОперации,
ХозрасчетныйОбороты.СуммаОборот КАК СуммаРубли
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Обороты(, , Регистратор, Счет В (&СписокСчетов), , , НЕ КорСчет В (&СписокСчетов), ) КАК ХозрасчетныйОбороты

//////

Набор2:

//////
ВЫБРАТЬ
    &ДатаСреза КАК ДатаКурсаДоллара,
    КурсыВалютСрезПоследних.Курс КАК КурсДоллара
ИЗ
    РегистрСведений.КурсыВалют.СрезПоследних(&ДатаСреза, Валюта = &Доллар) КАК КурсыВалютСрезПоследних

///////

Связь: Источник-Приемник-Параметр
ДатаОперации-ДатаКурсаДоллара-ДатаСреза
49 H A D G E H O G s
 
14.11.13
16:49
ВЫБРАТЬ
    Номенклатура.Ссылка КАК Номенклатура,
    &ТекущаяДата КАК Дата
ПОМЕСТИТЬ Товары
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.ЭтоГруппа = ЛОЖЬ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ЦеныНоменклатуры.Номенклатура КАК Номенклатура,
    ЦеныНоменклатуры.Цена,
    ЦеныНоменклатуры.Период КАК Период
ПОМЕСТИТЬ ЦеныНоменклатуры
ИЗ
    РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Товары КАК Товары
        ПО ЦеныНоменклатуры.Номенклатура = Товары.Номенклатура
        и
        ЦеныНоменклатуры.Период <= Товары.Дата

ИНДЕКСИРОВАТЬ ПО
    Номенклатура,
    Период
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ЦеныНоменклатуры.Номенклатура,
    МАКСИМУМ(ЦеныНоменклатуры.Период) КАК Период
ПОМЕСТИТЬ ЦеныНоменклатурыМаксимум
ИЗ
    ЦеныНоменклатуры КАК ЦеныНоменклатуры

СГРУППИРОВАТЬ ПО
    ЦеныНоменклатуры.Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ЦеныНоменклатуры.Номенклатура,
    ЦеныНоменклатуры.Цена
ИЗ
    ЦеныНоменклатурыМаксимум КАК ЦеныНоменклатурыМаксимум
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЦеныНоменклатуры КАК ЦеныНоменклатуры
        ПО ЦеныНоменклатурыМаксимум.Номенклатура = ЦеныНоменклатуры.Номенклатура
            И ЦеныНоменклатурыМаксимум.Период = ЦеныНоменклатуры.Период
50 К_Дач
 
14.11.13
16:49
Работать будет сто процентов быстрее, чем твой запрос ко всему регистру с проверкой, больше ли период входящего или нет.
51 ILM
 
гуру
14.11.13
16:50
А что там СРЕЗПОСЛЕДНИХ() уже не кошерно?
52 К_Дач
 
14.11.13
16:51
53 Fragster
 
модератор
14.11.13
16:52
(49) лучше сделать СрезПоследних(минимальнаяДата) Объединить все ФизическаяТаблица где период > минимальная дата и <=Максимальная дата
54 Classic
 
14.11.13
16:52
(50)
Всегда считал, что коррзапрос медленнее. Но мои проверки показали, что разницы особой нет, если упорядочивание идет по индексу
55 К_Дач
 
14.11.13
16:53
ВЫБРАТЬ РАЗРЕШЕННЫЕ
ДатаОперации,
ВЫБОР
   КОГДА ХозрасчетныйОбороты.Счет.Валютный
     ТОГДА ХозрасчетныйОбороты.Валюта
   КОГДА ХозрасчетныйОбороты.КорСчет.Валютный
     ТОГДА ХозрасчетныйОбороты.ВалютаКор
   ИНАЧЕ &Рубль
КОНЕЦ КАК ВалютаОперации
Поместить ВТ1
ИЗ РБ.Хозрасчетный.Обороты
;
////////////////////////////////////////////

ВЫБРАТЬ РАЗРЕШЕННЫЕ
ВТ1.ДатаОперации,
ВТ1.ВалютаОперации,
МАКСИМУМ(КурсыВалют.Период) КАК ПериодДляСвязи
ПОМЕСТИТЬ ВТ2
ИЗ ВТ1 КАК ВТ1
ЛЕВОЕ СОЕДИНЕНИЕ РС.КурсыВалют КАК КурсыВалют
ПО ВТ1.ВалютаОперации = КурсыВалют.Валюта
  И ВТ1.ДатаОперации >= КурсыВалют.Период
СГРУППИРОВАТЬ ПО ВТ1.ДатаОперации, ВТ1.ВалютаОперации
ИНДЕКСИРОВАТЬ ПО ПериодДляСвязи
;
////////////////////////////////////////////

ВЫБРАТЬ
ВТ2.ДатаОперации,
ВТ2.ВалютаОперации,
КурсыВалют.Курс
ИЗ ВТ2 КАК ВТ2
ЛЕВОЕ СОЕДИНЕНИЕ РС.КурсыВалют КАК КурсыВалют
ПО ВТ2.ПериодДляСвязи = КурсыВалют.Период
И ВТ2.ВалютаОперации = КурсыВалют.Валюта
56 Classic
 
14.11.13
16:53
(53)
А разве СрезПоследних не тот же подзапрос?
57 Fragster
 
модератор
14.11.13
16:55
(56) просто потом соединять меньше
58 х86
 
14.11.13
16:55
(48)эта бня на больших объёмах отъедает стотыщ питсот гигов памяти и падает
59 К_Дач
 
14.11.13
16:55
Кароче, ребята - Хадгехогс уже все написал. Я в своем примере описал альтернативы. Лично мой опыт (я тестировал оба варианта - и запрос и СКД, показал, что скорость фактически одинаковая)
60 H A D G E H O G s
 
14.11.13
16:57
Первый пакетный запрос - он тупо как пример.
2 пакетный получает claster scan потому что селективности мало, счаст попробую ограничить 1 пакетный и глянуть. В остальном - ждем Холодильника.
61 К_Дач
 
14.11.13
16:57
(58) с чего вдруг? по сути то это одно и то же, соединение наборов в итоге - это неявное левое соединение. Ты проверял? откуда такие заявления
62 х86
 
14.11.13
16:58
(61)да, правда года полтора назад )
мошт релиз кривой был
63 Classic
 
14.11.13
16:59
(57)
Да, наверное
64 Холодильник
 
14.11.13
17:01
(60)
классический, времы выполнения 0,031

ВЫБРАТЬ
    &Валюта1 КАК Валюта,
    &дата1 КАК Дата
ПОМЕСТИТЬ ВТ

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    &Валюта2,
    &дата2

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    &Валюта3,
    &дата3
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ.Валюта,
    МАКСИМУМ(КурсыВалют.Период) КАК ПериодМакс
ПОМЕСТИТЬ ТаблицаМакс
ИЗ
    ВТ КАК ВТ
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
        ПО ВТ.Валюта = КурсыВалют.Валюта
            И ВТ.Дата >= КурсыВалют.Период

СГРУППИРОВАТЬ ПО
    ВТ.Валюта
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    КурсыВалют.Валюта,
    КурсыВалют.Период,
    КурсыВалют.Курс
ИЗ
    ТаблицаМакс КАК ТаблицаМакс
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
        ПО ТаблицаМакс.Валюта = КурсыВалют.Валюта
            И ТаблицаМакс.ПериодМакс = КурсыВалют.Период

---------



исправленный(по твоей схеме) = 0,046

ВЫБРАТЬ
    &Валюта1 КАК Валюта,
    &дата1 КАК Дата
ПОМЕСТИТЬ ВТ

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    &Валюта2,
    &дата2

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    &Валюта3,
    &дата3
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ.Валюта КАК Валюта,
    КурсыВалют.Период КАК Период
ПОМЕСТИТЬ ТаблицаВалютаПериод
ИЗ
    ВТ КАК ВТ
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
        ПО ВТ.Валюта = КурсыВалют.Валюта
            И ВТ.Дата >= КурсыВалют.Период

ИНДЕКСИРОВАТЬ ПО
    Валюта,
    Период
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ТаблицаВалютаПериод.Валюта,
    МАКСИМУМ(ТаблицаВалютаПериод.Период) КАК ПериодМакс
ПОМЕСТИТЬ ТаблицаМакс
ИЗ
    ТаблицаВалютаПериод КАК ТаблицаВалютаПериод

СГРУППИРОВАТЬ ПО
    ТаблицаВалютаПериод.Валюта
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    КурсыВалют.Валюта,
    КурсыВалют.Период,
    КурсыВалют.Курс
ИЗ
    ТаблицаМакс КАК ТаблицаМакс
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
        ПО ТаблицаМакс.Валюта = КурсыВалют.Валюта
            И ТаблицаМакс.ПериодМакс = КурсыВалют.Период
65 H A D G E H O G s
 
14.11.13
17:03
(64)
теперь запрос выполнился за 122сек, вместо прежних 121

давай в секундах
66 Холодильник
 
14.11.13
17:04
косяк, в последнем соединяться не с РС, а с ТаблицаВалютаПериод ..ща
67 К_Дач
 
14.11.13
17:04
Индексировать не по Период, а по ПериодМакс
68 Холодильник
 
14.11.13
17:04
(65) в 64 - время в секундах. стандартная БП, консоль Чистова
69 H A D G E H O G s
 
14.11.13
17:05
(68) А раньше?
70 Холодильник
 
14.11.13
17:08
(69) в 64:
первый запрос = 0,031с
второй = 0,046
третий = 0,063. текст третьего:

ВЫБРАТЬ
    &Валюта1 КАК Валюта,
    &дата1 КАК Дата
ПОМЕСТИТЬ ВТ

ОБЪЕДИНИТЬ
ВЫБРАТЬ
    &Валюта2,
    &дата2

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    &Валюта3,
    &дата3
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    ВТ.Валюта КАК Валюта,
    КурсыВалют.Период КАК Период ,
    КурсыВалют.Курс КАК Курс
    
ПОМЕСТИТЬ ТаблицаВалютаПериод
ИЗ
    ВТ КАК ВТ
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
        ПО ВТ.Валюта = КурсыВалют.Валюта
            И ВТ.Дата >= КурсыВалют.Период

ИНДЕКСИРОВАТЬ ПО
    Валюта,
    Период
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    ТаблицаВалютаПериод.Валюта,
    МАКСИМУМ(ТаблицаВалютаПериод.Период) КАК ПериодМакс
ПОМЕСТИТЬ ТаблицаМакс
ИЗ
    ТаблицаВалютаПериод КАК ТаблицаВалютаПериод

СГРУППИРОВАТЬ ПО
    ТаблицаВалютаПериод.Валюта
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    КурсыВалют.Валюта,
    КурсыВалют.Период,
    КурсыВалют.Курс
ИЗ
    ТаблицаМакс КАК ТаблицаМакс
        ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаВалютаПериод КАК КурсыВалют
        ПО ТаблицаМакс.Валюта = КурсыВалют.Валюта
            И ТаблицаМакс.ПериодМакс = КурсыВалют.Период
71 Холодильник
 
14.11.13
17:10
(65) 120с - это общий запрос в отчете. я хочу протестировать чистый пример на примере курсов валют
72 H A D G E H O G s
 
14.11.13
17:11
(71) Ты охеренно тестируешь с разницей в десяток миллисекунд.
73 К_Дач
 
14.11.13
17:12
(70) добавь "индексировать по ПериодМакс" перед последним левым соединением
74 Холодильник
 
14.11.13
17:13
(72) запускаю раз 10, показывает одно и тоже время выполнения с погрешностью в 1мс
75 Холодильник
 
14.11.13
17:15
(73) не особо изменилось.
Ок, попробую на основном РС, на 120с. Отпишусь о результатах
76 kiruha
 
14.11.13
17:32
(0)
Есть алгоритм существенно быстрее , но который использует неявное знание структуры назначений ресурсов регистра

суть алгоритма
1) Выбираются валюты и даты , но не все а большие(!) ДатаНач и по ДатаКон
где ДатаНач  меньше требуемой на месяц.
Если курс найден - валюта исключается из анализа
Таких должно быть 90%

2) ДатаНач сдвигается в прошлое еще на 5 месяцев
Ищется курс оставшихся валют
Если курс найден валюта исключается из анализа

3)Классич алгоритм без ограничений дата начальной для оставшихся валют (древних ?)

Количество сдвигов и шаг можно подбирать исходя из практической потребности задачи  
Поиск основан на использовании основного индекса
Период + [Измерение1 + ...] (Кластерный)
77 К_Дач
 
14.11.13
17:38
(75) ну че там, мне интересно
78 Холодильник
 
14.11.13
17:41
(77) завтра.. рабочий день почти закончился, лень
79 H A D G E H O G s
 
14.11.13
17:43
(78) Холодильник, давай нажал волшебную комбинацию и меряем. Все напряженно ждут.
80 К_Дач
 
14.11.13
17:45
Вообще, в рамках твоей задачи, если есть возможность определить из входящей таблицы самую младшую дату - можно попробовать ограничить выборку ресурсов из регистра, как подсказывает (76)
81 Холодильник
 
14.11.13
17:50
(80) а откуда я знаю, какие были последние записи в РС. может Тунисский динар последний раз загружали 2 года назад, а я такой возьму и обрежу выборку на 2 послед месяца.
82 kiruha
 
14.11.13
18:36
(81)


Рубль
Доллар
Евро
Тунниский динар

10 лет записей

1) Выборка за последний месяц
Рубль 1, Доллар 30, Евро 40, Туннисий динар - неопределено
просмотрено записей 30*4 против 30*4*12*10 полной выборки

Получены курсы Рубль, Доллар
Динар помещен во врем таблицу
2) Выборка за последние полгода - только по Динару.
Значение неопределено
Помещен во врем табл
30*1*6
3) Выборка по всему периоду по Динару - определен курс динара
30*1*6*10

Итого примерно 30*1*6*10 против 30*4*6*10 классического алгоритма
Индекс Период+Валюта