|  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, да, системе же все равно, что когда-то стоял другой ключ. Она видит текущий фильтр и ключ. И тормозит. | 
|  |