Имя: Пароль:
1C
1С v8
v8: Предложите варианты оптимизации запроса (он работающий)
,
0 vse_serjezno
 
03.06.14
16:01
Здравствуйте.

Пилю отчет.
Задача такая: выбрать ячейки, в которых номенклатура залежалась. Т.е. приход был сделан до определенной даты и в этой ячейке на текдату еще есть остаток.

Партионный учет не ведется.
Вариант решения я, в принципе, нашла. Но меня смущает, что я использую 2 таблицы одного регистра... Чувствую убогость этого решения, поэтому спрашиваю у более опытных мужей, как следует привести текст запроса к более элегантному виду?

Запрос:

ВЫБРАТЬ
    ИПМ_РазмещениеНоменклатурыПоЯчейкамОстатки.Номенклатура,
    ИПМ_РазмещениеНоменклатурыПоЯчейкамОстатки.Ячейка,
    ИПМ_РазмещениеНоменклатурыПоЯчейкам.Регистратор,
    МАКСИМУМ(ИПМ_РазмещениеНоменклатурыПоЯчейкам.Регистратор.Дата) КАК РегистраторДата
ИЗ
    РегистрНакопления.ИПМ_РазмещениеНоменклатурыПоЯчейкам.Остатки(&СегодняшняяДата, Склад = &Склад) КАК ИПМ_РазмещениеНоменклатурыПоЯчейкамОстатки
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ИПМ_РазмещениеНоменклатурыПоЯчейкам КАК ИПМ_РазмещениеНоменклатурыПоЯчейкам
        ПО ИПМ_РазмещениеНоменклатурыПоЯчейкамОстатки.Номенклатура = ИПМ_РазмещениеНоменклатурыПоЯчейкам.Номенклатура
            И ИПМ_РазмещениеНоменклатурыПоЯчейкамОстатки.Склад = ИПМ_РазмещениеНоменклатурыПоЯчейкам.Склад
            И ИПМ_РазмещениеНоменклатурыПоЯчейкамОстатки.Ячейка = ИПМ_РазмещениеНоменклатурыПоЯчейкам.Ячейка
ГДЕ
    ИПМ_РазмещениеНоменклатурыПоЯчейкам.Регистратор ССЫЛКА Документ.ПеремещениеТоваров
    И ИПМ_РазмещениеНоменклатурыПоЯчейкам.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.приход)
    И ИПМ_РазмещениеНоменклатурыПоЯчейкам.Регистратор.Дата < &ДатаКонтроля

СГРУППИРОВАТЬ ПО
    ИПМ_РазмещениеНоменклатурыПоЯчейкамОстатки.Номенклатура,
    ИПМ_РазмещениеНоменклатурыПоЯчейкамОстатки.Ячейка,
    ИПМ_РазмещениеНоменклатурыПоЯчейкам.Регистратор
1 Яйца 1С
 
03.06.14
16:02
И ИПМ_РазмещениеНоменклатурыПоЯчейкам.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.приход) с этим что-то надо делать!
2 vis_tmp
 
03.06.14
16:03
(1) Почему именно с этим?
3 Spieluhr
 
03.06.14
16:05
(0) как долго формируется отчет с этим запросом?
4 Enders
 
03.06.14
16:06
А в чем смысл группировки если в ней участвует ИПМ_РазмещениеНоменклатурыПоЯчейкам.Регистратор,
а вычисляемое поле МАКСИМУМ(ИПМ_РазмещениеНоменклатурыПоЯчейкам.Регистратор.Дата) ?
У регистратора вроде как одна дата может быть?
5 patapum
 
03.06.14
16:06
(0) имхо, две таблицы регистра - нормально. если хочется оптимизировать - условия ГДЕ перенести в условия соединения таблиц
6 patapum
 
03.06.14
16:07
(4) плюсую, не заметил
7 Maxus43
 
03.06.14
16:08
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ИПМ_РазмещениеНоменклатурыПоЯчейкам

На ОБОРОТЫ заменить, там период есть, РесурсПриход есть... тормозят поидее
   И ИПМ_РазмещениеНоменклатурыПоЯчейкам.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.приход)
    И ИПМ_РазмещениеНоменклатурыПоЯчейкам.Регистратор.Дата < &ДатаКонтроля



особенно последнее
8 Enders
 
