|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
Я чего-то не понимаю... Нижеприведённые 2 запроса VFP7 выполняет, даже не зажмурившись, а вот 9-ка - увы, почти виснет на втором запросе. Причём, при любой установке SET ENGINEBEHAVIOR: Код: plaintext 1. 2. 3.
Я решил, было, что 9-ка не умеет быстро делать нужную по ходу запроса индексацию по конкатенированным полям, и попробовал облегчённый вариант: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
Или, может, для vfp9 надо такой запрос как-то модифицировать? Посмотрите, пожалуйста. Уменьшеный DBF-ник прилагаю в архиве. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2011, 23:38 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
Сорри, ни зип, ни рар архив почему-то сразу не прикладывается... Хотя - всего 112 кБ... ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2011, 23:44 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
Гость12, а зачем это извращение с ON ALLTRIM(STR(a.abcount))+'^'+ALLTRIM(STR(a.vag))=ALLTRIM(STR(b.abcount))+'^'+ALLTRIM(STR(b.vag))? Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2011, 23:58 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
Нашёл объяснение такому приколу. Привожу здесь, может, кто-нибудь ещё с такими граблями столкнётся. Дело в том, что, видимо, vfp9 в отличие от vpf7, не умеет строить индексы по вычисляемым строчным полям, имеющим неопределённый размер. Поэтому для 9-ки пришлось 2-й запрос изменить, слегка модифицировав условие объединения: Код: plaintext 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2011, 00:04 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
Проходящий, может, вы и правы насчёт извращения, но сути вопроса это не снимает: фиксированная длина сравниваемых строк, выходит, иногда очень важна для 9-ки. В то время, как 7-ка - легко обходится без подобных условностей и поклонов. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2011, 00:08 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
Гость12Проходящий, может, вы и правы насчёт извращения, но сути вопроса это не снимает: фиксированная длина сравниваемых строк, выходит, иногда очень важна для 9-ки. В то время, как 7-ка - легко обходится без подобных условностей и поклонов.Не пишите ерудны. Дело совсем не в фиксированности строк. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2011, 00:10 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
А в чём? В приведённых выше кодах как раз разница и заключается в применении PADR(), которая и даёт фиксированную длину. Ну, или изложите подробней, в чём же тогда разница. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2011, 00:17 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
Гость12А в чём? В приведённых выше кодах как раз разница и заключается в применении PADR(), которая и даёт фиксированную длину. Ну, или изложите подробней, в чём же тогда разница.Для начала сравните установки Set ansi. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2011, 12:42 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
To Sergey Sizov: Не, такие азы я сразу проверил: и в 7-ке, и в 9-ке установлено всё одинаково - SET ANSI off, и, кроме того - SET EXACT off Но оба фокса, всё-таки видать, по-разному реагируют на строчные команды, оперирующие с неявной длиной строк. Конечно, я не знаток и могу судить поверхностно, но уж слишком явное отличие в работе команд с PADR()-ом и без него в этих двух версиях Фокса. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2011, 16:46 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
FoxPro не создает индексы с перменной длиной ключа. Просто не может. Ни в какой версии. Вы создали условие объединения именно по переменной длине ключа. Каким образом следует сопоставлять подобные выражения? Возможны два варианта: 1. Отсекаем/дополняем выражения до некоторой фиксированной длины, строим временный индекс по этой фиксированной длине и сравниваем значения ключей 2. Никаких индексов не строим и сравниваем ключи "как есть" Естесственно, в первом случае мы рискуем получить не вполне корректные данные за счет того, что выражение ключа временной индекса не соответствует реальным сравниваемым значениям. Ну, например, простейший вопрос: а до какой длины надо дополнить или отсечь значение ключа? Скорее всего, по значению первой попавшейся записи, иначе прежде, чем создать индекс придется просканировать обе таблицы на предмет максимальной длины полученного выражения. И если выражение в первой попавшейся записи окажется, скажем, длиной 3 символа, то не понятно, что Вы вообще получите в результирующей выборке! Если бы Вы использовали функцию SYS(3054), то увидели бы, что при фиксированном значение длины полученного выражения строится временный индекс, а при переменном, объединение выполняется по принципу "Cartesian products", т.е. "тупое" сканирование всех записей, что дает необходимость просканировать 1000*1000 = 1 000 000 записей. Что без индекса выполняется ОЧЕНЬ медленно. Другими словами VFP9 поступил абсолютно правильно, не став создавать временный индекс. Ну, а тот факт, что при этом время выполнения подобного запроса увеличилось на порядки, должно было Вам подсказать, что само условие объединения не корректно. В ранних версиях FoxPro (VFP7) результат подобной выборки будет сомнителен. Неизвестно ведь, какое выражение ключа окажется у временного индекса. В смысле, сколько символов. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2011, 16:23 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
ВладимирМ, Для быстрого поиска важно чтобы было оптимизированное выражение для рашмора. Выражение будет Оптимизировано если левая часть от оператора "=" будет такая как при создании индекса, а правая пофиг. Вот тогда будет летать. И потом я не люблю все эти Джойны, не проще ли юзать фразу WHERE? Иногда два последовательных селекта подряд работают быстрее одного закрученного в бараний рог. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2011, 18:55 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
Горе от ума... зачем так усложнять? Ежу же понятно, что с числами легче работать чем со строками. По-моему нужно больше искать ошибки в своих кодах, чем в чужих. А что Вы там учитываете, если не секрет, если Вам 50 разрядов нужно для хранения 10-ричного числа? (Я даже боюсь представить сколько это бит) очень смахивает на учёт молекул... или атомов... а может элементарных частиц? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2011, 23:22 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
Питон33ВладимирМ, Для быстрого поиска важно чтобы было оптимизированное выражение для рашмора.Выражение будет Оптимизировано если левая часть от оператора "=" будет такая как при создании индекса, а правая пофиг. Вот тогда будет летать. Ну, для начала, в SQL-запросах не имеет значения "справа" или "слева" стоит выражение. Вы путаете SET ANSI и SET EXACT. Они похожи, но отличие как раз в том и заключается, что для SET EXACT важно положение "справа" или "слева", а для SET ANSI - нет. Кроме того, наличие индекса по обоим выражениям все-таки имеет значение. Другой вопрос, какой из них будет использоваться и будет ли использоваться вообще, зависит от конкретного запроса. И еще, Вы собственно вопрос автора темы читали? Какое отношение это все имеет к заданному автором темы вопросу? В данном случае индекса нет вообще. FoxPro создает временный индекс. Но! По использованному выражению в условиях объединения построить корректное выражение ключа для временного индекса нельзя (точнее, быстро нельзя). Как следствие, VFP9 и не пытается. Отсюда - тормоза. Ранние версии FoxPro строят-таки временный индекс, но не факт, что значение его ключа будет корректно. Как следствие, не факт, что результат выборки будет корректным. Питон33И потом я не люблю все эти Джойны, не проще ли юзать фразу WHERE? Нет. Не проще. Во-первых, объединение двух таблиц (Join) и фильтрация записей одной таблицы (Where) - это все-таки разные процессы. И первое, что делает анализатор запроса это как раз и пытается отделить одно от другого. То, что Вам кажется "одинаковым" на самом деле таковым не является. SYS(3054,11) - это четко показывает Во-вторых, реализовать внешнее объединение (Left, Right, Full) только через Where - невозможно в принципе. Придется делать объединение по UNION. Питон33Иногда два последовательных селекта подряд работают быстрее одного закрученного в бараний рог. Да. Конечно. Только ключевое слово здесь "иногда". А, кроме того, опять же, какое это имеет отношение к данному запросу? Вполне себе примитивному, если не считать совершенно бессмысленного усложнения условия объединения? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2011, 13:00 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
ВладимирМНу, для начала, в SQL-запросах не имеет значения "справа" или "слева" стоит выражение. Вы путаете SET ANSI и SET EXACT. В SQL запросе ВСЁ имеет значение. Чтобы запрос был оптимизирован механизмом Rushmore, юзер обязан слева от знака "=" написать Поле базы, а справа Выражение. ВладимирМ, начните изучение Foxpro с версии 2.5, тогда у вас в голове наконец появится ясное представление об оптимизации Rushmore. Чтобы проверить - достаточно создать таблицу из миллиона записей и проиндексировать её по текстовому полю. ВладимирМ, не забывайте про Rushmore даже когда вы спите! :)) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.06.2011, 15:57 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
Питон33ВладимирМНу, для начала, в SQL-запросах не имеет значения "справа" или "слева" стоит выражение. Вы путаете SET ANSI и SET EXACT. В SQL запросе ВСЁ имеет значение. Чтобы запрос был оптимизирован механизмом Rushmore, юзер обязан слева от знака "=" написать Поле базы, а справа Выражение. ВладимирМ, начните изучение Foxpro с версии 2.5, тогда у вас в голове наконец появится ясное представление об оптимизации Rushmore. Чтобы проверить - достаточно создать таблицу из миллиона записей и проиндексировать её по текстовому полю. ВладимирМ, не забывайте про Rushmore даже когда вы спите! :)) Долго же Вы собирались с ответом, чтобы просто поиграть словами Почти месяц. При этом так и не удосужившись прочитать исходный вопрос автора темы. Автора не интересуют советы "общего" плана. У него вполне конкретный вопрос с просьбой объяснить конкретную "непонятку". Почему вот в этих условиях есть ускорение, а вот в этих - нет. Ваш совет просто "не по делу". А значит, скорее всего, будет просто проигнорирован автором темы. Это при условии, что он вообще все еще посещает данный форум, что весьма сомнительно. Скорее всего, "сдал и забыл"... ... |
|||
:
Нравится:
Не нравится:
|
|||
12.06.2011, 18:04 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
ВладимирМ, Ответ был по делу и поможет в 100% случаев решить проблему. Мой ответ - не используйте JOIN, а используйте простую и понятную фразу WHERE. Работает быстрее благодаря Rushmore и ошибки в программе минимизируются за счёт читабельности кода. Ещё совет - слева пишите всегда Поле, по которому создан Индекс, а справа Выражение (может быть другим полем к примеру). Joinы вообще придумали для совместимости со стандартом SQL, но команда SELELECT SQL была у фокса ещё со времён революции. Хотите - пишите Joinы, только потом не спрашивайте шо за херня, да шо цэ такэ и чаго хохлы в НАТО поИхалы :) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.06.2011, 18:56 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
Питон33Ответ был по делу и поможет в 100% случаев решить проблему. Какую проблему-то? Вопрос автора темы звучит так: Есть запрос. В VFP7 он оптимизируется, в VFP9 - нет. Почему? Если отбросить "словесный мусор", то Ваш ответ звучит так: Понятия не имею и нет никакого желания разбираться. Но промолчать не могу, поэтому выслушайте "прогноз погоды" PS: Если Вы до сих пор не поняли, что такое JOIN и как его использовать, то это Ваша беда. И тут вовсе нечем хвалится. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.06.2011, 11:03 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
ВладимирМ, я предпочитаю WHERE и UNION. Работает быстро и без ошибок. А вы ковыряйтесь в Джопах хоть до посинения ... |
|||
:
Нравится:
Не нравится:
|
|||
14.06.2011, 10:48 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
Питон33ВладимирМ, я предпочитаю WHERE и UNION. Работает быстро и без ошибок. А вы ковыряйтесь в Джопах хоть до посинения Т.е. утверждаете что при связывании JOIN технология Rushmore не используеться ? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2011, 12:09 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
> Автор: Olaf_K > Т.е. утверждаете ... ? Он ничего не утверждает, он просто тролит Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
17.06.2011, 17:40 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
Olaf_K, похоже что в join оптимизация ограничено работает, самому еще пару лет назад пришлось переписать запросы на where при переходе на 9-ку с 7-ки. таблицы использовались из под приложения для fox2.5dos ... |
|||
:
Нравится:
Не нравится:
|
|||
23.06.2011, 15:44 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
valera_k2000Olaf_K, похоже что в join оптимизация ограничено работает, самому еще пару лет назад пришлось переписать запросы на where при переходе на 9-ку с 7-ки. таблицы использовались из под приложения для fox2.5dos Правильно сделал. фраза where работает как часы. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.07.2011, 12:56 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
Питон33Мой ответ - не используйте JOIN, а используйте простую и понятную фразу WHERE. Работает быстрее благодаря Rushmore и ошибки в программе минимизируются за счёт читабельности кода. 2 Питон33 Ну ка изобразите на тестовых данных как будет выглядеть select с where, что бы получить аналогичный результат Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2011, 14:52 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
PaulWist, 10808560 - как и в майскуле - имитация фуллджойна через юнион. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2011, 16:32 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
tanglirPaulWist, 10808560 - как и в майскуле - имитация фуллджойна через юнион. Э-э-э, а код на фоксе можно привести для приведённох курсоров? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2011, 16:51 |
|
|
start [/forum/topic.php?fid=41&msg=37273008&tid=1584261]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
189ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
2ms |
others: | 17ms |
total: | 316ms |
0 / 0 |