|
|
|
Значение ключа индекса по номеру записи, как?
|
|||
|---|---|---|---|
|
#18+
Чтобы не грузить систему отправляю клиенту (1С , не FoxPro) данные порциями (например по 100 записей). Требуется 100 записей идуших(по возрастанию индекса) за выбранным значением индекса. Напрашивается Select TOP 100, но к сожалению FoxPro в этом случае сначала полностью считывает всю таблицу удовлетворяющую условию WHERE, потом упорядочивает данные, и только потом выдает 100 первых записей - т.е. действует крайне неоптимально. Если же выбирать между двумя фиксированными значениями индекса FoxPro получает данные очень быстро. Т.е. если я знаю значение ключа индекса в N - мне нужно получить значение индекса N+100 записи. P.S>Индексы CDX, сами выражения сложные, например sp1006+DTOS(date)+time+iddoc ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2008, 13:10 |
|
||
|
Значение ключа индекса по номеру записи, как?
|
|||
|---|---|---|---|
|
#18+
Путано как то. На данных покажи. Есть вот то-то, должен получить вот это. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2008, 13:15 |
|
||
|
Значение ключа индекса по номеру записи, как?
|
|||
|---|---|---|---|
|
#18+
Саш, да обычную постраничную выборку товарисч хочет, но свое желание, как обычно :), закамуфлировал так, что не сразу и разберешься. Особенно, опять же :), как обычно :), когда рассказывает не задачу, а выбранный способ решения. Что мешает сделать один раз выборку select ... where into cursor tmpcursor, а затем из этого курсора select ... from tmpcursor where recno() between var1 and var2, где var1 и var2 - номера записей от и до? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2008, 13:21 |
|
||
|
Значение ключа индекса по номеру записи, как?
|
|||
|---|---|---|---|
|
#18+
Sergey Sizov.Саш, да обычную постраничную выборку товарисч хочет, но свое желание, как обычно :), закамуфлировал так, что не сразу и разберешься. Особенно, опять же :), как обычно :), когда рассказывает не задачу, а выбранный способ решения. Что мешает сделать один раз выборку select ... where into cursor tmpcursor, а затем из этого курсора select ... from tmpcursor where recno() between var1 and var2, где var1 и var2 - номера записей от и до? Так как нужно страничную выборку делать в режиме реального времени. Работаю через OLEDB и созданный таким образом курсор не обновляется. Вопрос в заголовке -: есть номер записи, например 1000. Как получить значение ключа индекса в записи номер 1000. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2008, 13:27 |
|
||
|
Значение ключа индекса по номеру записи, как?
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2008, 13:30 |
|
||
|
Значение ключа индекса по номеру записи, как?
|
|||
|---|---|---|---|
|
#18+
kiruha Sergey Sizov.Саш, да обычную постраничную выборку товарисч хочет, но свое желание, как обычно :), закамуфлировал так, что не сразу и разберешься. Особенно, опять же :), как обычно :), когда рассказывает не задачу, а выбранный способ решения. Что мешает сделать один раз выборку select ... where into cursor tmpcursor, а затем из этого курсора select ... from tmpcursor where recno() between var1 and var2, где var1 и var2 - номера записей от и до? Так как нужно страничную выборку делать в режиме реального времени. Работаю через OLEDB и созданный таким образом курсор не обновляется. А это настолько малозначительная информация, что ее не надо было сообщать сразу? Если да, то зачем ее сейчас сообщать? Вопрос в заголовке -: есть номер записи, например 1000. Как получить значение ключа индекса в записи номер 1000. Встать на эту запись и и вычислить выражение ключа. Но полученное значение может повторяться у нескольких записей. Или не может? Еще раз толсто намекну - описывать надо задачу, а не выбранный способ решения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2008, 13:32 |
|
||
|
Значение ключа индекса по номеру записи, как?
|
|||
|---|---|---|---|
|
#18+
kiruhaВопрос в заголовке -: есть номер записи, например 1000. Как получить значение ключа индекса в записи номер 1000. Открыть индексный файл на низком уровне и посмотреть (пройти по В-дереву индексов от корня)... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2008, 13:36 |
|
||
|
Значение ключа индекса по номеру записи, как?
|
|||
|---|---|---|---|
|
#18+
Станислав С...кий 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. Я это сделал (с небольшим поправками на работу с файлами ДБФ) Проблема в вычислении new_key=<выражение для фильтра> Так как индексов и таблиц много - <выражение для фильтра> для всех индексов разное. Только ExecScript ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2008, 13:36 |
|
||
|
Значение ключа индекса по номеру записи, как?
|
|||
|---|---|---|---|
|
#18+
StrIndeks=SYS(14,1,xAlias) NewKey='' EXECSCRIPT('NewKey='+StrIndeks) ?NewKey Только так? Нет методов вычислить значение ключа ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2008, 13:59 |
|
||
|
Значение ключа индекса по номеру записи, как?
|
|||
|---|---|---|---|
|
#18+
kiruha StrIndeks=SYS(14,1,xAlias) NewKey='' EXECSCRIPT('NewKey='+StrIndeks) ?NewKey Только так? Нет методов вычислить значение ключа ? А это не метод? Или он чем-то не нравится? Обычно по значению ищут запись, а не наоборот. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2008, 14:26 |
|
||
|
Значение ключа индекса по номеру записи, как?
|
|||
|---|---|---|---|
|
#18+
Кстати, execscript тут совсем не нужен. Достаточно Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2008, 14:28 |
|
||
|
Значение ключа индекса по номеру записи, как?
|
|||
|---|---|---|---|
|
#18+
Sergey Sizov.Кстати, execscript тут совсем не нужен. Достаточно Код: plaintext 1. Большое спасибо ! :) execscript не нравится, так как пишут что каждый раз идет компиляция скрипта. P.S. Странно, что оптимизцией Select TOP никто не озадачивался. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2008, 14:32 |
|
||
|
Значение ключа индекса по номеру записи, как?
|
|||
|---|---|---|---|
|
#18+
kiruhaP.S. Странно, что оптимизцией Select TOP никто не озадачивался. И из чего вытекает такое утверждение? Он плохо выдает первые записи? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2008, 14:37 |
|
||
|
Значение ключа индекса по номеру записи, как?
|
|||
|---|---|---|---|
|
#18+
Sergey Sizov. kiruhaP.S. Странно, что оптимизцией Select TOP никто не озадачивался. И из чего вытекает такое утверждение? Он плохо выдает первые записи? Да. Если нужно получить 100 последовательных записей(по индексу) из середины таблицы, то по сравнению с выборкой между 2-мя индексными значениями у меня выполнение в несколько сот раз дольше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2008, 14:45 |
|
||
|
Значение ключа индекса по номеру записи, как?
|
|||
|---|---|---|---|
|
#18+
kiruhaЕсли нужно получить 100 последовательных записей(по индексу) из середины таблицы, то по сравнению с выборкой между 2-мя индексными значениями у меня выполнение в несколько сот раз дольше. Каким боком ТОР, то есть ПЕРВЫЕ записи, относится к середине? На каком основании сделано предположение, что ТОР выдернет что-то из середины? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2008, 15:11 |
|
||
|
Значение ключа индекса по номеру записи, как?
|
|||
|---|---|---|---|
|
#18+
Sergey Sizov. kiruhaЕсли нужно получить 100 последовательных записей(по индексу) из середины таблицы, то по сравнению с выборкой между 2-мя индексными значениями у меня выполнение в несколько сот раз дольше. Каким боком ТОР, то есть ПЕРВЫЕ записи, относится к середине? На каком основании сделано предположение, что ТОР выдернет что-то из середины? Например таблица товары. В Grid нужно обновить текущую страницу. Верхняя запись ID=myID По ID построен индекс. Код: plaintext 1. 2. 3. 4. 5. 6. Нужно 100 после 01.01.2007 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2008, 15:36 |
|
||
|
Значение ключа индекса по номеру записи, как?
|
|||
|---|---|---|---|
|
#18+
И что нам этот код должен продемонстрировать? Тем более что из 10 записей 100 не выдернешь. Пояснения будут? ТОР в любом случае выдернет только ПЕРВЫЕ записи, в том порядке, который ЯВНО указан словом ORDER. Select использует индексы не для упорядовчивания. Порядок выдачи записей определяет только ORDER. А уж после чего эти первые записи определяйте в WHERE. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2008, 15:44 |
|
||
|
Значение ключа индекса по номеру записи, как?
|
|||
|---|---|---|---|
|
#18+
Sergey Sizov.И что нам этот код должен продемонстрировать? Тем более что из 10 записей 100 не выдернешь. Пояснения будут? ТОР в любом случае выдернет только ПЕРВЫЕ записи, в том порядке, который ЯВНО указан словом ORDER. Select использует индексы не для упорядовчивания. Порядок выдачи записей определяет только ORDER. А уж после чего эти первые записи определяйте в WHERE. 10 только для примера. Можно написать 100 - сути это не меняет. И в запросе не нужны "первые 100 записей таблицы вообще", а нужны первые 100 записей из записей больших чем myId. Кстати и без условий WHERE запрос будет обрабатываться достаточно долго. Вы может проверить это на любой своей таблице - именно это я и хочу продемонстрировать. Сравнить с аналогом Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2008, 16:06 |
|
||
|
Значение ключа индекса по номеру записи, как?
|
|||
|---|---|---|---|
|
#18+
kiruhaИ в запросе не нужны "первые 100 записей таблицы вообще", а нужны первые 100 записей из записей больших чем myId. Ну и где запрос на выбор записей с id больших чем myId? Это во-первых. Во-вторых, начинать надо с самых больших? С самых меньших? С каких? Кстати и без условий WHERE запрос будет обрабатываться достаточно долго. Вы может проверить это на любой своей таблице - именно это я и хочу продемонстрировать. А почему запрос без wherе должен обрабатываться быстро? Чем больше записей, для отбора которых нет подходящих индексов, тем больше времени надо на перебор таких записей? Что тут необычного? У меня появилось предположение, что Вы считаете, что TOP и индексы как-то связаны. Если так, то это глубокое заблуждение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2008, 16:16 |
|
||
|
Значение ключа индекса по номеру записи, как?
|
|||
|---|---|---|---|
|
#18+
Sergey Sizov. Ну и где запрос на выбор записей с id больших чем myId? Это во-первых. Во-вторых, начинать надо с самых больших? С самых меньших? С каких? Запрос был приведен : Код: plaintext 1. 2. 3. 4. 5. 6. ORDER BY отрабатывается после WHERE, а не до. Sergey Sizov. У меня появилось предположение, что Вы считаете, что TOP и индексы как-то связаны. Если так, то это глубокое заблуждение. Да, я ожидал что драйвер сообразит использовать индекс в этом случае. Увы. Поэтому и завел ветку - теперь после нахождения myId1 и myId2 в процедуре - он отрабатывается достаточно быстро. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2008, 16:28 |
|
||
|
Значение ключа индекса по номеру записи, как?
|
|||
|---|---|---|---|
|
#18+
Вы наступили на стандартные грабли, посчитав индексирование и сортировку идентичными понятиями. А это не так, особенно для SQL команд. В SQL командах индексы используются для отбора записей, а не для их сортировки. Именно поэтому ТОР не имеет никакого отношения к индексу и не может в принципе выдавать записи в порядке индекса. Порядок выдачи записей определяется только и исключительно клаузой ORDER. Вот она может (но не обязана) воспользоваться подходящим индексом, но только для сортировки, без которой в этом случае не обойтись. При чем сортировки всего, что попало под условие отбора. ТОР к условиям отбора не относится. ТОР без ORDER смысла не имеет, так как нет порядка и, соответственно, нет точки от которой считать, невозможно определить какая запись первая, какая последняя. Кстати, сами понятия номер записи/первый/последний/предыдущий/последующий без ORDER опять же не существуют. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2008, 16:53 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=35235815&tid=1587932]: |
0ms |
get settings: |
12ms |
get forum list: |
21ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
79ms |
get topic data: |
14ms |
get forum data: |
4ms |
get page messages: |
83ms |
get tp. blocked users: |
2ms |
| others: | 229ms |
| total: | 454ms |

| 0 / 0 |