03.06.14
16:09
(5) + Так как в условиях "где" присутствует только присоединяемая таблица логичней было бы засунуть их в условия соединения. А в Где прописать "Не ИПМ_РазмещениеНоменклатурыПоЯчейкам.Регистратор ЕСТЬ NULL"
9 bolobol
 
03.06.14
16:09
(5) Ага, особенно это:

ИПМ_РазмещениеНоменклатурыПоЯчейкам.Регистратор ССЫЛКА Документ.ПеремещениеТоваров

и это

    И ИПМ_РазмещениеНоменклатурыПоЯчейкам.Регистратор.Дата < &ДатаКонтроля

Чтоб соединение без индексов шло по произведению таблиц составного поля, и контрольный Дата не по равенству! Во оптимизатор)
10 H A D G E H O G s
 
03.06.14
16:10
Смысла в запросе - нет.
11 bolobol
 
03.06.14
16:10
(10) Изюминки?
12 vde69
 
модератор
03.06.14
16:17
тормозит вот это
ИПМ_РазмещениеНоменклатурыПоЯчейкам.Регистратор.Дата < &ДатаКонтроля

еще можно посоветовать ИПМ_РазмещениеНоменклатурыПоЯчейкамОстатки загнать во временную таблицу и проиндексировать по номенклатуре складу и ячейки
13 vse_serjezno
 
03.06.14
17:11
(3) секунд 20.
14 vse_serjezno
 
03.06.14
17:12
(13) хотя нет...меньше, секунд 12 отчет года за 2.
15 vse_serjezno
 
03.06.14
17:16
Что-то я так и не поняла, на что можно заменить
ИПМ_РазмещениеНоменклатурыПоЯчейкам.Регистратор.Дата < &ДатаКонтроля
16 vse_serjezno
 
03.06.14
17:29
(4) Соглашусь, прошляпила.
17 Bober
 
03.06.14
17:42
(0) для начала измени посление условие
с
И ИПМ_РазмещениеНоменклатурыПоЯчейкам.Регистратор.Дата < &ДатаКонтроля

на

И ВЫРАЗИТЬ(ИПМ_РазмещениеНоменклатурыПоЯчейкам.Регистратор КАК Документ.ПеремещениеТоваров).Дата < &ДатаКонтроля
18 Bober
 
03.06.14
17:44
(0) и измени вот это
с
ИПМ_РазмещениеНоменклатурыПоЯчейкам.Регистратор,    МАКСИМУМ(ИПМ_РазмещениеНоменклатурыПоЯчейкам.Регистратор.Дата) КАК РегистраторДата

на
ВЫРАЗИТЬ(ИПМ_РазмещениеНоменклатурыПоЯчейкам.Регистратор КАК КАК Документ.ПеремещениеТоваров) КАК Регистратор,
    МАКСИМУМ(ВЫРАЗИТЬ(ИПМ_РазмещениеНоменклатурыПоЯчейкам.Регистратор КАК КАК Документ.ПеремещениеТоваров).Дата) КАК РегистраторДата
19 Bober
 
03.06.14
17:46
далее нужно смотреть на индексы в таблице ИПМ_РазмещениеНоменклатурыПоЯчейкам и на количество записей в ней.
PS Еще как вариант сделать полный пересчет итогов через конфигуратор.
20 Bober
 
03.06.14
17:48
думаю, что скорее всего можно заменить работу с датой регистратора
ВЫРАЗИТЬ(ИПМ_РазмещениеНоменклатурыПоЯчейкам.Регистратор КАК КАК Документ.ПеремещениеТоваров).Дата

на дату прямо из регистра
ИПМ_РазмещениеНоменклатурыПоЯчейкам.Период

т. е.

ВЫРАЗИТЬ(ИПМ_РазмещениеНоменклатурыПоЯчейкам.Регистратор КАК КАК Документ.ПеремещениеТоваров).Дата = ИПМ_РазмещениеНоменклатурыПоЯчейкам.Период
21 ignorant
 
03.06.14
18:17
Я бы собирал все "свежие" приходы товара вручную во врЕменную таблицу...
К сожалению, ИБ такой структуры у меня нет, запрос проверить не могу, но смысл, надеюсь донёс

ВЫБРАТЬ
    ИПМ_РазмещениеНоменклатурыПоЯчейкам.Номенклатура,
    ИПМ_РазмещениеНоменклатурыПоЯчейкам.Ячейка,
    ИПМ_РазмещениеНоменклатурыПоЯчейкам.Регистратор,
    ИПМ_РазмещениеНоменклатурыПоЯчейкам.Период
