powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Скорость SELECT с индексом и без
17 сообщений из 17, страница 1 из 1
Скорость SELECT с индексом и без
    #39592428
Фотография Redrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
SELECT * FROM svod WHERE tin in (SELECT tin FROM svod WHERE pin='123456789')


svod - это 5,3 млн. записей общим объемом 930 МБ
есть индексы, в т.ч. по TIN и PIN
Дождаться результата невозможно!
А если выбросить индексный файл - 0,5 сек
Почему? Какой механизм? Просто интересно...
Спасибо за участие!
...
Рейтинг: 0 / 0
Скорость SELECT с индексом и без
    #39592443
Redrik,
1. индексы не соответствуют запросу;
2. наличие активного индекса.
...
Рейтинг: 0 / 0
Скорость SELECT с индексом и без
    #39592447
Фотография Redrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
правильный проходящий,
спасибо за отзыв в выходной вечер! :)

1) индексы простейшие, поля такие:
PIN - C(10)
TIN - N(10,0)

2) активный индекс? - ни в коем случае! - это дело известное...
...
Рейтинг: 0 / 0
Скорость SELECT с индексом и без
    #39592449
Redrikправильный проходящий,
спасибо за отзыв в выходной вечер! :)

1) индексы простейшие, поля такие:
PIN - C(10)
TIN - N(10,0)
Пока что здесь описаны поля, а не выражения индексов. Индексные выражения ТОЧНО такие же? Точно? Reindex давно делали?
ps: Сколько раз мне говорили, пробивая себе пяткой в грудь, что "индексы есть, нужные", но потом, при ближайшем рассмотрении всё оказывалось совершенно по-другому. В том числе и с пониманием стучащими в грудь понятий "индекс", "индексное выражение", "необходимый индекс!.
...
Рейтинг: 0 / 0
Скорость SELECT с индексом и без
    #39592452
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем так? Может сразу
Код: sql
1.
SELECT * FROM svod WHERE pin='123456789'



Подзапросы штука мутная. В фоксе не пользуюсь ими. В MSSQL бывает, но и ему крышу срывает иногда.

В общем случае делаю так
Код: sql
1.
2.
3.
SELECT tin FROM svod WHERE pin='123456789' into cursor ttin
index on tin tag tin
SELECT * FROM svod WHERE indexseek(tin, .F., 'ttin', 'tin')
...
Рейтинг: 0 / 0
Скорость SELECT с индексом и без
    #39592456
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RedrikПочему? Какой механизм? Просто интересно...
SYS(3054) посмотри что выдаст
...
Рейтинг: 0 / 0
Скорость SELECT с индексом и без
    #39593004
Фотография Redrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
правильный проходящий....пробивая себе пяткой в грудь...
Просто не хочу грузить лишними буквами, да и не студент я давно :)
Pin - C(10) -> INDEX ON Pin TAG Pin
Tin - N(10,0) -> INDEX ON Tin TAG Tin
REINDEX точно не нужен - индексы сделаны только и что с нуля (уточню - CDX не было вообще)!
...
Рейтинг: 0 / 0
Скорость SELECT с индексом и без
    #39593006
Фотография Redrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЗачем так? Может сразу
Код: sql
1.
 SELECT * FROM svod WHERE pin='123456789' 


Не оно!
Условно: Pin - код человека, Tin - код фирмы
Мне нужны все люди по всем фирмам, где был замечен конкретный человек... ;)

Подзапросы тоже не люблю, но как-то так сложилось и немного ошарашило!
SYS(3054) - посмотрю - отпишусь

Спасибо!
...
Рейтинг: 0 / 0
Скорость SELECT с индексом и без
    #39593015
Фотография Redrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мрак!
Урезал базу с 5 млн записей до 0.5 млн - не дождался!
Оставил случайных 100 Кб...

Код: sql
1.
SELECT * FROM svod WHERE tin in (SELECT tin FROM svod WHERE pin='123456789')


Rushmore optimization level for table svod: none
Using index tag Pin to rushmore optimize table svod
Rushmore optimization level for table svod: full
Joining table svod and table svod using index tag Tin

Как-то так...
...
Рейтинг: 0 / 0
Скорость SELECT с индексом и без
    #39593162
bmvmon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SET COLLATE TO "MACHINE" и пересоздай индекс,
!удалить и создать заново.
...
Рейтинг: 0 / 0
Скорость SELECT с индексом и без
    #39593206
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bmvmonSET COLLATE TO "MACHINE" и пересоздай индекс,
!удалить и создать заново.Да-да, обязательно. Именно по PIN, ибо он символьный. Особенности последних SP и фиксов VFP9.
...
Рейтинг: 0 / 0
Скорость SELECT с индексом и без
    #39593611
