06.02.2008, 11:35 | #1 |
Участник
|
Вот уже сколько лет занимаюсь Navision, а впервые задумался о такой ситуации.
Допустим, есть очень большая таблица операций. Надо ее обработать следующим образом: наложить фильтр, содержащий больше одного значения, на какое-то поле, а затем пройтись по таблице в порядке ее первичного ключа. Это что же, сделать быстро в принципе невозможно? |
|
06.02.2008, 11:39 | #2 |
Участник
|
Цитата:
Сообщение от Milk
Вот уже сколько лет занимаюсь Navision, а впервые задумался о такой ситуации.
Допустим, есть очень большая таблица операций. Надо ее обработать следующим образом: наложить фильтр, содержащий больше одного значения, на какое-то поле, а затем пройтись по таблице в порядке ее первичного ключа. Это что же, сделать быстро в принципе невозможно? |
|
06.02.2008, 12:50 | #3 |
Участник
|
Да, теперь мне стало глубже понятно, зачем Аналитические отчеты запоминают номер последней операции
|
|
08.02.2008, 13:10 | #4 |
Участник
|
Скажем, Товар Книга Операций?
Например фильтр на поле Документ Но? Фильтр естественно по нескольким значениям? Вот тут не очень понял. Что значит "пройтись в порядке первичного ключа"? То есть перемещаться между отфильтрованными записямии при этом они отсортированы по порядку первичного ключа? А ключ вы выбираете или нет? То есть фильтр по полю наложили - это поле в составе ключа или нет? Если - нет, то понятно, что будет медленно - так это и везде так будет-в любой базе. А если поле есть в ключе- так и работать будет быстро. Или я что-то недопонял? |
|
08.02.2008, 14:50 | #5 |
Участник
|
Например. Или Фин. Книга, или Стоимость Операции - в общем, где со временем количество записей начинает измеряться миллионами.
Цитата:
Например фильтр на поле Документ Но? Фильтр естественно по нескольким значениям?
Цитата:
Вот тут не очень понял. Что значит "пройтись в порядке первичного ключа"?
То есть перемещаться между отфильтрованными записямии при этом они отсортированы по порядку первичного ключа? А ключ вы выбираете или нет? То есть фильтр по полю наложили - это поле в составе ключа или нет? Если - нет, то понятно, что будет медленно - так это и везде так будет-в любой базе. А если поле есть в ключе- так и работать будет быстро. Или я что-то недопонял? Пока писал, придумал изврат: добавить новое поле в таблицу и вначале ключа поставить новое поле, которое никогда не будет заполняться, а потом уже "Entry No."... Гы, а ведь хоть какое-то решение |
|
08.02.2008, 16:33 | #6 |
Участник
|
Не проще ли скопировать нужные записи во временную таблицу, отфильтровав с нужным ключом, а уже во временной сортировать по первичному?
|
|
08.02.2008, 16:44 | #7 |
Участник
|
|
|
08.02.2008, 16:49 | #8 |
Участник
|
Цитата:
Тоже подумал об этом. Но тогда есть вопрос еще в скорости копирования большого числа записей (Временные таблицы хранятся на клиентской машине) |
|
08.02.2008, 16:51 | #9 |
Участник
|
А тогда записи будут отсортированы по этому полю, а не по первичному ключу! Не катит...
Milk - а решение с фиктивным полем на самом деле классное! Действительно решит проблему. Про то, что нельзя сделать вторичный, начинающийся с первичного - блин как-то не сталкивался ни разу, и не знал про это. Или знал - но забыл... |
|
08.02.2008, 16:52 | #10 |
Участник
|
|
|
08.02.2008, 16:57 | #11 |
Участник
|
Согласен, в некоторых случаях это сработает - если записей отфильтруется немного, допустим, надо отобрать записи по нескольким документам. Но иногда само копирование будет идти очень долго. Я неспроста написал про Аналитические Отчеты - там этот недостаток системы особенно явен. Записи Фин. Книги операций: 1.Фильтруются по некоторму множеству счетов; 2.Фильтруются по значениям некоторых измерений - тут цикл; 3. Начинается поиск в порядке возрастания номера операций внутри цикла. Очень неэффективно.
|
|
08.02.2008, 16:58 | #12 |
Участник
|
|
|
08.02.2008, 17:06 | #13 |
Участник
|
Цитата:
По поводу доп. поля пустого - это не добавить производительности никак. Мне не понятно цель операции в таком случае. |
|
08.02.2008, 21:05 | #14 |
Участник
|
Цитата:
Сообщение от Milk
Вот уже сколько лет занимаюсь Navision, а впервые задумался о такой ситуации.
Допустим, есть очень большая таблица операций. Надо ее обработать следующим образом: наложить фильтр, содержащий больше одного значения, на какое-то поле, а затем пройтись по таблице в порядке ее первичного ключа. Это что же, сделать быстро в принципе невозможно? Код: setcurrentkey(ключ для фильтра) setfilter find('-') setcurrentkey(первичный ключ) find('-') repeat until |
|
11.02.2008, 09:04 | #15 |
Участник
|
ну вообще это конечно вопрос к автору - для чего ему это надо.
Но я бы с ходу придумал бы такой пример: необходимость отследить хронологию ФИФО. Для этого необходимо отфильтровать ТКО по типу "Продажа" (этого в задаче нет - но суть не меняется), затем налоджить фильтр по дате, например с 01.02.08 по 05.02.08. Причем записи должны быть отсортированы по первичному ключу. В результате, если не было нарушений хронологии учета - то все даты в операциях будут возрастать. Более свежая операция - большая дата. А если хронология нарушена - то более свежие даты будут в начале списка, ну или раньше, чем менее свежие даты. |
|
11.02.2008, 10:58 | #16 |
Участник
|
Цитата:
Сообщение от rov
ну вообще это конечно вопрос к автору - для чего ему это надо.
Но я бы с ходу придумал бы такой пример: необходимость отследить хронологию ФИФО. Для этого необходимо отфильтровать ТКО по типу "Продажа" (этого в задаче нет - но суть не меняется), затем налоджить фильтр по дате, например с 01.02.08 по 05.02.08. Цитата:
Причем записи должны быть отсортированы по первичному ключу. В результате, если не было нарушений
хронологии учета - то все даты в операциях будут возрастать. Более свежая операция - большая дата. А если хронология нарушена - то более свежие даты будут в начале списка, ну или раньше, чем менее свежие даты. Во-вторых, корректные нарушения так не выявишь |
|
11.02.2008, 11:56 | #17 |
Участник
|
satir, нет, так систему обмануть не удастся
rov, вообще вопрос возник из очень простой ситуации - после того, как клент поработал с системой несколько лет, решили пользоваться аналитическими отчетами. И стало очевидно, насколько они неоптимально строятся в случае, когда операций миллионы. А вообще можно придумать много ситуаций, когда надо иметь возможность упорядоивать по первичному ключу, при этом наложив сложые фильтры. И ваш пример хорош, или, например, при репликации данных из нескольких баз в одну. RedFox, мне кажется, вы что-то упускаете в обсуждении |
|
11.02.2008, 16:10 | #18 |
Участник
|
Наверное, я не спорю. Но как писал ранее, на SQL-версии это можно было бы сделать путем изменения самого SQL-запроса, который будет генерироваться с участием ORDER BY.
А для "аналитики" я бы вообще использовал бы SnapShot или реплицированную базу, вынесенную на отдельный сервер. |
|
11.02.2008, 16:20 | #19 |
Участник
|
А почему не будет работать варинант, предложенный Сатиром??
<div class='CALtop'>C/AL</div><div class='CAL'>SETCURRENTKEY("Posting Date"); SETRANGE("Posting Date", DateFrom, DateTo); IF NOT ISEMPTY() THEN BEGIN SETCURRENTKEY("Entry No."); IF FIND('-') THEN REPEAT ... UNTIL NEXT = 0; END;</div> Или работать будет, но также медленно?. |
|
11.02.2008, 17:48 | #20 |
Участник
|
RedFox, для SQL такой проблемы, конечно, не существует. На самом деле мне хотелось обсудить теоретический вопрос. Меня удивило, что в возможностях системы ключей такая "дырка"
romeo, да, системе же все равно, что когда-то стоял другой ключ. Она видит текущий фильтр и ключ. И тормозит. |
|