Поместить ИсторияПриходов        
ИЗ        
   РегистрНакопления.ИПМ_РазмещениеНоменклатурыПоЯчейкам КАК ИПМ_РазмещениеНоменклатурыПоЯчейкам
ГДЕ
       ИПМ_РазмещениеНоменклатурыПоЯчейкам.Склад = &Склад
    И ИПМ_РазмещениеНоменклатурыПоЯчейкам.Регистратор ССЫЛКА Документ.ПеремещениеТоваров
    И ИПМ_РазмещениеНоменклатурыПоЯчейкам.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.приход)
    И ИПМ_РазмещениеНоменклатурыПоЯчейкам.Период < &ДатаКонтроля
;

ВЫБРАТЬ
    ИсторияПриходов.Номенклатура,
    ИсторияПриходов.Ячейка,
    МАКСИМУМ(ИсторияПриходов.Период) КАК РегистраторДата
Поместить СвежиеПриходы
ИЗ ИсторияПриходов КАК ИсторияПриходов

;

Выбрать
    СвежиеПриходы.Номенклатура,
    СвежиеПриходы.Ячейка,
    СвежиеПриходы.РегистраторДата,
    ИсторияПриходов.Регистратор
Поместить ИПМ_РазмещениеНоменклатурыПоЯчейкам  
ИЗ СвежиеПриходы
Внутреннее соединение ИсторияПриходов КАК ИсторияПриходов
        ПО СвежиеПриходы.Номенклатура = ИсторияПриходов.Номенклатура
            И СвежиеПриходы.Склад = ИсторияПриходов.Склад
            И СвежиеПриходы.РегистраторДата = ИсторияПриходов.Период

;

ВЫБРАТЬ
    ИПМ_РазмещениеНоменклатурыПоЯчейкамОстатки.Номенклатура,
    ИПМ_РазмещениеНоменклатурыПоЯчейкамОстатки.Ячейка,
    ИПМ_РазмещениеНоменклатурыПоЯчейкам.Регистратор
ИЗ
    РегистрНакопления.ИПМ_РазмещениеНоменклатурыПоЯчейкам.Остатки(&СегодняшняяДата, Склад = &Склад) КАК ИПМ_РазмещениеНоменклатурыПоЯчейкамОстатки
        ЛЕВОЕ СОЕДИНЕНИЕ ИПМ_РазмещениеНоменклатурыПоЯчейкам КАК ИПМ_РазмещениеНоменклатурыПоЯчейкам
        ПО ИПМ_РазмещениеНоменклатурыПоЯчейкамОстатки.Номенклатура = ИПМ_РазмещениеНоменклатурыПоЯчейкам.Номенклатура
            И ИПМ_РазмещениеНоменклатурыПоЯчейкамОстатки.Склад = ИПМ_РазмещениеНоменклатурыПоЯчейкам.Склад
            И ИПМ_РазмещениеНоменклатурыПоЯчейкамОстатки.Ячейка = ИПМ_РазмещениеНоменклатурыПоЯчейкам.Ячейка
22 Fragster
 
гуру
03.06.14
18:36
(10) ghfd
23 Fragster
 
гуру
03.06.14
18:36
надо по другому подходить
24 vde69
 
модератор
04.06.14
08:14
попробуй так...

ВЫБРАТЬ
    ИПМ_РазмещениеНоменклатурыПоЯчейкамОстатки.Номенклатура,
    ИПМ_РазмещениеНоменклатурыПоЯчейкамОстатки.Ячейка,
    ИПМ_РазмещениеНоменклатурыПоЯчейкам.Регистратор,
    МАКСИМУМ(ИПМ_РазмещениеНоменклатурыПоЯчейкам.Регистратор.Дата) КАК РегистраторДата
