Страница 2 из 3

Добавлено: 30 ноя 2006, 09:04
Goblin
Ядро системы сортирует данные по имеющимся индексам.
Любая операция над набором данных во View (фильтрация, сортировка)
при невозможности найти подходящий индекс запускает эту внешнюю выгрузку.

В данном случае упомянутые таблицы участвуют в подцепке, система им подобрала соотвествующие индексы(в которых нет поля NRec). При попытке сортировать по NRec что делать системе ? Переключиться на индекс с NRec - сломается подцепка. Остается выгрузить и отсортировать(100% table scan - вот отсюда и тормоза)
Другое дело, что MS SQL такие вещи делает втихую, а вот у нас имеют место быть ругательства системы.

Добавлено: 30 ноя 2006, 09:55
Den
2 Alexander
А вот если бы сразу привели весь полный код вью, то помогли бы Вам значительно раньше :-)

Добавлено: 30 ноя 2006, 11:21
coolibin
Alexander писал(а):Внешняя выгрузка все равно производится, как с этим бороться??
1. не использовать order by пока не разберешься как в галактике запросы работают. когда разберешься - тоже скорее всего order by тебе уже не понадобится

2. использовать существующие индексы в таблицах для сортировки. при отсутствии таковых идти разбираться как работают временные таблицы

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

Добавлено: 30 ноя 2006, 13:52
Alexander
Понятно, Спасибо!
Еще вопрос возник: Как можно сделать объединение, т.е.
Запрос:

Код: Выделить всё

select katsopr.SUMMA,
       katsopr.svnalogs,
       katsopr.name,
       katorg.name,
       addsumtune.name,
       katstroy.name,
       spsopr.dsopr
                    from katsopr,
                    katorg, 
                    addsumtune,
                    katstroy, 
                    spsopr
                            where ((
                                katsopr.corg == katorg.nrec and
                                spsopr.nrec == speczatr.CSPEC and
                                speczatr.CADDSUMTUNE == addsumtune.nrec and
                                spsopr.csopr == katsopr.nrec     and
                                katstroy.nrec == spsopr.cuks  and
                                111 == spsopr.vidsopr
                            ));
каким образом в этом запросе можно сделать выборку и по

Код: Выделить всё

110 == spsopr.vidsopr
???
И Можно ли вообще???

Добавлено: 30 ноя 2006, 14:05
Goblin
Самым простым - запихать первой строчкой в подцепку :-)
И нормализовать последовательность подцепки таблиц - а то в примере сущий бардак 8-)

В случае 1 значения Vidsopr
<значение vidsopr> == Katsopr.vidsopr
katsopr.corg == katorg.nrec and
katsopr.nrec == spsopr.csopr and
spsopr.nrec == speczatr.CSPEC and
speczatr.CADDSUMTUNE == addsumtune.nrec and
spsopr.cuks == katstroy.nrec

либо вынести ограничение по vidsopr за скобки подцепки и сделать фильтром нескольким значениям (по vidsopr есть несколько индексов, так что отработаться должно быстро)

Жирным - то, где напутано было в последовательности полей в подцепке.
Управляющее поле в подцепке всегда перед знаком подцепки :-)

Представьте себе View в виде дерева и последовательно описывайте по очереди ограничения на ветки (таблицы в нашем случае), опускаясь все ниже и ниже по уровню подцепки. Можете описать сначала по одной ветке сверху вниз подцепку, затем по второй и т.д. Можете по каждой ветке уровни последовательно на одном и том же уровне описывать. Но никогда не описывайте подцепку самых нижних таблиц перед описанием подцепки верхних таблиц, находящихся с ними в одной ветке запроса.

Добавлено: 30 ноя 2006, 17:21
dp
И нормализовать последовательность подцепки таблиц - а то в примере сущий бардак
так вот господа, не поверите. давеща посещал курсы в корпорации в москве так вот так учат (!!!), что писать в подцепке можно и нужно в беспорядке, дескать компилятор умный и сам подберет индексы какие можно и нужно. волосы дыбом ставали...
прямо такой бедлам в методичках и пишут.

а насчет 110 и 111 то проще всего так

Код: Выделить всё

Create view 
 Var TypeSopr : word
as select * from SpSopr
where
((
      TypeSopr == SpSopr.VidSopr
and <tratatata>
))
;

procedure Work
{
// Заполняем временные таблицы - или что таи надо еще сделать
}

HandleEvent
cmInit:
 { 
  TypeSopr := 110; Work;
  TypeSopr := 111; Work;

// ну и делаем дальше что нужно
 }

Добавлено: 30 ноя 2006, 20:03
Marya
To DP: ну, во-первых, в методичке таких слов нет (сама недавно обучилась :smile: );
а во-вторых, по моему опыту и убеждению, порядок перечисления подцепок никакого значения не имеет (от разработчиков тоже это слышала)... Сможете доказать обратное - буду благодарна...

Добавлено: 30 ноя 2006, 20:37
qip
ух, ты интересная тема! :-) Я тут впервые, не судите строго... :???:
dp писал(а): дескать компилятор умный и сам подберет индексы какие можно и нужно. волосы дыбом ставали...
Дико извиняюсь :-) , конечно, но ведь он и правда подбирает индексы!!! Я не прав?

Добавлено: 01 дек 2006, 00:04
kmr
Добрый день, уважаемые! Пришлось "засветиться" ради такого случая.. :smile:
Правда, повод не очень приятный...

Павел (dp), у меня к Вам один только вопрос, риторический:
что ж Вы мне в лицо-то свое мнение не высказали?
Спасибо Вам за преподанный урок... :smile:

Желаю всем успехов, ребята! Когда-нибудь приду сюда еще... :smile:

Добавлено: 01 дек 2006, 11:44
Den
Ну насчет того что можно писать в беспорядке ...вообщем можно, конечно. Но все же более логично наглядно описывать секцию where ((...))

Добавлено: 01 дек 2006, 11:47
Den
2 kmr
Раз Вы преподаватель на учебных курсах (по всей видимости...), Вы бы и помогали местному люду в решении различного рода проблем при программмировании на Атлантисе. Мы же не все уразумеем ... :-)

Добавлено: 01 дек 2006, 11:52
Алексей
Den
ты такой интересный. делать ему больше нечего.

Учить - его хлеб, а ты предлагаешь делать это здесь, на форуме, бесплатно! Оригинал. :cool:

Добавлено: 01 дек 2006, 11:58
Alexander
В документации написано, что порядо подцепок не имеет значения... Сомнительно, но факт!
На счет временной таблицы - это понятно, мне было интересно: можно ли одним запросом сделать... Значит Нельзя...

Добавлено: 01 дек 2006, 12:21
Alexander
Каким образом можно Получить модуль, в котором нахожусь?
Сбыт и т.п??

Добавлено: 01 дек 2006, 12:25
Den
Алексей писал(а):Den
Учить - его хлеб, а ты предлагаешь делать это здесь, на форуме, бесплатно! Оригинал. :cool:
Тем не менее, есть ребята (разработчики), которые, не менее загружены работой. И тем не менее оказывают посильную помощь в решении возникших проблем. Хотя конечно, это дело каждого )