Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Значение ключа индекса по номеру записи, как? / 21 сообщений из 21, страница 1 из 1
04.04.2008, 13:10
    #35235643
kiruha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение ключа индекса по номеру записи, как?
Чтобы не грузить систему отправляю клиенту (1С , не FoxPro) данные порциями (например по 100 записей). Требуется 100 записей идуших(по возрастанию индекса) за выбранным значением индекса.

Напрашивается Select TOP 100, но к сожалению FoxPro в этом случае сначала полностью
считывает всю таблицу удовлетворяющую условию WHERE, потом упорядочивает данные,
и только потом выдает 100 первых записей - т.е. действует крайне неоптимально.

Если же выбирать между двумя фиксированными значениями индекса FoxPro получает данные
очень быстро. Т.е. если я знаю значение ключа индекса в N - мне нужно получить значение индекса N+100 записи.

P.S>Индексы CDX, сами выражения сложные, например sp1006+DTOS(date)+time+iddoc
...
Рейтинг: 0 / 0
04.04.2008, 13:15
    #35235660
AleksMed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение ключа индекса по номеру записи, как?
Путано как то. На данных покажи. Есть вот то-то, должен получить вот это.
...
Рейтинг: 0 / 0
04.04.2008, 13:21
    #35235689
Sergey Sizov.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение ключа индекса по номеру записи, как?
Саш, да обычную постраничную выборку товарисч хочет, но свое желание, как обычно :), закамуфлировал так, что не сразу и разберешься. Особенно, опять же :), как обычно :), когда рассказывает не задачу, а выбранный способ решения.
Что мешает сделать один раз выборку select ... where into cursor tmpcursor, а затем из этого курсора select ... from tmpcursor where recno() between var1 and var2, где var1 и var2 - номера записей от и до?
...
Рейтинг: 0 / 0
04.04.2008, 13:27
    #35235707
kiruha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение ключа индекса по номеру записи, как?
Sergey Sizov.Саш, да обычную постраничную выборку товарисч хочет, но свое желание, как обычно :), закамуфлировал так, что не сразу и разберешься. Особенно, опять же :), как обычно :), когда рассказывает не задачу, а выбранный способ решения.
Что мешает сделать один раз выборку select ... where into cursor tmpcursor, а затем из этого курсора select ... from tmpcursor where recno() between var1 and var2, где var1 и var2 - номера записей от и до?

Так как нужно страничную выборку делать в режиме реального времени.
Работаю через OLEDB и созданный таким образом курсор не обновляется.

Вопрос в заголовке -: есть номер записи, например 1000.
Как получить значение ключа индекса в записи номер 1000.
...
Рейтинг: 0 / 0
04.04.2008, 13:30
    #35235720
Значение ключа индекса по номеру записи, как?
kiruhaЧтобы не грузить систему отправляю клиенту (1С , не FoxPro) данные порциями (например по 100 записей). Требуется 100 записей идуших(по возрастанию индекса) за выбранным значением индекса.

Напрашивается Select TOP 100, но к сожалению FoxPro в этом случае сначала полностью
считывает всю таблицу удовлетворяющую условию WHERE, потом упорядочивает данные,
и только потом выдает 100 первых записей - т.е. действует крайне неоптимально.

Если же выбирать между двумя фиксированными значениями индекса FoxPro получает данные
очень быстро. Т.е. если я знаю значение ключа индекса в N - мне нужно получить значение индекса N+100 записи.

P.S>Индексы CDX, сами выражения сложные, например sp1006+DTOS(date)+time+iddoc
В этом случае надо делать перемещение по индексу (остальные "шероховатости" Фокс возьмет на себя):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
set order to tag <YourTag>
new_key=<your Key>
if seek(new_key)
do while(!EOF(<your table>)) && Или другое условие, соответствующее Вашей задаче
 for i=  1  to  100 
  <write record to output file>  
  skip  1 
  if EOF(<your table>)
     exit
  endif
 endfor
 new_key=<выражение для фильтра>