ИЗ
    РегистрНакопления.ИПМ_РазмещениеНоменклатурыПоЯчейкам.Остатки(&СегодняшняяДата, Склад = &Склад) КАК ИПМ_РазмещениеНоменклатурыПоЯчейкамОстатки
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ИПМ_РазмещениеНоменклатурыПоЯчейкам КАК ИПМ_РазмещениеНоменклатурыПоЯчейкам
        ПО ИПМ_РазмещениеНоменклатурыПоЯчейкамОстатки.Номенклатура = ИПМ_РазмещениеНоменклатурыПоЯчейкам.Номенклатура
            И ИПМ_РазмещениеНоменклатурыПоЯчейкамОстатки.Склад = ИПМ_РазмещениеНоменклатурыПоЯчейкам.Склад
            И ИПМ_РазмещениеНоменклатурыПоЯчейкамОстатки.Ячейка = ИПМ_РазмещениеНоменклатурыПоЯчейкам.Ячейка
    И ИПМ_РазмещениеНоменклатурыПоЯчейкам.Регистратор ССЫЛКА Документ.ПеремещениеТоваров
    И ИПМ_РазмещениеНоменклатурыПоЯчейкам.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.приход)

ГДЕ
    ВЫРАЗИТЬ(ИПМ_РазмещениеНоменклатурыПоЯчейкам.Регистратор КАК КАК Документ.ПеремещениеТоваров).Дата = ИПМ_РазмещениеНоменклатурыПоЯчейкам.Период
СГРУППИРОВАТЬ ПО
    ИПМ_РазмещениеНоменклатурыПоЯчейкамОстатки.Номенклатура,
    ИПМ_РазмещениеНоменклатурыПоЯчейкамОстатки.Ячейка,
    ИПМ_РазмещениеНоменклатурыПоЯчейкам.Регистратор
25 vse_serjezno
 
04.06.14
13:07
Т.е. это в принципе нормально соединять виртуальную и реальную таблицы?..
26 vde69
 
модератор
04.06.14
14:07
(25) в принцепе - нормально. Но тут нет однозначных рекомендаций, много зависит от размера таблиц и получаемых выборок.
27 vse_serjezno
 
04.06.14
14:11
(26) Мне бы хотелось узнать больше про все эти фишки с производительностью запросов, почему Лучше так:
ПО ИПМ_РазмещениеНоменклатурыПоЯчейкамОстатки.Номенклатура = ИПМ_РазмещениеНоменклатурыПоЯчейкам.Номенклатура
            И ИПМ_РазмещениеНоменклатурыПоЯчейкамОстатки.Склад = ИПМ_РазмещениеНоменклатурыПоЯчейкам.Склад
            И ИПМ_РазмещениеНоменклатурыПоЯчейкамОстатки.Ячейка = ИПМ_РазмещениеНоменклатурыПоЯчейкам.Ячейка
    И ИПМ_РазмещениеНоменклатурыПоЯчейкам.Регистратор ССЫЛКА Документ.ПеремещениеТоваров
    И ИПМ_РазмещениеНоменклатурыПоЯчейкам.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.приход)

а не так:

ГДЕ
    ИПМ_РазмещениеНоменклатурыПоЯчейкам.Регистратор ССЫЛКА Документ.ПеремещениеТоваров
    И ИПМ_РазмещениеНоменклатурыПоЯчейкам.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.приход)
    И ИПМ_РазмещениеНоменклатурыПоЯчейкам.Регистратор.Дата < &ДатаКонтроля


Почему так:
МАКСИМУМ(ВЫРАЗИТЬ(ИПМ_РазмещениеНоменклатурыПоЯчейкам.Регистратор КАК КАК Документ.ПеремещениеТоваров).Дата) КАК РегистраторДата

а не как я разнесла.

Мне хочется тонкости эти понять. Принципы быстродействия запросов.
28 vde69
 
модератор
04.06.14
14:22
(27) для этого нужно научится читать план запроса.

ну в кратце
1. чем выше условие - тем лучше (более маленький промежуточный результат)
2. запрос к полю регистратора = равняется запросу ко всем регистраторам. По этому при возможности нужно использовать явное приведение типов. Особенно хорошо это видно когда результат кладем во временную таблицу...
29 vse_serjezno
 
04.06.14
15:19
(28) А почему лучше во временную таблицу какие-то промежуточные результаты выгружать и индексировать?..
30 vde69
 
модератор
04.06.14
16:07
(29) джойн по индексированым полям на порядок быстрее, а что у тебя получится на выходе виртуальной таблице (какие индексы) одному SQL известно :)
31 vi0
 
04.06.14
16:19
кроме прочего советую использовать короткие псевдонимы таблиц
вот это ИПМ_РазмещениеНоменклатурыПоЯчейкамОстатки ну очень не читабельно
32 vi0
 
04.06.14
16:25
а не лучше это
Регистратор.Дата < &ДатаКонтроля

