|
|
|
Медленная работа Select
|
|||
|---|---|---|---|
|
#18+
Уважаемые коллеги! Select отбирает данные порядка 10 секунд. Код: plaintext 1. 2. 3. 4. 5. 6. Не могу разобраться почему так долго выполняется Select, по идее он должен пулей пролетать. Может у вас есть мысли по этому поводу. P.S. Если будут вопросы к сожалению смогу ответить только в Понедельник (28.11.05) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2005, 16:30:36 |
|
||
|
Медленная работа Select
|
|||
|---|---|---|---|
|
#18+
Создать индексы Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2005, 16:52:15 |
|
||
|
Медленная работа Select
|
|||
|---|---|---|---|
|
#18+
наверна функции по полям не надо использовать, т.е. WHERE Pl.god=FGOD AND ; Pl.mes = alltrim(str(fmes,10x,0)) AND ; Pl.sh == TB.sh AND ; Pl.idnompol#0 and Pl.idnompl#0 and Pl.shb = .T.; Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2005, 17:51:13 |
|
||
|
Медленная работа Select
|
|||
|---|---|---|---|
|
#18+
Спасибо за совет PaulWist . Попробую создать дополнительные Тэги специально для запроса. Но я как то экспереминтировал на таблице с 50000 записей(справочник автозапчастей). Так вот есть индексы или их нет скорость отличалась не очень сильно (точнее не скажу). Правда там таблица лежала локально и открывалась Эксклюзивно. Для 1024 -> К сожалению изначально Where так и выглядел как вы написали. Переработка в приведенный мной вид быстродействие не увеличила. PS - непонял что значит 10x в STR - может просто 10 наверно описка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2005, 21:00:57 |
|
||
|
Медленная работа Select
|
|||
|---|---|---|---|
|
#18+
Что бы определить уровень оптимизации включи SYS(3054,11) - эта ф-ия покажет какие индексы используются для поиска, желательно добиться слова FULL, отсюда танцуй добиваясь оптимизации запроса ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2005, 09:32:02 |
|
||
|
Медленная работа Select
|
|||
|---|---|---|---|
|
#18+
PaulWist Спасибо буду пробовать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2005, 11:56:03 |
|
||
|
Медленная работа Select
|
|||
|---|---|---|---|
|
#18+
PaulWist Спасибо теперь время обработки 0 секунд. создал именно тэги как в запросе. Оптимизация FULL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2005, 14:04:20 |
|
||
|
Медленная работа Select
|
|||
|---|---|---|---|
|
#18+
PaulWistЧто бы определить уровень оптимизации включи SYS(3054,11) - эта ф-ия покажет какие индексы используются для поиска, желательно добиться слова FULL, отсюда танцуй добиваясь оптимизации запроса А как его включить? У меня на форму текст какой-то выводится... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2005, 14:41:38 |
|
||
|
Медленная работа Select
|
|||
|---|---|---|---|
|
#18+
w3d PaulWistЧто бы определить уровень оптимизации включи SYS(3054,11) - эта ф-ия покажет какие индексы используются для поиска, желательно добиться слова FULL, отсюда танцуй добиваясь оптимизации запроса А как его включить? У меня на форму текст какой-то выводится... Это выводится результат работы функции SYS(3054). Можно перенаправить его в текстовый файл. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Потом смотрим текстовый файл MyLog.txt. Хотя в версии VFP9 можно уже явно указать в функции SYS(3054) куда выводить результат анализа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2005, 17:29:50 |
|
||
|
Медленная работа Select
|
|||
|---|---|---|---|
|
#18+
Да, но там в любом случае выводится в переменную. А можно перенаправить на экран, а не на форму? П.С. у меня 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2005, 07:32:06 |
|
||
|
Медленная работа Select
|
|||
|---|---|---|---|
|
#18+
Я не заморачивался - смотрел прямо на форме. Все равно это надо только на время отладки. потом просто вызов функции SYS закоментровал. Она выдает список тегов которые использованы, и результат оптимизации SELECT. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2005, 11:28:17 |
|
||
|
Медленная работа Select
|
|||
|---|---|---|---|
|
#18+
А как надо оптимизировать? Вот выдало у меня partial, и что дальше делать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2005, 12:20:41 |
|
||
|
Медленная работа Select
|
|||
|---|---|---|---|
|
#18+
Погляди перечень используемых тэгов, погляди фильтр WHERE, что из фильтра where нет среди индексов? по тем полям и создай индексы например мой селект: Код: plaintext 1. 2. 3. 4. 5. 6. нужны следующие теги (индексы): Код: plaintext 1. 2. 3. 4. 5. 6. после создания выдает full ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2005, 13:15:21 |
|
||
|
Медленная работа Select
|
|||
|---|---|---|---|
|
#18+
вот что выдает если точнее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2005, 13:18:52 |
|
||
|
Медленная работа Select
|
|||
|---|---|---|---|
|
#18+
S866Погляди перечень используемых тэгов, погляди фильтр WHERE, что из фильтра where нет среди индексов? по тем полям и создай индексы например мой селект: Код: plaintext 1. 2. 3. 4. 5. 6. нужны следующие теги (индексы): Код: plaintext 1. 2. 3. 4. 5. 6. после создания выдает full 1. index on alltrim(sh) tag alsh - в корне неверно! 2. index on alltrim(sh) tag alsh - не поможет, так как == не оптимизируется. 3. index on shb tag shb - может не ускорить, а даже замедлить (зависит от селективности). 4. index on val(god) tag valgod и index on val(mes) tag valmes - как я понял, дата хранится в pl частями, да еще и в строковом формате. Почему бы не хранить дату именно как дату (pl.date), проиндексировать по этому полю, а в запросе не использовать конструкцию where pl.date between start_date and end_date? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2005, 14:30:17 |
|
||
|
Медленная работа Select
|
|||
|---|---|---|---|
|
#18+
Для URRI Понимаете ли - в таблице 26000 записей с платежками за 4 года работы (прогу я писал 4 года назад) - mes & god - месяц и год бух учета. тогда мне показалось верным god -4 байта mes - два байта что бы 01,02,...10,11,12 и в тексте - для удобства (т.е. мне тогда было удобно именно так). И переделывать таблицу я естественно теперь не буду т.к. и другой работы по горло и данные ценные и программу всю надо перебирать. а смысл топика - просто Юзеров задолбала медленная работа программы - Я выяснил что этот SELECT в одной процедуре у меня висит - процедуре согласования данных по базам. (тогда я делал похоже как в DOS FOXе). и эта процедура вызывается при открытии и закрытии программы , ну и еще в паре мест. Может индексы теоритически и не правильные - но теперь процедура выполняется не 10 секунд а 0 (точнее не мерял) и меня и пользователей это вполне устраивает. а без них выполнялось долго - недопустимо долго. Я это замерял и врать мне нет никакой надобности. кстати там файлик был прикрепленный с листингом экрана - там видно что при SELECTe используются именно эти индексы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2005, 16:36:52 |
|
||
|
Медленная работа Select
|
|||
|---|---|---|---|
|
#18+
По mes & god есть отдельные индексы? (1) Или один по god+mes? (2) Тогда измените в запросе Код: plaintext 1. для (1) Код: plaintext 1. Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2005, 18:31:27 |
|
||
|
Медленная работа Select
|
|||
|---|---|---|---|
|
#18+
Urri 1. index on alltrim(sh) tag alsh - в корне неверно! Не совсем. Такой индекс эквивалентен отбрасыванию ведущих пробелов. Т.е. конструкция допустима, но FoxPro сам, автоматически, после отсечения ведущих и концевых пробелов добавит концевые пробелы в выражение ключа до количества символов в поле sh. Идеологически, да, неверно. Но в описанной ситуации вполне уместен. Дело в том, что замена на "простой" индекс по полю sh означает серьезную переделку всей программы. Если стоит задача поставить "заплатку", то сойдет и так. Urri 2. index on alltrim(sh) tag alsh - не поможет, так как == не оптимизируется. Оптимизируется. Не надо забывать, что сравнение символьных строк в "обычных" командах FoxPro и внутри команды Select-SQL работает немного по разному. Внутри команды Select-SQL оператор тождественного равенства вего-лишь означает, что сравнение будет закончено по истечении длины самого короткого выражения в операторе сравнения. При этом не важно с какой стороны этого оператора он стоит. Т.е. это "локальное" применение настройки SET ANSI ON. На факт оптимизиации никак не влияет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2005, 19:19:03 |
|
||
|
Медленная работа Select
|
|||
|---|---|---|---|
|
#18+
Спасибо, ВладимирМ, всю жизнь не знал. В FPD alltrim в индексе был не разрешен, это я хорошо помню. И == вроде как тоже не оптимизировалось (даже в доке так написано было). Прогресс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2005, 02:19:48 |
|
||
|
Медленная работа Select
|
|||
|---|---|---|---|
|
#18+
S866Но я как то экспереминтировал на таблице с 50000 записей(справочник автозапчастей). А не поделитесь таким справочником? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2005, 06:00:14 |
|
||
|
Медленная работа Select
|
|||
|---|---|---|---|
|
#18+
Для URRI - Да индексы по god mes и god+mes есть - надо было делать так как вы написали для (1) Код: plaintext 1. ,для (2) Код: plaintext просто перобразование к числу - это както надежнее а то еще вылезет что "1"="11" => .T. а вот "1"=="11" =>.F. с другой стороны создание дополнительных индексов по таблице - 2 минуты эксклюзивного доступа к ней. так что я не особо напрягся. И еще не знаю какой фокс у вас - у меня fox 2.5 rus for dos там Код: plaintext Для W3d - Поделюсь конечно без проблем Если вам нужен именно справочник автозапчастей то вот как я его получил: 1. идете на сайт www.avia3n.ru 2. качаете их прайс в формате excel (6 МБ). 3. открываете его в excel и сохраняете нужный вам лист (а он со списком запчастей там один вроде) в формате DBF ("сохранить как") 4. создаете нужные вам индексы и вобще делаете все что угодно с ним (там тысяч 65 наименований) P.S. Всем спасибо за помощь - почерпнул для себя много нового. отдельное спасибо ВладимирМ за поддержку и теорию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2005, 08:45:19 |
|
||
|
Медленная работа Select
|
|||
|---|---|---|---|
|
#18+
S866И еще не знаю какой фокс у вас - у меня fox 2.5 rus for dos там Код: plaintext alltrim дает разные длины строк. Вероятно, фокс все-таки умеет корректно отрабатывать подобные ситуации, но когда я его осваивал, в похожей ситуации при использовании alltrim у меня возникли проблемы. С тех пор я: 1. При ручном вводе всегда проверяю строковые поля на отсутствие лидирующих пробелов. Т.е. в моих таблицах наличие таковых - табу. 2. Если нужно задавить концевые пробельные символы, я, конечно, использую trim(). Но если это индекс, то тут я всегда использую padr(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2005, 12:22:58 |
|
||
|
Медленная работа Select
|
|||
|---|---|---|---|
|
#18+
Аналогично - Я при сохранении из переменной в таблицу всегда делаю alltrim Вполне с вами согласен - ваши рассуждения вполне логичны. И правильны. Спасибо за помощь! Вобще сейчас я все поля что можно - делаю числовыми или integer. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2005, 13:17:30 |
|
||
|
Медленная работа Select
|
|||
|---|---|---|---|
|
#18+
ВладимирМНе совсем. Такой индекс эквивалентен отбрасыванию ведущих пробелов. Т.е. конструкция допустима, но FoxPro сам, автоматически, после отсечения ведущих и концевых пробелов добавит концевые пробелы в выражение ключа до количества символов в поле sh. Идеологически, да, неверно . Господа, маленькое замечание по поводу ALLTRIM() в индексе, все рассуждения строятся на том основании, что данные будут заносится и использоваться исключительно в Ваших программах, НО ни кто не рассматривает того варианта, что другой софт, стороннего разработчика может общаться с Вашими данными, и о том, что "я всегда убираю начальные пробелы" этот софт может и не знать, поэтому ALLTRIM() является общим решением для индекса, а LEFT, PADR - это частные решения для Вашей задачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2005, 13:45:39 |
|
||
|
Медленная работа Select
|
|||
|---|---|---|---|
|
#18+
PaulWist ВладимирМНе совсем. Такой индекс эквивалентен отбрасыванию ведущих пробелов. Т.е. конструкция допустима, но FoxPro сам, автоматически, после отсечения ведущих и концевых пробелов добавит концевые пробелы в выражение ключа до количества символов в поле sh. Идеологически, да, неверно . Господа, маленькое замечание по поводу ALLTRIM() в индексе, все рассуждения строятся на том основании, что данные будут заносится и использоваться исключительно в Ваших программах, НО ни кто не рассматривает того варианта, что другой софт, стороннего разработчика может общаться с Вашими данными, и о том, что "я всегда убираю начальные пробелы" этот софт может и не знать, поэтому ALLTRIM() является общим решением для индекса, а LEFT, PADR - это частные решения для Вашей задачи. Маленькое замечание по замечанию. База данных - это не просто набор таблиц, никак не связанных между собой. Это нечто, являющееся единым целым. Т.е., в общем случае, невозможно где-то, что-то подправить так, чтобы это не затронуло всего остального. Отбрасывание ведущих пробелов в момент записи информации в таблицу (если этого не делать, то как раз и нужен индекс по AllTrim()) - это всего-лишь один из множества разнообразных контролей процесса записи информации. То, что кто-то будет обращаться к таблицам напрямую и, предположительно, модифицировать данные, означает, что есть серьезный риск нарушить вообще всю целостность базы данных. Появление ведущих пробелов - будет всего-лишь признаком того, что кто-то влез в эту базу со стороны. Есть еще ряд проблем такого "стороннего" вмешательства. В общем случае, это не проблема автора программы, а проблема того, кто влез в базу данных используя сторонние программы. С другой стороны, наличие ведущих пробелов (если это не обусловлено спецификой данных) - это довольно значительная проблема организации поиска данных и неоправданное усложение программы. Т.е. использование индекса по AllTrim() - это признак "кривизны" контроля целостности базы данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2005, 14:33:58 |
|
||
|
|

start [/forum/topic.php?fid=41&fpage=287&tid=1592862]: |
0ms |
get settings: |
11ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
63ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
75ms |
get tp. blocked users: |
2ms |
| others: | 233ms |
| total: | 425ms |

| 0 / 0 |