<создаем новый файл или ожидаем ответ об успешности передачи порции данных>
enddo
endif
...
Рейтинг: 0 / 0
04.04.2008, 13:32
    #35235726
Sergey Sizov.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение ключа индекса по номеру записи, как?
kiruha Sergey Sizov.Саш, да обычную постраничную выборку товарисч хочет, но свое желание, как обычно :), закамуфлировал так, что не сразу и разберешься. Особенно, опять же :), как обычно :), когда рассказывает не задачу, а выбранный способ решения.
Что мешает сделать один раз выборку select ... where into cursor tmpcursor, а затем из этого курсора select ... from tmpcursor where recno() between var1 and var2, где var1 и var2 - номера записей от и до?

Так как нужно страничную выборку делать в режиме реального времени.
Работаю через OLEDB и созданный таким образом курсор не обновляется.

А это настолько малозначительная информация, что ее не надо было сообщать сразу? Если да, то зачем ее сейчас сообщать?

Вопрос в заголовке -: есть номер записи, например 1000.
Как получить значение ключа индекса в записи номер 1000.
Встать на эту запись и и вычислить выражение ключа. Но полученное значение может повторяться у нескольких записей. Или не может?

Еще раз толсто намекну - описывать надо задачу, а не выбранный способ решения.
...
Рейтинг: 0 / 0
04.04.2008, 13:36
    #35235739
Значение ключа индекса по номеру записи, как?
kiruhaВопрос в заголовке -: есть номер записи, например 1000.
Как получить значение ключа индекса в записи номер 1000.
Открыть индексный файл на низком уровне и посмотреть (пройти по В-дереву индексов от корня)...
...
Рейтинг: 0 / 0
04.04.2008, 13:36
    #35235742
kiruha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение ключа индекса по номеру записи, как?
Станислав С...кий kiruhaЧтобы не грузить систему отправляю клиенту (1С , не FoxPro) данные порциями (например по 100 записей). Требуется 100 записей идуших(по возрастанию индекса) за выбранным значением индекса.

Напрашивается Select TOP 100, но к сожалению FoxPro в этом случае сначала полностью
считывает всю таблицу удовлетворяющую условию WHERE, потом упорядочивает данные,
и только потом выдает 100 первых записей - т.е. действует крайне неоптимально.

Если же выбирать между двумя фиксированными значениями индекса FoxPro получает данные
очень быстро. Т.е. если я знаю значение ключа индекса в N - мне нужно получить значение индекса N+100 записи.

P.S>Индексы CDX, сами выражения сложные, например sp1006+DTOS(date)+time+iddoc
В этом случае надо делать перемещение по индексу (остальные "шероховатости" Фокс возьмет на себя):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
set order to tag <YourTag>
new_key=<your Key>
if seek(new_key)
do while(!EOF(<your table>)) && Или другое условие, соответствующее Вашей задаче
 for i=  1  to  100 
  <write record to output file>  
  skip  1 
  if EOF(<your table>)
     exit
  endif
 endfor
 new_key=<выражение для фильтра>
<создаем новый файл или ожидаем ответ об успешности передачи порции данных>
enddo
endif


Я это сделал (с небольшим поправками на работу с файлами ДБФ)
Проблема в вычислении
new_key=<выражение для фильтра>
Так как индексов и таблиц много - <выражение для фильтра> для всех индексов разное.
Только ExecScript ?
...
Рейтинг: 0 / 0
04.04.2008, 13:59
    #35235815
kiruha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение ключа индекса по номеру записи, как?
StrIndeks=SYS(14,1,xAlias)
NewKey=''
EXECSCRIPT('NewKey='+StrIndeks)
?NewKey

Только так?
Нет методов вычислить значение ключа ?
...
Рейтинг: 0 / 0
04.04.2008, 14:26
    #35235917
Sergey Sizov.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение ключа индекса по номеру записи, как?
kiruha StrIndeks=SYS(14,1,xAlias)
NewKey=''
EXECSCRIPT('NewKey='+StrIndeks)
?NewKey