заменить на это
33 vi0
 
04.06.14
16:25
а не лучше это
Регистратор.Дата < &ДатаКонтроля

заменить на это
Период < &ДатаКонтроля
?
34 ДенисЧ
 
04.06.14
16:26
(33) Период не всегда равен дате регистратора :-)
35 H A D G E H O G s
 
04.06.14
16:30
(30) Я могу поспорить
36 vi0
 
04.06.14
16:31
(34) ну да, так я и спросил поэтому
37 vi0
 
04.06.14
16:32
(35) +да, индексы далеко не всегда тут используются
простая проверка показывает
38 H A D G E H O G s
 
04.06.14
16:37
(37) Чтобы построить Индекс, надо сделать Перебор, как минимум.
39 vi0
 
04.06.14
16:39
(38) ну так перебор может быть оправдан в общем случае
40 vse_serjezno
 
04.06.14
16:41
(33) Это условие отпадает, в моем случае его нужно выносить в отбор самой схемы скд, что я и сделала, иначе не совсем то, что нужно выводилось. Но на будущее учту замечания.
41 vse_serjezno
 
04.06.14
16:42
(38) Я извиняюсь, а что значит "построить Индекс"?...
42 Полотенчик
 
04.06.14
16:47
(27) потому что лучше сначала из правой таблицы выкинуть все лишнее и потом соединять чем сначала соединить, а потом отбрасывать лишнее
43 Fragster
 
гуру
04.06.14
16:49
может быть просто получить остаткииообороты за последний месяц и оттуда смотреть где расходов не было (ну или приходов)?
все равно эти данные бессмыслены, так хоть быстрее работать будет?
44 vi0
 
04.06.14
16:49
(40) а причем скд?
мы же про запрос говорим
45 vse_serjezno
 
04.06.14
16:53
(44) Я сделала отчет на скд.
Запрос у меня ныне такой:

ВЫБРАТЬ
    ИПМ_РазмещениеНоменклатурыПоЯчейкамОстатки.Номенклатура,
    ИПМ_РазмещениеНоменклатурыПоЯчейкамОстатки.Ячейка,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ИПМ_РазмещениеНоменклатурыПоЯчейкам.Регистратор) КАК Регистратор,
    МАКСИМУМ(ИПМ_РазмещениеНоменклатурыПоЯчейкам.Регистратор.Дата) КАК РегистраторДата
ИЗ
    РегистрНакопления.ИПМ_РазмещениеНоменклатурыПоЯчейкам.Остатки(&СегодняшняяДата, Склад = &Склад) КАК ИПМ_РазмещениеНоменклатурыПоЯчейкамОстатки
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ИПМ_РазмещениеНоменклатурыПоЯчейкам КАК ИПМ_РазмещениеНоменклатурыПоЯчейкам
        ПО ИПМ_РазмещениеНоменклатурыПоЯчейкамОстатки.Номенклатура = ИПМ_РазмещениеНоменклатурыПоЯчейкам.Номенклатура
            И ИПМ_РазмещениеНоменклатурыПоЯчейкамОстатки.Склад = ИПМ_РазмещениеНоменклатурыПоЯчейкам.Склад
            И ИПМ_РазмещениеНоменклатурыПоЯчейкамОстатки.Ячейка = ИПМ_РазмещениеНоменклатурыПоЯчейкам.Ячейка
ГДЕ
    ИПМ_РазмещениеНоменклатурыПоЯчейкам.Регистратор ССЫЛКА Документ.ПеремещениеТоваров
    И ИПМ_РазмещениеНоменклатурыПоЯчейкам.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.приход)

СГРУППИРОВАТЬ ПО
    ИПМ_РазмещениеНоменклатурыПоЯчейкамОстатки.Номенклатура,
    ИПМ_РазмещениеНоменклатурыПоЯчейкамОстатки.Ячейка
46 vi0
 
04.06.14
16:53
(42) для SQL Server это не обязательно так
47 vse_serjezno
 
04.06.14
16:55
(45) И в отборе СКД уже пользователь сам меняет дату, до которой выводить приходы номенклатуры.
48 vi0
 
04.06.14
16:55
(45) я говорю, что мы говорим о запросе
как вынести параметры в скд - это вопрос второй
49 vse_serjezno
 
04.06.14
16:55
(48) да это не вопрос уже)
50 H A D G E H O G s
 
