|
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 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
PaulWist, Код: plaintext 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2011, 17:39 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
tanglirPaulWist, Код: plaintext 1. 2.
Ответ принимается. Только Вы всё равно используете JOIN , а Питон33 писал дословно следующее Питон33Мой ответ - не используйте JOIN , а используйте простую и понятную фразу WHERE вот я и хотел посмотреть как он собирается связать две таблы без JOIN ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2011, 08:44 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
PaulWistвот я и хотел посмотреть как он собирается связать две таблы без JOIN Хотел бы я посмотреть на постановку реальной задачи где это твоё извращение понадобится! Если мне надо напечатать ведомость из двух таблиц,то я делаю в 1000 раз проще При формировании ведомости используется куча полей как из f1 так из f2 - Создаём курсор уникальных значений ключа SELECT F1 as Key ; FROM test1 ; UNION ; SELECT F2 as Key ; FROM test1 ; INTO CURSOR keys *UNION без ALL создаёт курсор уникальных значений - то что нам и надо, здесь же можем отсортировать по дате документа SET RELATION TO Key INTO F1, Key INTO F1 *По полям F1,F2 разумеется нужен индекс *Далее формируем отчёт REPORT ... В результате работает в 1000 раз быстрее,так как поля не надо тащить и соединять по UNION из таблиц для ведомости. Поля по SET RELATION вытаскиваются автоматически непосредственно в процессе печати REPORT Работает практически мгновенно. PS. Учиться,Учиться и ещё раз Учиться как и завещал великий Ленин, а сам подох Неучем... ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2011, 17:11 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
Питон33в 1000 раз быстрееБазист нервно курит в сторонке ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2011, 21:56 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
tanglirПитон33в 1000 раз быстрееБазист нервно курит в сторонке Опечатка! Не в 1000, а в 10000 раз! :) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2011, 03:53 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
Питон33Если мне надо напечатать ведомость из двух таблиц,то я делаю в 1000 раз проще Ещё раз. Есть тестовые курсоры Код: plaintext 1. 2. 3. 4. 5. 6.
Есть выборка в результате которой получается курсор из ДВУХ полей и двух записей Код: plaintext 1.
2 Питон33 прошу показать код на фоксе без использовния JOIN в результате которого получится аналогичный курсор, ...естественно этот код должен работать для любого количества записей/полей,... надеюсь данный код не является know how :) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2011, 13:14 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
PaulWist, Ну, так он это и показал уже. Идея заключается в том, что сначала создается специфический курсор-диспетчер, который имеет всего одно поле - ключ. Это поле формируется просто объединением по UNION ключей обоих таблиц. При этом дубли исключаются. Затем по SET RELATION этот курсор-диспетчер связывается с исходными таблицами. Собственно, все. Главной таблицей отчета является этот самый курсор-диспетчер, а данные из основных таблиц подтягиваются в зависимости от того, какая запись связана с главной. В принципе, если отчет не содержит сложных вычислений, вполне себе нормальный способ. Правда, утверждать, что это самый лучший из возможных способов я бы не стал. Имеет как достоинства, так и недостатки. В любом случае, настаивать на том, что Join использовать не надо - глупо. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.07.2011, 14:34 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
ВладимирМНу, так он это и показал уже. Идея заключается в том, что сначала создается специфический курсор-диспетчер, который имеет всего одно поле - ключ. Это поле формируется просто объединением по UNION ключей обоих таблиц. При этом дубли исключаются. Затем по SET RELATION этот курсор-диспетчер связывается с исходными таблицами. Собственно, все. Главной таблицей отчета является этот самый курсор-диспетчер, а данные из основных таблиц подтягиваются в зависимости от того, какая запись связана с главной. ... То что он показал - это один из способов постороения отчёта и это я понял,... я же у него прошу показать код, который без использования Join создал бы аналогичный курсор из двух курсоров, причём только и исключительно используя select c where как он сам писал/утверждал, а это не совсем то, что он "предоставил". ... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2011, 09:18 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
ВладимирМНу, так он это и показал уже. Идея заключается в том, что сначала создается специфический курсор-диспетчер, который имеет всего одно поле - ключ. Это поле формируется просто объединением по UNION ключей обоих таблиц. При этом дубли исключаются. Затем по SET RELATION этот курсор-диспетчер связывается с исходными таблицами. Собственно, все. Главной таблицей отчета является этот самый курсор-диспетчер, а данные из основных таблиц подтягиваются в зависимости от того, какая запись связана с главной. В принципе, если отчет не содержит сложных вычислений, вполне себе нормальный способ. Правда, утверждать, что это самый лучший из возможных способов я бы не стал. Имеет как достоинства, так и недостатки. В любом случае, настаивать на том, что Join использовать не надо - глупо. Всё верно,именно это я и хотел показать,однако должен не согласиться с тем что способ медленный. 1. Данные для формирования отчёта подтягиваются из таблиц и сразу печатаются или заносятся в результирующую таблицу. 2. Сам код выглядит проще и читабельней, за счёт чего отладка проще и ошибки минимизируются,скорость разработки выше. В то время как JOIN работает ещё медленней,да и дров наломать легко. Помните - Хорошая программа не имеет права на ошибку! ... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2011, 14:37 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
Питон332. Сам код выглядит проще и читабельней, за счёт чего отладка проще и ошибки минимизируются,скорость разработки выше. А как насчет сортировки в отчете? Например есть таблица с заголовками накладных (номер, дата, код клиента, сумма) и список клиентов (код, название). Надо вывести отчет с группировкой по именам клиентов, т.е. сортировка должна быть по названию клиента. И как тут просто и понятно написать подготовку исходных данных без селектов с джоинами? Питон33В то время как JOIN работает ещё медленней,да и дров наломать легко. Неадекватный замер, т.к. ты выбираешь не все а только часть результата. Остальная часть подставляется в процессе формирования отчета, т.е. время подготовки результата состоит из двух частей - предвыборка кодов до вывода отчета и довыборка из дочерних таблиц по мере показа отчета. А если отчет не нужен? Например для экспорта куда-либо нужна последующая обработка результата SCAN`ом или COPY TO. Померь время селекта с джоинами и твоего подхода с последующей генерацией DBF или курсора. Удивишься. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2011, 15:05 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
Dima TПитон332. Сам код выглядит проще и читабельней, за счёт чего отладка проще и ошибки минимизируются,скорость разработки выше. А как насчет сортировки в отчете? Например есть таблица с заголовками накладных (номер, дата, код клиента, сумма) и список клиентов (код, название). Надо вывести отчет с группировкой по именам клиентов, т.е. сортировка должна быть по названию клиента. И как тут просто и понятно написать подготовку исходных данных без селектов с джоинами? Питон33В то время как JOIN работает ещё медленней,да и дров наломать легко. Неадекватный замер, т.к. ты выбираешь не все а только часть результата. Остальная часть подставляется в процессе формирования отчета, т.е. время подготовки результата состоит из двух частей - предвыборка кодов до вывода отчета и довыборка из дочерних таблиц по мере показа отчета. А если отчет не нужен? Например для экспорта куда-либо нужна последующая обработка результата SCAN`ом или COPY TO. Померь время селекта с джоинами и твоего подхода с последующей генерацией DBF или курсора. Удивишься. Ещё раз для "особо одарённых" кто читать не умеет: - Создаём курсор уникальных значений ключа SELECT F1 as Key ; FROM test1 ; UNION ; SELECT F2 as Key ; FROM test1 ; INTO CURSOR keys *UNION без ALL создаёт курсор уникальных значений - то что нам и надо, здесь же можем отсортировать по дате документа Когда формируется этот Курсор ключей - можно и отсортировать по любому полю,но сами поля выбирать не нужно. Если использовать Джопы, а потом ещё и SET RELATION,наломать ошибок, потом их выкалупывать - это закончится очередным нытьём на форуме sql.ru Про угробленное время я вообще молчу - Kein Kommentar! ... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2011, 16:38 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
Питон33Если использовать Джо йн ы, а потом ещё и SET RELATION,наломать ошибок, потом их выкалупывать - это закончится очередным нытьём на форуме sql.ru Про угробленное время я вообще молчу - Kein Kommentar! Ну, если после джойнов кто-то ухитряется ещё и сетрелейшен использовать... это да, это сильно Насчёт адекватности замера (вторая часть этого поста 10989816 ) наш анонимус промолчал. Забыл ответить или просто добавить нечего? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2011, 17:03 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
Питон33*UNION без ALL создаёт курсор уникальных значений - то что нам и надо, здесь же можем отсортировать по дате документа Когда формируется этот Курсор ключей - можно и отсортировать по любому полю,но сами поля выбирать не нужно. Только сортировка это не самая быстрая операция. И насчет простоты и читаемости кода я сомневаюсь. Питон33Если использовать Джопы, а потом ещё и SET RELATION,наломать ошибок, потом их выкалупывать SET RELATION зачем вообще использовать? Религия заставляет? SET RELATION очень проблемный в плане использования, забыл отключить и начинаются глюки где-нибудь дальше в коде который проверен-перепроверен, но не предполагает что две таблицы связаны и во второй указатель начинает ездить "сам по себе". PS Если у тебя проблемы с использованием JOIN`ов - фокс тут ни при чем. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2011, 17:33 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
tanglirПитон33Если использовать Джо йн ы, а потом ещё и SET RELATION,наломать ошибок, потом их выкалупывать - это закончится очередным нытьём на форуме sql.ru Про угробленное время я вообще молчу - Kein Kommentar! Ну, если после джойнов кто-то ухитряется ещё и сетрелейшен использовать... это да, это сильно Насчёт адекватности замера (вторая часть этого поста 10989816 ) наш анонимус промолчал. Забыл ответить или просто добавить нечего? Уже ответил на этот вопрос - ORDER BY и SET ORDER TO никто не отменял. А на счёт SET RELATION после Джопов - это вопрос не ко мне а к тому кто рисует Джопы. Не спорю что Джопы это часть мат. аппарата SQL, в математических задачках наверняка пригодится. Пусть делает через джопы, тока потом не ноет что криво работает. В прикладных бухгалтерских и складских задачах проще и понятней делать через SET RELATION. Время надо ценить. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2011, 18:43 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
Питон33А на счёт SET RELATION после Джопов - это вопрос не ко мне а к тому кто рисует Джопы. Те, кто использует Join, как правило вообще не используют SET RELATION. Питон33В прикладных бухгалтерских и складских задачах проще и понятней делать через SET RELATION. Время надо ценить. Лично я считаю наоборот. Одна команда Select-SQL наглядно показывает все взаимосвязи таблиц и никак не влиет на другие рабочие области. Использование SET RELATION - это всегда настройка среды в нескольких местах и при этом надо учитывать возможное влияние подобной настройки на другие модули приложения. С точки зрения отладки, SET RELATION значительно усложняет процесс и Вы теряете время. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.07.2011, 20:11 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
ВладимирМ, SET RELATION только в одном месте, а вычислений бывает - хренова темень. А вот если сделать все вычисления в Джопах, тогда Джопа получится ну просто Огромная. Например надо в зависимости от признаков и типов операций делать анализ - учитывать количество и цену товара или не учитывать. Наворотов целая туча и даю 99.9 % что прога будет меняться. Опять ковыряться в джопах? Гораздо проще сделать один раз SET RELATION и думать только о прикладной задаче. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2011, 07:21 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
Убивал бы своих хомячков за использование "SET RELATION"! Это не только усложняет работу с данными, но и катастрофически замедляет работу системы. К тому же, насчет того, что типа "один раз SET RELATION и думать только о прикладной задаче" - вообще очень мало общего с программированием. Хотя бы потому, что придется постоянно, при каждом обращении к данным, бежать в это самое "один раз определенное" место и смотреть (вспоминать), как же там данные связаны. И если "вдруг" понадобиться новый вид отношений данных - добавлять новое "SET RELATION" - и так до бесконечности... Да, и еще. Видимо, любитель "SET RELATION" никогда в своей жизни не работал с сервером БД, а только с программами, когда базы лежат локально на компе. Ну, максимум - файл-сервер. Хотя даже в случае файл-сервера при "SET RELATION" - таки тормоза более, чем гарантированны... ЗЫ. Вот только не нужно мне рассказывать, как гигабайтные базы тянутся с сервера на локальный комп и потом "SET RELATION" - и как потом все это "быстро" работает... Ибо ТРОЙНОЙ расстрел за такое: загрузка сервера, загрузка сети, лишнее копирование данных на комп пользователя... ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2011, 10:22 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
Питон33ВладимирМ, SET RELATION только в одном месте, а вычислений бывает - хренова темень. А вот если сделать все вычисления в Джопах, тогда Джопа получится ну просто Огромная. У Вас какие-то очень оригинальные представления о джойнах. Какие еще вычисления в джонах? Не из-за этого ли Вы их так не любите? Просто готовить не умеете? Кака обычно мен нравятся такие зантоки от сохи, которые если чем-то не умеют пользоваться, то называют это ненужным,глупым и т.д. Их тесты самые правильные, их выводы самые правильные, а все несогласные - лохи. И их нисколько не смущает вопрос - но ведь зачем то это придумано и где-то это дожно быть очень полезно. Иначе бы этим просто никто бы не пользовался. Питон33, я сильно не прав? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2011, 10:26 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
Sergey SizovПитон33ВладимирМ, SET RELATION только в одном месте, а вычислений бывает - хренова темень. А вот если сделать все вычисления в Джопах, тогда Джопа получится ну просто Огромная. У Вас какие-то очень оригинальные представления о джойнах. Какие еще вычисления в джонах? Не из-за этого ли Вы их так не любите? Просто готовить не умеете? Кака обычно мен нравятся такие зантоки от сохи, которые если чем-то не умеют пользоваться, то называют это ненужным,глупым и т.д. Их тесты самые правильные, их выводы самые правильные, а все несогласные - лохи. И их нисколько не смущает вопрос - но ведь зачем то это придумано и где-то это дожно быть очень полезно. Иначе бы этим просто никто бы не пользовался. Питон33, я сильно не прав? Я понимаю что тебе лень читать. Я привёл конкретный пример и ВладимирМ понял о чём речь. Например есть задача сделать сложный репорт - некую ведомость. Вычисления в ней зависят от значений в связанных справочниках. Создаём курсор ключей, делаем один раз SET RELATION и не нужны ни какие Джопы. Концентрируемся исключительно на прикладной задаче, а не на джопах! Более того с джопами можно наступить на грабли когда значение поля в результате соединения таблиц равно .Null. Джопы удобны в математических задачах, например при работе с массивами. Впрочем мне всё равно как начинающий юзер Banditos собирается использовать фокспро ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2011, 21:44 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
Питон33Концентрируемся исключительно на прикладной задаче, а не на джопах! Более того с джопами можно наступить на грабли когда значение поля в результате соединения таблиц равно .Null. Джопы удобны в математических задачах, например при работе с массивами.Ага, особенно там, где нет массивов. Большей чуши я еще не читал. Математичских! В базах данных! И прикладные задачи состоят нетолько из отчетов. И умение пользоваться троичной логикой тоже вроде не недостаток. Впрочем, эта логика, похоже, для Вас большой темный лес. Ведь может получиться аж сам NULL! Потому джойн и не нравится. Только не надо собственную неспособность понять нечто прикрывать отговорками и поливанием грязью. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2011, 00:33 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
Просто напомню, как всё это было... Питон33 - http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=852767&msg=10989621 В то время как JOIN работает ещё медленней,да и дров наломать легко.Dima T - http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=852767&msg=10989816 Неадекватный замер, т.к. ты выбираешь не все а только часть результата. Остальная часть подставляется в процессе формирования отчета, т.е. время подготовки результата состоит из двух частей - предвыборка кодов до вывода отчета и довыборка из дочерних таблиц по мере показа отчета. А если отчет не нужен? Например для экспорта куда-либо нужна последующая обработка результата SCAN`ом или COPY TO. Померь время селекта с джоинами и твоего подхода с последующей генерацией DBF или курсора. Удивишься.tanglir - http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=852767&msg=10990672 Насчёт адекватности замера (вторая часть этого поста 10989816 ) наш анонимус промолчал. Забыл ответить или просто добавить нечего?Питон33 - http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=852767&msg=10991294 Уже ответил на этот вопрос - ORDER BY и SET ORDER TO никто не отменял. Выводы делайте сами. PS. Джойны, применяемые к массивам... нечто отдалённо похожее было только у Дедала, что как бы намекает нам ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2011, 10:40 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
проходящий.Потому джойн и не нравится. Только не надо собственную неспособность понять нечто прикрывать отговорками и поливанием грязью. 1. Грязью тебя пока ещё никто не поливает,хотя всем давно известно что ты му**к. 2. Join не может нравиться или не нравиться,так как это не девушка. Может ты извращенец? Это многое объясняет 3. Если две таблицы имеют мемо поля - тоже будешь их соединять через Join? Смотри тогда не обкакайся. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2011, 13:34 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
tanglirПросто напомню, как всё это было... PS. Джойны, применяемые к массивам... нечто отдалённо похожее было только у Дедала, что как бы намекает нам Иди в counter strike играйся ебанько. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2011, 13:44 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
Питон33, то есть аргументированно ответить ты не можешь. Ни мне, ни проходящему, да, похоже, вообще никому в этом топике. Ч.т.д. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2011, 14:45 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
Питон33проходящий.Потому джойн и не нравится. Только не надо собственную неспособность понять нечто прикрывать отговорками и поливанием грязью. 3. Если две таблицы имеют мемо поля - тоже будешь их соединять через Join? Смотри тогда не обкакайся. А при чем здесь мемо поля и Join? Они в твоем понимании должны быть как-то связаны? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2011, 14:54 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
IgorNG, может, он имеет в виду джойнить со связью по мемо-полям? Нет, ну я понимаю, что это бред, но единственное объяснение такое: он хотел сказать, что джойнить по мемополям нельзя, а SR-ить можно. Лично я не занимался ни тем, ни другим, так что если кто знает (или у кого есть фокс под рукой) - расскажите, так это или нет? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2011, 15:06 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
tanglirон хотел сказать, что джойнить по мемополям нельзя, а SR-ить можно. Индексы по мемо-полям не создаются, как следствие SR-ить не получиться, а селекты делаются с мемо в JOIN`е. Только зачем такой изврат в реальной жизни? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2011, 15:20 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
Dima T, я тоже не знаю, зачем. Но судя по хелпу, для SR индекс необязателен. Однако о скорости подобного "решения" страшно даже подумать. Особенно если таблицы лежат где-нибудь на шаре. Впрочем, если джойны работают, а SR, даже если и есть, то только без индексов, то это означает, что скорости будут сравнимы, а следовательно, наш герой ещё на шажок приблизился к своему идеалу. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2011, 15:29 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
tanglirНо судя по хелпу, для SR индекс необязателен. Плохо хэлп читал: HELPПеред созданием нового отношения между таблицами, они сначала открываются в разных рабочих областях. Дочерняя таблица должна быть индексирована по общему (для связываемых таблиц) полю, в этом случае выражение связи не является числовым. Индекс для дочерней таблицы может быть либо простым индексом (.idx), или структурированным индексом (.cdx), или любым компактным индексом. Если нужный индекс является компактным, то необходимо его активировать при помощи команды SET ORDER. Примечание Если вы выполняете команду SET RELATION с нечисловым реляционным выражением, а дочерняя таблица - не имеет активного индекса, то система , Visual FoxPro генерирует сообщение об ошибке. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2011, 15:43 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
Dima T, тогда вообще непонятно, зачем Питону33 было заводить этот разговор про мемоджойны. PS. Я в другом хелпе смотрел (первое, что нагуглил), там неоднозначно написано: http://msdn.microsoft.com/en-us/library/aa978414(v=vs.71).aspx Specifies the relational expression that establishes a relationship between the parent and child tables. The relational expression is usually the index expression of the controlling index of the child table.то ли " обычно главный индекс", то ли "обычно индекс". Теперь буду знать. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2011, 15:47 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
tanglirDima T, тогда вообще непонятно, зачем Питону33 было заводить этот разговор про мемоджойны. PS. Я в другом хелпе смотрел (первое, что нагуглил), там неоднозначно написано: http://msdn.microsoft.com/en-us/library/aa978414(v=vs.71).aspx Specifies the relational expression that establishes a relationship between the parent and child tables. The relational expression is usually the index expression of the controlling index of the child table.то ли " обычно главный индекс", то ли "обычно индекс". Теперь буду знать. В дочерней может не быть индекса, тогда родительская должна передавать число, которое означает номер записи в дочерней (RECNO()), т.е. мемо тут никаким боком не приделать. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2011, 15:56 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
IgorNGПитон33пропущено... 3. Если две таблицы имеют мемо поля - тоже будешь их соединять через Join? Смотри тогда не обкакайся. А при чем здесь мемо поля и Join? Они в твоем понимании должны быть как-то связаны? При том что в ведомости бывает надо текст из мемо полей дорисовать. Соединишь то ты таблицы по ключам, но остальные поля включая мемо будут попадать в результат этой Джопы - тянуться из двух таблиц,перезаписываться в новый CURSOR или DBF на диске. Для меня очевидно что это дольше чем простой SET RELATION. Для лохов типа tanglir,Dima T,Banditos это не очевидно ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2011, 16:25 |
|
SQL-запрос: 7-ка делает, а 9-ка виснет. ENGINEBEHAVIOR не помогает... :(
|
|||
---|---|---|---|
#18+
Питон33IgorNGпропущено... А при чем здесь мемо поля и Join? Они в твоем понимании должны быть как-то связаны? При том что в ведомости бывает надо текст из мемо полей дорисовать. Соединишь то ты таблицы по ключам, но остальные поля включая мемо будут попадать в результат этой Джопы - тянуться из двух таблиц,перезаписываться в новый CURSOR или DBF на диске. Для меня очевидно что это дольше чем простой SET RELATION. И что плохого в том что мемо один раз из таблицы прочитается в курсоре закэшируется? Думаешь лучше если оно сначала при предпросмотре отчета по сетке затянется, потом еще раз при печати. Это минимум, если отчет вперед назад не полистают, а то еше при каждом отображении будет тянуть твое мемо с сервера. У файл-сервера самое перегруженное место - трафик между сервером и клиентом, а ты его только увеличиваешь чтобы на клиенте памяти немного сэкономить. Питон33Для лохов типа tanglir,Dima T,Banditos это не очевидно Мальчик, хамить не надо. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2011, 16:56 |
|
|
start [/forum/topic.php?all=1&fid=41&tid=1584261]: |
0ms |
get settings: |
7ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
41ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
76ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 174ms |
0 / 0 |