Только так?
Нет методов вычислить значение ключа ?
А это не метод? Или он чем-то не нравится? Обычно по значению ищут запись, а не наоборот.
...
Рейтинг: 0 / 0
04.04.2008, 14:28
    #35235928
Sergey Sizov.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение ключа индекса по номеру записи, как?
Кстати, execscript тут совсем не нужен. Достаточно
Код: plaintext
1.
NewKey = evaluate(SYS( 14 , 1 ,xAlias))
?NewKey
...
Рейтинг: 0 / 0
04.04.2008, 14:32
    #35235946
kiruha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение ключа индекса по номеру записи, как?
Sergey Sizov.Кстати, execscript тут совсем не нужен. Достаточно
Код: plaintext
1.
NewKey = evaluate(SYS( 14 , 1 ,xAlias))
?NewKey


Большое спасибо ! :)
execscript не нравится, так как пишут что каждый раз идет компиляция скрипта.

P.S. Странно, что оптимизцией Select TOP никто не озадачивался.
...
Рейтинг: 0 / 0
04.04.2008, 14:37
    #35235966
Sergey Sizov.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение ключа индекса по номеру записи, как?
kiruhaP.S. Странно, что оптимизцией Select TOP никто не озадачивался.
И из чего вытекает такое утверждение? Он плохо выдает первые записи?
...
Рейтинг: 0 / 0
04.04.2008, 14:45
    #35235993
kiruha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение ключа индекса по номеру записи, как?
Sergey Sizov. kiruhaP.S. Странно, что оптимизцией Select TOP никто не озадачивался.
И из чего вытекает такое утверждение? Он плохо выдает первые записи?

Да.
Если нужно получить 100 последовательных записей(по индексу) из середины
таблицы, то по сравнению с выборкой между 2-мя индексными значениями
у меня выполнение в несколько сот раз дольше.
...
Рейтинг: 0 / 0
04.04.2008, 15:11
    #35236076
Sergey Sizov.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение ключа индекса по номеру записи, как?
kiruhaЕсли нужно получить 100 последовательных записей(по индексу) из середины
таблицы, то по сравнению с выборкой между 2-мя индексными значениями
у меня выполнение в несколько сот раз дольше.
Каким боком ТОР, то есть ПЕРВЫЕ записи, относится к середине? На каком основании сделано предположение, что ТОР выдернет что-то из середины?
...
Рейтинг: 0 / 0
04.04.2008, 15:36
    #35236210
kiruha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение ключа индекса по номеру записи, как?
Sergey Sizov. kiruhaЕсли нужно получить 100 последовательных записей(по индексу) из середины
таблицы, то по сравнению с выборкой между 2-мя индексными значениями
у меня выполнение в несколько сот раз дольше.
Каким боком ТОР, то есть ПЕРВЫЕ записи, относится к середине? На каком основании сделано предположение, что ТОР выдернет что-то из середины?

Например таблица товары.
В Grid нужно обновить текущую страницу.
Верхняя запись ID=myID
По ID построен индекс.
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT TOP  10 
		Товары.Descr AS Наименование
	 FROM
		SC33 as Товары
        WHERE Товары.ID>myID
	ORDER BY Товары.ID
Или пользователь просматривает доументы за прошлый год.
Нужно 100 после 01.01.2007
...
Рейтинг: 0 / 0
04.04.2008, 15:44
    #35236238
Sergey Sizov.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение ключа индекса по номеру записи, как?
И что нам этот код должен продемонстрировать? Тем более что из 10 записей 100 не выдернешь. Пояснения будут?

ТОР в любом случае выдернет только ПЕРВЫЕ записи, в том порядке, который ЯВНО указан словом ORDER. Select использует индексы не для упорядовчивания. Порядок выдачи записей определяет только ORDER. А уж после чего эти первые записи определяйте в WHERE.
...
Рейтинг: 0 / 0
04.04.2008, 16:06
    #35236336