04.06.14
16:59
(39)
Общий алгоритм

Индексируем ВТ:

1) Перебор
2) Поиск по индексу (в лучшем случае, в худшем - также перебор)

Не индексируем ВТ:
1) Перебор
51 vi0
 
04.06.14
17:24
(50) не обязательно перебор - это худший случай
52 Avalone2010
 
04.06.14
17:34
(0) Объеденять виртуальный таблицы есть моветон.В начале во временные с индексацией, потом объеденяем
53 vse_serjezno
 
04.06.14
17:38
(52) А индексировать по каким полям?..
Я пока не вполне понимаю смысл индексации...
54 H A D G E H O G s
 
04.06.14
17:41
(53) Ни по каким. Это люди понасмотрелись глупостей в этих ихнех интернетах и муть несут.
55 Avalone2010
 
04.06.14
17:42
(53) Все ниже написанное применяем если большой объем данных, если маленкий та нафиг не надо. Смотрите Вирт таблица строится платформой один эс во время запроса, т.е. в СУЬД нет таблицы РегистрТакойТо.Остатки(она конечно же есть, но там содержатся срезы остатков). Поскольку эта таблица "достраивается" по срезам а не берется из СУБД то для нее 1С по умолчанию не делает индексы(потому что просто не знает какие индексы ей нужно делать).Поэтому все вертуальные таблицы в ВТ, ВТ индексируем по полям по которым идет объеденинеие или отбор.
56 Avalone2010
 
04.06.14
17:43
(53) при чем интернеты, это из книжек и из статей с ИТС.
57 Avalone2010
 
04.06.14
17:44
(56) к (55)
58 H A D G E H O G s
 
04.06.14
17:46
ВТ имеет смысл индексировать в 2 случаях:
1) Для большой таблицы, с большой селективностью по полю и несколькими дальнейшими поисками (Соединениями, Условиями) по данному полю (несколько пакетов, несколько таблиц в Соединении).
2) Для большой Таблицы, с большой селективностью по полю, которая потом будет содержаться в МенеджереВТ и использоваться для поиска в течении всего сеанса (серверный Кэш). С приходом 8.3 и УП и запретом сохранять несериализуемые значения между серверными вызовами
v8: Сохранить менеджер временных таблиц между серверными вызовами.

пункт 2 также отпадает.
59 Avalone2010
 
04.06.14
17:48
(58) а теперь причитайте первое предложение в (55) и скажите где я не прав.
60 H A D G E H O G s
 
04.06.14
17:49
(56) Для начала почитай это

http://www.sql.ru/articles/mssql/03013101indexes.shtml

Особенно упор сделайте на термин Селективность.

Этот термин в 90% случаев отметает indexSeek
61 ILM
 
гуру
04.06.14
17:52
Ежик прав. В целом можно сделать вывод: Оптимизация запросов без данных, напоминает лечение по фотографии.
62 Avalone2010
 
04.06.14
17:52
(60) знаем, читали. Вот что меня удивляет во всех ветках, так это что человек просит подсказать как написать букву А, а ему говорять что прежде чем писать букву А надо прочитать дюжину классиков, сходить на курсы руско германской прописи или убить себя об стену...
63 H A D G E H O G s
 
04.06.14
17:53
(59) Лейбмотивы:

1) Не имеет выгоды строить Индекс для дальнейшего ОДНОКРАТНОГО поиска.
2) Особенно не имеет выгоды строить Индекс для дальнейшего ОДНО(МНОГО)кратного поиска по полю низкой селективности (например, поле Организация в РН ТоварыОрганизации), ибо индекс задействован не будет.
64 Avalone2010
 
04.06.14
17:53
+Вместо того что бы языком домохозяйки обяснить что и как делать
65 H A D G E H O G s
 
04.06.14
17:53
(64) см. (54)
66 Avalone2010
 
04.06.14
17:54
(63) Номенклатура и ячейка низкоселективны?
67 Avalone2010
 
04.06.14
17:55
Может у них база с 100К +1 номенклатурой на 100+1 складах с туевой хучей ячеек?
68 H A D G E H O G s
 
04.06.14
17:57
(67) Хуева туча ячеек - номенклатура высокоселективна.
Ячеек немного - номенклатура - низкоселективна.
69 H A D G E H O G s
 
04.06.14
17:57
(67) Это говорит и незакрытии остатков.
70 H A D G E H O G s
 
