|
Почему Select медленно работает?
|
|||
---|---|---|---|
#18+
Есть таблица Schet1 и ее копия scc1 выполняю: SELECT kod, ugol FROM scc1 WHERE oper = '007001' AND !EMPTY(ugol) INTO CURSOR v3 время работы = 0 SELECT kod, ugol FROM schet1 WHERE oper = '007001' AND !EMPTY(ugol) INTO CURSOR v1 время работы=25сек. Разница в таблицах - Schet1 входит в dbc, есть триггеры Insert, Update, Delete. Таблица scc1 - свободная. Получена из Schet1 командой Copy to scc1 В обеих есть индекс Oper - key()='Oper' Ориентировочное число записей 5 500 000. Выборка ~85 000. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2018, 13:53 |
|
Почему Select медленно работает?
|
|||
---|---|---|---|
#18+
Создание индекса и выполнение запроса при одинаковом collation ? Что показывает Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2018, 13:58 |
|
Почему Select медленно работает?
|
|||
---|---|---|---|
#18+
glamis, 1. Команда копирования должна быть такой Код: sql 1.
2. Нужен индекс не только на OPER, но и на !EMPTY(ugol). Код: sql 1.
3. Создание индекса по строке (OPER) и выполнение запроса должны быть при одинаковых Collation. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2018, 14:05 |
|
Почему Select медленно работает?
|
|||
---|---|---|---|
#18+
Dima T, sys(3054,12) для Schet1: SELECT kod, ugol FROM schet1 WHERE oper = '007001' AND !EMPTY(ugol) INTO CURSOR v1 Using index tag Sql_oper to rushmore optimize table schet1 Rushmore optimization level for table schet1: partial для scc1: SELECT kod, ugol FROM scc1 WHERE oper = '007001' AND !EMPTY(ugol) INTO CURSOR v3 Using index tag Sql_oper to rushmore optimize table scc1 Rushmore optimization level for table scc1: partial ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2018, 14:06 |
|
Почему Select медленно работает?
|
|||
---|---|---|---|
#18+
Sergey Sizov, Таблицы одинаковы, индексы тоже, а время работы в одном случае 0, в другом -25сек. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2018, 14:08 |
|
Почему Select медленно работает?
|
|||
---|---|---|---|
#18+
glamis, забыл еще про set deleted. Если стоИт в on, то еще нужен индекс Код: sql 1.
И тогда можно будет увидеть Full вместо partial. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2018, 14:09 |
|
Почему Select медленно работает?
|
|||
---|---|---|---|
#18+
есть еще подозрение, что в копии записи отсортированы физически. Проверю только вечером. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2018, 14:11 |
|
Почему Select медленно работает?
|
|||
---|---|---|---|
#18+
Sergey Sizov, есть ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2018, 14:12 |
|
Почему Select медленно работает?
|
|||
---|---|---|---|
#18+
glamisSergey Sizov, Таблицы одинаковы, индексы тоже, а время работы в одном случае 0, в другом -25сек.Еще раз - важны не только данные и выражения индексирования, но и Collation при СОЗДАНИИ индекса и при ВЫПОЛНЕНИИ запроса. Вы же индекс на вторую таблицу не скопировали (а могли, командой которую я показал)? Вы же его потОм сделали? Какой collation был непосредственно перед выдачей команды Index on... ? А какой при выполнении вашего запроса? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2018, 14:13 |
|
Почему Select медленно работает?
|
|||
---|---|---|---|
#18+
glamisSergey Sizov, естьЧто есть? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2018, 14:13 |
|
Почему Select медленно работает?
|
|||
---|---|---|---|
#18+
glamisDima T, sys(3054,12) для Schet1 ... Разницы никакой, значит дело не в фоксе glamisРазница в таблицах - Schet1 входит в dbc, есть триггеры Insert, Update, Delete. Таблица scc1 - свободная. Получена из Schet1 командой Copy to scc1 В обеих есть индекс Oper - key()='Oper' Ориентировочное число записей 5 500 000. Выборка ~85 000. 1. Триггеры ничем не мешают, т.к. выполняются только при изменении. 2. Если таблицы в сети и Schet1 используется несколькими пользователями, а scc1 только тобой, то после копирования scc1 даже находясь в сети все-равно закэшируется на твоем компе, т.е. по скорости будет как локальная. Недавно эту тему поднимали ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2018, 14:19 |
|
Почему Select медленно работает?
|
|||
---|---|---|---|
#18+
Sergey Sizovно и Collation при СОЗДАНИИ индекса и при ВЫПОЛНЕНИИ запроса. ИМХО Collation одинаковый, иначе рашмор просто не стал бы индекс использовать 21289919 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2018, 14:21 |
|
Почему Select медленно работает?
|
|||
---|---|---|---|
#18+
Dima TSergey Sizovно и Collation при СОЗДАНИИ индекса и при ВЫПОЛНЕНИИ запроса. ИМХО Collation одинаковый, иначе рашмор просто не стал бы индекс использовать 21289919 Это справедливо для самой последней версии фокса. В предыдущих сервис паках было разное. В любом случае предложенные мной индексы всяко не помешают. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2018, 14:26 |
|
Почему Select медленно работает?
|
|||
---|---|---|---|
#18+
Sergey Sizov, Индекс Delete() ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2018, 14:44 |
|
Почему Select медленно работает?
|
|||
---|---|---|---|
#18+
glamisSergey Sizov, Индекс Delete()Однако, он не используется. Он точно Binary? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2018, 14:48 |
|
Почему Select медленно работает?
|
|||
---|---|---|---|
#18+
Sergey Sizov, set('collate') = MACHINE cp Schet1 1251, cp ssc1 1251 fox Visual FoxPro 09.00.0000.5815 for Windows Кроме того: Select kod,ugol from Schet1 where oper = '007001' into cursor v4 0сек. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2018, 14:54 |
|
Почему Select медленно работает?
|
|||
---|---|---|---|
#18+
Sergey SizovglamisSergey Sizov, Индекс Delete()Однако, он не используется. Он точно Binary? Set delete не включено. Эти примеры я выполняю на одной машине в commande, последовательно друг за другом. Среда fox одинакова. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2018, 14:59 |
|
Почему Select медленно работает?
|
|||
---|---|---|---|
#18+
glamisfox Visual FoxPro 09.00.0000.5815 for WindowsНе самый последний. Обязательно обновить.[/quot] Кроме того: Select kod,ugol from Schet1 where oper = '007001' into cursor v4 0сек.[/quot]Ну так я ж не просто так про индекс по !Empty(ugol) писал. Как раз его отсутствие для Schet1 и показывает разницу в быстродействии для Schet1. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2018, 15:02 |
|
Почему Select медленно работает?
|
|||
---|---|---|---|
#18+
glamisSergey Sizovпропущено... Однако, он не используется. Он точно Binary? Set delete не включено. Эти примеры я выполняю на одной машине в commande, последовательно друг за другом. Среда fox одинакова.Отлично. Теперь надо добиться такого: Select kod,ugol from Schet1 where oper = '007001' and !Empty(ugol) Using index tag Sql_oper to rushmore optimize intermediate result Using index tag E_ugol to rushmore optimize intermediate result Rushmore optimization level for intermediate result: full ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2018, 15:10 |
|
Почему Select медленно работает?
|
|||
---|---|---|---|
#18+
Sergey Sizov, Но из scc1 эта же выборка при той же структуре, с теми же индексами, с теми же данными копируется МГНОВЕННО. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2018, 15:23 |
|
Почему Select медленно работает?
|
|||
---|---|---|---|
#18+
glamisSergey Sizov, Но из scc1 эта же выборка при той же структуре, с теми же индексами, с теми же данными копируется МГНОВЕННО.Она может быть закэширована, она/ее индексы могут лежать в более "удобном" месте диска и т.д. Про одинаковые индексы можно говорить только при копировании этой таблицы вместе с индексами. Вы собираетесь лечить пациента гаданиями? Или таки возьмёте на вооружение технические средства и пойдёте искать где собака порылась? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2018, 15:28 |
|
Почему Select медленно работает?
|
|||
---|---|---|---|
#18+
glamisКроме того: Select kod,ugol from Schet1 where oper = '007001' into cursor v4 0сек. Это очень странно. Не могу придумать ни одного объяснения. Если тут же после выполнить Код: sql 1.
точно тормозит? Может проблему уже нет? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2018, 15:31 |
|
Почему Select медленно работает?
|
|||
---|---|---|---|
#18+
Sergey SizovТеперь надо добиться такого: Select kod,ugol from Schet1 where oper = '007001' and !Empty(ugol) Using index tag Sql_oper to rushmore optimize intermediate result Using index tag E_ugol to rushmore optimize intermediate result Rushmore optimization level for intermediate result: full ИМХО лучше не надо. Фокс все-равно возьмет какой-то один индекс в качестве основного и будет сначала выбирать по нему. Если этим индексом окажется E_ugol, то будет тормоз. Если уж добиваться "full", то индексом по oper+ugol PS "full" не означает что самый быстрый способ выбран. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2018, 15:41 |
|
Почему Select медленно работает?
|
|||
---|---|---|---|
#18+
Dima TSergey SizovТеперь надо добиться такого: пропущено... ИМХО лучше не надо. Фокс все-равно возьмет какой-то один индекс в качестве основного и будет сначала выбирать по нему. Если этим индексом окажется E_ugol, то будет тормоз. Если уж добиваться "full", то индексом по oper+ugol PS "full" не означает что самый быстрый способ выбран.Сударь, вы думаете я это в текстовом редакторе написал? Вам показать код, который выводит сие сообщение? Извольте. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
Потом расскажете про использование только одного индекса. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2018, 15:47 |
|
Почему Select медленно работает?
|
|||
---|---|---|---|
#18+
Sergey Sizov, Мне теперь для каждой выборки строить свои индексы? В таблице около 30 полей и что, по каждому строить индекс? Насчет кеширования - только что сбросил таблицу по сетке на другой ресурс, с другим именем и сделал выборку в другой сессии fox - МГНОВЕННО. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2018, 15:47 |
|
Почему Select медленно работает?
|
|||
---|---|---|---|
#18+
glamisSergey Sizov, Мне теперь для каждой выборки строить свои индексы? Можете построить чужие. Вам решать что для вас важнее - скорость работы программы, место на диске или ваша лень.В таблице около 30 полей и что, по каждому строить индекс? Стандартный идиотский вопрос... Откуда взялось слов "все"? Вроде я показал, что индексы нужны по выражениям в предложении where? Если нет, то откуда "все"? К тому же, индексы именно для ускорения выполнения запросов и создаются, а не "абы были". И под конкретные запросы, а не абы какие. Под предложенный вами запрос нужны такие.Насчет кеширования - только что сбросил таблицу по сетке на другой ресурс, с другим именем и сделал выборку в другой сессии fox - МГНОВЕННО.Из чего можно сделать вывод, что дело, скорее всего не в бобине. Как минимум не в кэшировании. Проверяйте остальное окружение. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2018, 15:57 |
|
Почему Select медленно работает?
|
|||
---|---|---|---|
#18+
Sergey SizovСударь, вы думаете я это в текстовом редакторе написал? Вам показать код, который выводит сие сообщение? Извольте. ... Потом расскажете про использование только одного индекса. "На заборе тоже написано, а забором нету!" (с) Я утверждаю что "Rushmore optimization level for intermediate result: full" не означает "Найдено наилучшее решение". При некоторых обстоятельствах решение может оказаться наихудшим. Я однажды наступал на подобные грабли, запрос был похожий Код: sql 1.
таблица открыта локально, монопольно, записей прядка 100+ млн. индексы были оба по f1 и f2, но в один прекрасный день этот запрос завесил проц на 100% и завершения я не дождался. Последующие проверки зависание повторяли, переиндексация не помогала. Помогла смена индекса на str(f1) + str(f2) PS Пища для размышлений: почему MS SQL никогда не использует два индекса? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2018, 16:13 |
|
Почему Select медленно работает?
|
|||
---|---|---|---|
#18+
Dima TSergey SizovСударь, вы думаете я это в текстовом редакторе написал? Вам показать код, который выводит сие сообщение? Извольте. ... Потом расскажете про использование только одного индекса. "На заборе тоже написано, а забором нету!" (с) Я утверждаю что "Rushmore optimization level for intermediate result: full" не означает "Найдено наилучшее решение". При некоторых обстоятельствах решение может оказаться наихудшим.Угу. Например, на маленькой таблице, где накладные расходы на индексы могут превысить достигнутый результат ускорения. Или ошибки в движке, которые правились сервиспаками. Ну и т.д. Я однажды наступал на подобные грабли, запрос был похожий Код: sql 1.
таблица открыта локально, монопольно, записей прядка 100+ млн. индексы были оба по f1 и f2, но в один прекрасный день этот запрос завесил проц на 100% и завершения я не дождался. Последующие проверки зависание повторяли, переиндексация не помогала. Помогла смена индекса на str(f1) + str(f2)А тут сразу всплывает версия самого фокса и его сервспаков. :) PS Пища для размышлений: почему MS SQL никогда не использует два индекса?А там индексы не по выражениям. И используются, в том числе, ВМЕСТО данных из таблицы. Поразмышляйте на досуге. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2018, 16:22 |
|
Почему Select медленно работает?
|
|||
---|---|---|---|
#18+
[quot Sergey Sizov]А тут сразу всплывает версия самого фокса и его сервспаков. :) Visual FoxPro 09.00.0000.5815 for Windows Sergey SizovPS Пища для размышлений: почему MS SQL никогда не использует два индекса?А там индексы не по выражениям. И используются, в том числе, ВМЕСТО данных из таблицы. Поразмышляйте на досуге. ИМХО у меня объяснение "почему так" немного конспирологическое: рашмор изначально заточен на медленные сети порядка 10 Мбит, где выгоднее по индексам построить пересечение, т.е. список нужных записей, а затем тащить записи на клиента, но при при таблицах в миллионы записей и результаты десятки-сотни тыс. записей, этот алгоритм получается не самым лучшим решением. Повторюсь: сугубо ИМХО, просто предположение. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2018, 16:37 |
|
Почему Select медленно работает?
|
|||
---|---|---|---|
#18+
Dima T, должно быть 09.00.0000.7423 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2018, 16:59 |
|
Почему Select медленно работает?
|
|||
---|---|---|---|
#18+
Sergey Sizov, На таблице висит 200 юзеров. Как ты себе ты представляешь такое взрослое решение как индексация когда захочу (при этом она тоже требует времени) или работа такого кол-ва юзеров по обновлению 30 индексов? Мне требуется исполнение скрипта в пределах 10-15 сек, а тут одна из операций сжирает 25, а общее время вылетает под 100. Вопрос на самом деле почему выборка в одной копии таблицы происходит мгновенно, а в другой - достаточно долго. Сейчас скопировал исходную таблицу вместе с cdx. Сделал ее свободной. Выборка - долго. Переиндексировал - долго. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2018, 17:05 |
|
Почему Select медленно работает?
|
|||
---|---|---|---|
#18+
glamisSergey Sizov, На таблице висит 200 юзеров. Как ты себе ты представляешь такое взрослое решение как индексация когда захочуГде, кто и когда такое предлагал? Плюнь тому в морду. :) (при этом она тоже требует времени) или работа такого кол-ва юзеров по обновлению 30 индексов?И опять двадцать пять... Какие еще 30 индексов? Мне требуется исполнение скрипта в пределах 10-15 сек, а тут одна из операций сжирает 25, а общее время вылетает под 100.Ну прям америку открыл, а мужики то и не знают... Ну так разбирайся почему так, чего тут ныть? Переиндексация, в общем-то, обслуживающая процедура и не должна проводится в рабочее время. Неужели первый раз об этом слышишь? Вопрос на самом деле почему выборка в одной копии таблицы происходит мгновенно, а в другой - достаточно долго. Сейчас скопировал исходную таблицу вместе с cdx. Сделал ее свободной. Выборка - долго. Переиндексировал - долго.Вопрос про сферического коня. Все зависит от твоей конкретики, которую тут никто не видит и может только гадать. Гадания тебе выдали. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2018, 17:19 |
|
Почему Select медленно работает?
|
|||
---|---|---|---|
#18+
Sergey Sizov, Мне не нужно рассказывать как оптимизировать эту выборку. Я хочу понимать как работает Select и почему одни и те же данные в одних и тех же условиях он выбирает по разному. А какие построить индексы я уж и сам как-нить разберусь. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2018, 17:29 |
|
Почему Select медленно работает?
|
|||
---|---|---|---|
#18+
glamis, наше дело предложить, ваше дело не воспользоваться нашим предложением. Успехов в гаданиях. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2018, 17:33 |
|
Почему Select медленно работает?
|
|||
---|---|---|---|
#18+
Sergey SizovDima T, должно быть 09.00.0000.7423 На сайте MS только SP2 в котором 09.00.0000.5815 9.0.0.7423 упоминается, но не качается. Качать непонятно откуда - страшновато. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2018, 08:12 |
|
Почему Select медленно работает?
|
|||
---|---|---|---|
#18+
Dima T, нет там ничего страшного ибо там только DLL, которые надо руками разложить в нужные места. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2018, 09:44 |
|
Почему Select медленно работает?
|
|||
---|---|---|---|
#18+
glamisВопрос на самом деле почему выборка в одной копии таблицы происходит мгновенно, а в другой - достаточно долго. Сейчас скопировал исходную таблицу вместе с cdx. Сделал ее свободной. Выборка - долго. Переиндексировал - долго. Ну вот же вам информация для анализа. На вскидку, 1я копия получилась сильно урезаной. Т.е. вовсе и не копией. Иначе трудно что то объяснить. Так как после точного копирования, все сразу сравнялось. Что мешает создать индекс как Sergey Sizov советует? И при чем тут 30 полей? Те поля что выбираются индексам не нужны. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2018, 14:38 |
|
Почему Select медленно работает?
|
|||
---|---|---|---|
#18+
asdor, Дело в том, что выбор идет по полю oper с дополнительным фильтром empt(uslov), а Sergey Sizov советует для ускорения создать и индекс по uslov. Но выборки бывают с разными фильтрами, те для каждой выборки, по этой логике, нужен свой дополнительный индекс. А как быть с таким индексом, если требуется empt(uslov), !empt(uslov), uslov='12345'. Это ведь тоже разные индексы для оптимизатора. 1-я копия действительно урезана. Она меньше тыс. на 2 удаленных записей, при общем объеме 5500000. Получилась командой Copy to. Тут фишка в том, что если делать выборку where oper='007001', то в обоих случаях выборка происходит мгновенно, точнее не выборка а какой-то именованный фильтр. При этом recc() показывает количество записей в исходной таблице, а count количество записей в выборке. При попытке сделать Select из такой выборки система выдает ошибку и предлагает использовать форму into table для первоначальной выборки. Помогает Nofiltr, но при этом время выборки резко возрастает. Это к чему - для копии таблицы по такой же схеме срабатывает и where oper = '007001' and !empt(uslov), а для исходной не срабатывает. Вот вопрос и был - ПОЧЕМУ. а Sergey Sizov пытался рассказать КАК можно сделать. КАК можно я и сам знаю. Сейчас время срабатывания 0.1сек, но решение-то не системное... ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2018, 10:58 |
|
Почему Select медленно работает?
|
|||
---|---|---|---|
#18+
Dima T, У меня SP3 стоит. По-крайней мере должна стоять:) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2018, 11:00 |
|
Почему Select медленно работает?
|
|||
---|---|---|---|
#18+
glamisasdor, Дело в том, что выбор идет по полю oper с дополнительным фильтром empt(uslov), а Sergey Sizov советует для ускорения создать и индекс по uslov.Точно-точно? А если внимательнее перечитать? Но выборки бывают с разными фильтрами,Какая неожиданная новость! те для каждой выборки, по этой логике, нужен свой дополнительный индекс.По какой ТАКОЙ логике? Если все время утверждалось, что индексы нужны по выражениям в условиях отборов? Типа выражения там никогда не повторяются? А как быть с таким индексом, если требуется empt(uslov), !empt(uslov),Эти два условия покрываются 1(Одним) индексом. uslov='12345'. Это ведь тоже разные индексы для оптимизатора.Разумеется. А вы, как я понимаю, хотите обойтись одним-двумя? На каком основании? 1-я копия действительно урезана. Она меньше тыс. на 2 удаленных записей, при общем объеме 5500000. Получилась командой Copy to. Тут фишка в том, что если делать выборку where oper='007001', то в обоих случаях выборка происходит мгновенно, точнее не выборка а какой-то именованный фильтр.То есть про способ выполнения запросов путем наложения хитрого фильтра вы не знаете. При этом recc() показывает количество записей в исходной таблице, а count количество записей в выборке. При попытке сделать Select из такой выборки система выдает ошибку и предлагает использовать форму into table для первоначальной выборки. Помогает Nofiltr, но при этом время выборки резко возрастает.Ибо не используются кэшированные данные и происходит физическая переливка данных в новый курсор Это к чему - для копии таблицы по такой же схеме срабатывает и where oper = '007001' and !empt(uslov), а для исходной не срабатывает. Кто на ком стоял? Вот вопрос и был - ПОЧЕМУ. а Sergey Sizov пытался рассказать КАК можно сделать. КАК можно я и сам знаю. Сейчас время срабатывания 0.1сек, но решение-то не системное...Интересно, как можно было что-то рассказать по поводу "почему?" если очень важная для этого информация только сейчас опубликована? Да, какое решение несистемное? Создание индексов? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2018, 11:49 |
|
|
start [/forum/topic.php?all=1&fid=41&tid=1581805]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
31ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
61ms |
get tp. blocked users: |
2ms |
others: | 12ms |
total: | 147ms |
0 / 0 |