kiruha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение ключа индекса по номеру записи, как?
Sergey Sizov.И что нам этот код должен продемонстрировать? Тем более что из 10 записей 100 не выдернешь. Пояснения будут?

ТОР в любом случае выдернет только ПЕРВЫЕ записи, в том порядке, который ЯВНО указан словом ORDER. Select использует индексы не для упорядовчивания. Порядок выдачи записей определяет только ORDER. А уж после чего эти первые записи определяйте в WHERE.

10 только для примера. Можно написать 100 - сути это не меняет.
И в запросе не нужны "первые 100 записей таблицы вообще", а нужны первые 100 записей
из записей больших чем myId.

Кстати и без условий WHERE запрос будет обрабатываться достаточно долго.
Вы может проверить это на любой своей таблице - именно это я и хочу продемонстрировать.

Сравнить с аналогом
Код: plaintext
1.
2.
3.
4.
5.
SELECT 
		Товары.Descr AS Наименование
	 FROM
		SC33 as Товары
        WHERE Товары.ID BETWEEN myID1 AND myID2
...
Рейтинг: 0 / 0
04.04.2008, 16:16
    #35236384
Sergey Sizov.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение ключа индекса по номеру записи, как?
kiruhaИ в запросе не нужны "первые 100 записей таблицы вообще", а нужны первые 100 записей
из записей больших чем myId.

Ну и где запрос на выбор записей с id больших чем myId? Это во-первых. Во-вторых, начинать надо с самых больших? С самых меньших? С каких?

Кстати и без условий WHERE запрос будет обрабатываться достаточно долго.
Вы может проверить это на любой своей таблице - именно это я и хочу продемонстрировать.

А почему запрос без wherе должен обрабатываться быстро? Чем больше записей, для отбора которых нет подходящих индексов, тем больше времени надо на перебор таких записей? Что тут необычного?

У меня появилось предположение, что Вы считаете, что TOP и индексы как-то связаны. Если так, то это глубокое заблуждение.
...
Рейтинг: 0 / 0
04.04.2008, 16:28
    #35236446
kiruha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение ключа индекса по номеру записи, как?
Sergey Sizov.
Ну и где запрос на выбор записей с id больших чем myId? Это во-первых. Во-вторых, начинать надо с самых больших? С самых меньших? С каких?

Запрос был приведен :
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT TOP  100 
	Товары.Descr AS Наименование
FROM
		SC33 as Товары
WHERE Товары.ID>myID
ORDER BY Товары.ID
Работает 6 месяцев без проблем (по верности результата, а не скорости выполнения).
ORDER BY отрабатывается после WHERE, а не до.

Sergey Sizov.
У меня появилось предположение, что Вы считаете, что TOP и индексы как-то связаны. Если так, то это глубокое заблуждение.
Да, я ожидал что драйвер сообразит использовать индекс в этом случае.
Увы. Поэтому и завел ветку - теперь после нахождения myId1 и myId2 в процедуре -
он отрабатывается достаточно быстро.
...
Рейтинг: 0 / 0
04.04.2008, 16:53
    #35236561
Sergey Sizov.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Значение ключа индекса по номеру записи, как?
Вы наступили на стандартные грабли, посчитав индексирование и сортировку идентичными понятиями. А это не так, особенно для SQL команд.
В SQL командах индексы используются для отбора записей, а не для их сортировки. Именно поэтому ТОР не имеет никакого отношения к индексу и не может в принципе выдавать записи в порядке индекса. Порядок выдачи записей определяется только и исключительно клаузой ORDER. Вот она может (но не обязана) воспользоваться подходящим индексом, но только для сортировки, без которой в этом случае не обойтись. При чем сортировки всего, что попало под условие отбора. ТОР к условиям отбора не относится. ТОР без ORDER смысла не имеет, так как нет порядка и, соответственно, нет точки от которой считать, невозможно определить какая запись первая, какая последняя. Кстати, сами понятия номер записи/первый/последний/предыдущий/последующий без ORDER опять же не существуют.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Значение ключа индекса по номеру записи, как? / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]