04.06.14
17:57
о незакрытии
71 H A D G E H O G s
 
04.06.14
17:59
(67) Надо смотреть базу

Выбрать Различные(Номенклатура)/ Количество строк - вот ваша селективность, только и всего.
72 ILM
 
гуру
04.06.14
17:59
(62) Я на 1С с Оракла перешел, оптимизировал на уровне указания хинтов в запросе. И как этот опыт передать домохозяйкам?
73 H A D G E H O G s
 
04.06.14
18:00
Вот, кстати. Хинтами в sql можно жестко приказать использовать индекс, но я доверюсь статистике sql
74 H A D G E H O G s
 
04.06.14
18:01
Хотя, иногда sql делает странные вещи, но редко.
75 Avalone2010
 
04.06.14
18:02
Ребят что то мне кажется вы сами поначитались интернетов и вас прет всех. За сим откланиваюсь так как спорить с такими гуру не позволяют мои скромные "знания" .
76 StaticUnsafe
 
04.06.14
18:04
(0) Сначала выберите приходы до определенной даты, поместите во временную таблицу.
Затем из виртуальной таблицы остатков выберите остатки, передайте в её параметр полученную временную таблицу.

Это при текущей структуре регистра.
77 Fragster
 
гуру
04.06.14
18:06
кто-нибудь кроме меня про то, что начинать надо с того, что же хочется получить на выходе и зачем это надо, сказал?
78 ILM
 
гуру
04.06.14
18:06
(75) "-Постой, не уходи! Мы ждали лета, пришла зима..."

Вся селективность внутри данных! Если первый запрос отбирает три записи, то его лучше выполнить вперёд, чем запрос который возвращает 100K записей из которых потом отберут три штуки.
79 ILM
 
гуру
04.06.14
18:07
(77) И так ясно, намазать вазелином снабженцев, за захламление склада ))
80 erp20
 
04.06.14
18:10
(71) Это вариант расчета плотности или Density (при этом в ms sql используется другая формула), но не Селективности. Селективность или Selectivity считается по другой формуле.
81 Fragster
 
гуру
04.06.14
18:11
(79) то, что товар долго не лежит на одной ячейке - еще не значит, что он долго не лежит все время на разных. вообще по логике надо вход и выход измерять без привязки к ячейкам...
82 H A D G E H O G s
 
04.06.14
18:12
(80) Это связанные понятия.

Селективность - это соотношение строк, возвращаемых запросом - к общему количеству строк.
То есть если запрос возвращает 50 строк, а в таблице всего 100, то селективность (50/100)*100%= 50%. При высокой селективности запроса, индекс лучше не использовать, так как это требует большого количества логических чтений.
83 ILM
 
гуру
04.06.14
18:14
(81) Это уже к ТС. Может ему нужно отношение скорости выбытия к скорости поступления.
84 H A D G E H O G s
 
04.06.14
18:14
(80) Может и плотность, я общий смысл передавал.

Чем больше запрос вернет строк при наложении условия по индексированному полю, тем меньше шанс, что sql использует индекс при поиске.
85 Fragster
 
гуру
04.06.14
18:15
(83) все равно чем не устраивает таблица ОстаткиИОбороты? при чем тут ячейки вообще?
86 ILM
 
гуру
04.06.14
18:16
(83) Может у директора в любимую ячейку хрен не влезает)))
87 erp20
 
04.06.14
18:21
(82) Я знаю что такое Density, Selectivity и Cardinality, по какой методике они рассчитываются mssql, как связаны между собой и как используются. Вы упираете на некомпетентность интернетов - (54), при этом подменяете понятия и формулы - это не очень корректно. Люди послушают Вас, поверят и будут потом выдавать за истину. Понимаете к чему я?
88 ILM
 
гуру
04.06.14
18:22
(87) А что неверного было в рекомендациях?
89 erp20
 
04.06.14
18:23
Если мы говорим про большие таблицы, то для их соединения mssql чаще предпочитает использовать хэш-таблицы, даже при наличии сформированных в tempdb индексов.
90 erp20
 
04.06.14
18:28
(88) Какие рекомендации? Я лишь сказал, что Дмитрий указал формулу расчета (одну из, кстати к mssql неприменимую) плотности, а не селективности. Никаких возражений против чьих либо рекомендаций я не высказывал.
Программист всегда исправляет последнюю ошибку.