Фотография Redrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
COLLATE неизменно = "MACHINE" :(
...
Рейтинг: 0 / 0
Скорость SELECT с индексом и без
    #39593615
RedrikCOLLATE неизменно = "MACHINE" :(Тут дело в не/идентичности collate при создании индекса и при использовании. При разных индексы по символьным полям не работают. Именно поэтому временный индекс таки работает, а постоянный - нет. Чтобы работал индекс таки надо СОЗДАТЬ при том значении collate, при котором ожидается его использование. И еще раз - речь об индексах по СИМВОЛЬНЫМ полям.
...
Рейтинг: 0 / 0
Скорость SELECT с индексом и без
    #39593678
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХО тут проблема в неправильном использовании индекса, т.е. план выполнения запроса неправильно выбран.
Этот join подозрительный:
RedrikМрак!
Rushmore optimization level for table svod: none
Using index tag Pin to rushmore optimize table svod
Rushmore optimization level for table svod: full
Joining table svod and table svod using index tag Tin
...
Рейтинг: 0 / 0
Скорость SELECT с индексом и без
    #39594260
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Redrik
Код: sql
1.
SELECT * FROM svod WHERE tin in (SELECT tin FROM svod WHERE pin='123456789')


svod - это 5,3 млн. записей общим объемом 930 МБ
есть индексы, в т.ч. по TIN и PIN
Дождаться результата невозможно!
А если выбросить индексный файл - 0,5 сек
Почему? Какой механизм? Просто интересно...
Спасибо за участие!
Факт использования индекса вообще и оптимизация в частности может, конечно, замедлить выполнение. Но не с такой катастрофической разницей. Скорее всего, здесь причина во вне программных проблемах. Что это может быть

1. Повреждены индексы - их надо пересоздать. Reindex не поможет. Именно удалить и создать заново. Возможно, есть какие-то повреждения и в таблицах. В этом случае надо CREATE TABLE + APPEND FROM
2. Когда Вы "выбрасываете индексы", то начинают использоваться какие-то другие индексы. Посмотрите, что вернет SYS(3054) если "выбросить индекс"
3. Вы тестируете запрос с индексом и без при разных условиях.
3.1. С разными значениям pin='123456789'. Без индекса значение такое, что выборка маленькая, а с индексом - чуть ли не вся таблица
3.2. Возможно, таблица лежит в сети и с индексом тянете данные из сетки, а без индекса - с локали
4. Физически мало места на диске. Некуда сохранять временные структуры в процессе выполнения запроса
5. Антивирус блокирует (проверяет) создаваемые временные файлы. Для целей тестирования можно попробовать просто отключить антивирус на время выполнения выборки

Другими словами, оказывают влияние какие-то "внешние" (по отношению к среде FoxPro) причины. Сам по себе FoxPro не может дать такую разницу во времени выполнения
...
Рейтинг: 0 / 0
Скорость SELECT с индексом и без
    #39594345
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМСам по себе FoxPro не может дать такую разницу во времени выполнения
Может. FoxPro не боги писали.
Сам натыкался на подобное на таблице в 10+ млн.записей. При построении плана выполнения запроса оптимизатором выбирается не тот индекс и цена ошибки получается слишком высока из-за большого размера таблицы.

PS С MSSQL такое тоже бывает.
...
Рейтинг: 0 / 0
Скорость SELECT с индексом и без
    #39594471
Фотография Redrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМЧто это может быть
Спасибо, Владимир, что обратили внимание на мой вопрос!

Сам SELECT в таком виде, наверное, слишком "неразумным" получился...
Простое WHERE a.tin=b.tin вместо IN () работает практически мгновенно!

По Вашим замечанием:
- Таблица и индексы созданы с нуля - повреждений быть не может
- Других индексов, кроме PIN и TIN, нету
- Значение PIN в разных тестах одно и то же (выборка действительно получается большая - около 40% всей базы)
- Таблица и индекс - локальные, машина физически отключена от сети (инфа не для сетки)
- Места на диске около 120 ГБ (SSD)
- Антивируса нет (машина не в сети, флешки как попало не суются, доступ ограничен)

Надеюсь этот топик как минимум поможет кому-нибудь из читателей не попасть на грабли...
Еще раз спасибо за участие в обсуждении!
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Скорость SELECT с индексом и без
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]