Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Помогите оптимизировать запрос / 24 сообщений из 24, страница 1 из 1
11.09.2019, 15:38
    #39860380
argnis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
Доброго времени суток!

Помогите оптимизировать запрос. Он нереально долго выполняется при небольшом объеме данных (около 40 минут для 250 тыс строк).
При этом без условия на время ([DEBITOR].D_UBJH + [DEBITOR].D_UBJJ + [DEBITOR].D_UBMM + [DEBITOR].D_UBTT >= '20140101' справляется за 20 секунд.

Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT [DEBITOR].D_INK_NR, [DEBITOR].D_SNR, [TIT].T_NR,  
   IIF( ([TIT].T1_KZ <> 16 AND ([TIT].T1_ZV = 'j' OR [TIT].T1_ZV = 'J')  AND ([TIT].T1_GS = 'j' OR [TIT].T1_GS = 'J')) 
      OR ([TIT].T2_KZ <> 16 AND ([TIT].T2_ZV = 'j' OR [TIT].T2_ZV = 'J')  AND ([TIT].T2_GS = 'j' OR [TIT].T2_GS = 'J')) 
      OR ([TIT].T3_KZ <> 16 AND ([TIT].T3_ZV = 'j' OR [TIT].T3_ZV = 'J')  AND ([TIT].T3_GS = 'j' OR [TIT].T3_GS = 'J')) , 'YES', 'NO' ) AS ISTIT  
FROM DEBITOR, TIT 
WHERE [TIT].T_INKNR=[DEBITOR].D_INK_NR AND [TIT].T_SNR=[DEBITOR].S_SNR 
AND [DEBITOR].D_SPERR = '0' AND [DEBITOR].D_ERLDAT ='00000000'  AND [DEBITOR].D_UBJH + [DEBITOR].D_UBJJ + [DEBITOR].D_UBMM + [DEBITOR].D_UBTT >= '20140101'



Очень надеюсь на вашу помощь!
...
Рейтинг: 0 / 0
11.09.2019, 16:44
    #39860421
argnis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
Извините, не написал необходимые уточнения:
В таблице TIT первичный ключ состоит из 3 полей: T_INKNR + T_SNR + T_NR
В таблице DEBITOR ПК состоит из 2 полей: S_INK_NR + S_SNR
Все поля - STRING, за исключением T1_KZ, который INT.

В одной таблице хранятся задолженности (DEBITOR), в другой - акты(TIT). Нужно проверить имеет ли задолженность соответствующий ей акт. Одна задолженность может быть нескольких видов и ей могут соответствовать несколько актов.
...
Рейтинг: 0 / 0
11.09.2019, 16:48
    #39860426
Помогите оптимизировать запрос
автор[DEBITOR].D_UBJH + [DEBITOR].D_UBJJ + [DEBITOR].D_UBMM + [DEBITOR].D_UBTT >= '20140101' Поясните что хранится в каждом из 4-х полей и какой их тип. Они индексированные?
Значения месяца и дня могут отличаться от 01?
автор[TIT].T1_ZV = 'j' OR [TIT].T1_ZV = 'J' Если у вас обычная БД Акса, то это лишнее - JET не учитывает регистр.
...
Рейтинг: 0 / 0
11.09.2019, 17:27
    #39860450
argnis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
Кривцов Анатолийавтор[DEBITOR].D_UBJH + [DEBITOR].D_UBJJ + [DEBITOR].D_UBMM + [DEBITOR].D_UBTT >= '20140101' Поясните что хранится в каждом из 4-х полей и какой их тип. Они индексированные?
Значения месяца и дня могут отличаться от 01?

В них хранится значение даты задолжности D_UBJH [столетие - 19 или 20], D_UBJJ[Год - от 1 до 99], D_UBMM[Месяц - от 1 до 12], D_UBTT [День - от 1 до 31]

Кривцов Анатолийавтор[TIT].T1_ZV = 'j' OR [TIT].T1_ZV = 'J' Если у вас обычная БД Акса, то это лишнее - JET не учитывает регистр.
спасибо! попробую
...
Рейтинг: 0 / 0
11.09.2019, 17:48
    #39860463
Stanislav P
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
argnisВ них хранится значение даты задолжности D_UBJH [столетие - 19 или 20], D_UBJJ[Год - от 1 до 99], D_UBMM[Месяц - от 1 до 12], D_UBTT [День - от 1 до 31]
спасибо! попробую

Разбей запрос на SELECT .... D_UBJH="20" AND D_UBJJ = "14" и так далее, и посмотри на скорость выполнения.
...
Рейтинг: 0 / 0
11.09.2019, 17:53
    #39860467
argnis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
Stanislav PargnisВ них хранится значение даты задолжности D_UBJH [столетие - 19 или 20], D_UBJJ[Год - от 1 до 99], D_UBMM[Месяц - от 1 до 12], D_UBTT [День - от 1 до 31]
спасибо! попробую

Разбей запрос на SELECT .... D_UBJH="20" AND D_UBJJ = "14" и так далее, и посмотри на скорость выполнения.

Тут дело в том, что дата может быть любая. Ее задает ползователь.
...
Рейтинг: 0 / 0
11.09.2019, 17:58
    #39860475
Stanislav P
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
argnis, не имеет значение, разбей дату введенную юзером так, как я ранее показал и проверь скорость работы.
...
Рейтинг: 0 / 0
11.09.2019, 18:07
    #39860486
argnis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
Stanislav Pargnis, не имеет значение, разбей дату введенную юзером так, как я ранее показал и проверь скорость работы.

Заработало действительно быстрее. Правда не пойму почему, но очень большое Вам спасибо!
...
Рейтинг: 0 / 0
12.09.2019, 06:26
    #39860668
MrShin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
Код: sql
1.
FROM DEBITOR, TIT


Не делайте так, если вы действительно не хотите получить декартово произведение строк. Перепишите через нормальный JOIN и проверьте наличие индексов по всем полям, входящим в джоин и WHERE
...
Рейтинг: 0 / 0
12.09.2019, 09:37
    #39860708
Stanislav P
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
argnisЗаработало действительно быстрее. Правда не пойму почему, но очень большое Вам спасибо!
У тебя в запросе идёт конкатенация строк: [DEBITOR].D_UBJH + [DEBITOR].D_UBJJ , а это медленная операция, тем более конкатенация сразу нескольких значений. Поэтому лучше делать через AND: [DEBITOR].D_UBJH ="20" AND [DEBITOR].D_UBJJ="14"
...
Рейтинг: 0 / 0
12.09.2019, 09:45
    #39860712
Помогите оптимизировать запрос
argnisВ них хранится значение даты задолжности D_UBJH [столетие - 19 или 20], D_UBJJ[Год - от 1 до 99], D_UBMM[Месяц - от 1 до 12], D_UBTT [День - от 1 до 31] Интересно, это вы придумали такой изощренный способ хранения даты? Да еще и в текстовых полях. Хранение даты в одном индексированном поле типа "Дата/Время" удобнее во всех отношениях и без проблем можно получить любой компонент даты.
...
Рейтинг: 0 / 0
12.09.2019, 10:08
    #39860724
argnis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
Кривцов АнатолийargnisВ них хранится значение даты задолжности D_UBJH [столетие - 19 или 20], D_UBJJ[Год - от 1 до 99], D_UBMM[Месяц - от 1 до 12], D_UBTT [День - от 1 до 31] Интересно, это вы придумали такой изощренный способ хранения даты? Да еще и в текстовых полях. Хранение даты в одном индексированном поле типа "Дата/Время" удобнее во всех отношениях и без проблем можно получить любой компонент даты.
База создавалась очень давно и что-то менять в ней я не имею права
...
Рейтинг: 0 / 0
12.09.2019, 10:13
    #39860728
argnis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
MrShin
Код: sql
1.
FROM DEBITOR, TIT


Не делайте так, если вы действительно не хотите получить декартово произведение строк. Перепишите через нормальный JOIN и проверьте наличие индексов по всем полям, входящим в джоин и WHERE

Я проверял, JOIN работает нереально медленно. И индексов почти нет, я не могу менять базу.
...
Рейтинг: 0 / 0
12.09.2019, 10:35
    #39860753
Stanislav P
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
Кривцов АнатолийИнтересно, это вы придумали такой изощренный способ хранения даты? Да еще и в текстовых полях. Хранение даты в одном индексированном поле типа "Дата/Время" удобнее во всех отношениях и без проблем можно получить любой компонент даты.
Я бы использовал DOUBLE поле, с ним меньше проблем при индексировании, при создании запросов, даже не нужно думать о формате даты.
...
Рейтинг: 0 / 0
12.09.2019, 12:46
    #39860849
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
Кривцов АнатолийИнтересно, это вы придумали такой изощренный способ хранения даты? Да еще и в текстовых полях. Хранение даты в одном индексированном поле типа "Дата/Время" удобнее во всех отношениях и без проблем можно получить любой компонент даты.argnis....База создавалась очень давно и что-то менять в ней я не имею праваargnisПомогите оптимизировать запрос.... На не правильно созданной таблице .
Без её изменения,как не изощряйся,ничего путного не выйдет
...
Рейтинг: 0 / 0
12.09.2019, 15:16
    #39861016
argnis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
sdkuКривцов АнатолийИнтересно, это вы придумали такой изощренный способ хранения даты? Да еще и в текстовых полях. Хранение даты в одном индексированном поле типа "Дата/Время" удобнее во всех отношениях и без проблем можно получить любой компонент даты.argnis....База создавалась очень давно и что-то менять в ней я не имею праваargnisПомогите оптимизировать запрос.... На не правильно созданной таблице .
Без её изменения,как не изощряйся,ничего путного не выйдет


Stanislav P очень хорошую идею подкинул, за что ему спасибо
...
Рейтинг: 0 / 0
12.09.2019, 15:55
    #39861040
Помогите оптимизировать запрос
Stanislav PЯ бы использовал DOUBLE поле, с ним меньше проблем при индексировании, при создании запросов, даже не нужно думать о формате даты.
argnisStanislav P очень хорошую идею подкинул, за что ему спасибо
И чем хороша идея? В Аксе поле "Дата/Время" это то же DOUBLE, с таким же индексированием, но значения отображаются как дата. Все что изменится при использовании типа DOUBLE, это, например, число 43720 вместо 12.09.19 или (еще круче) 43720.6625810185 вместо 12.09.19 15:54:07.
Это сильно удобно? А если надо отобрать записи за последний месяц, надо знать числовые эквиваленты начальной и конечной даты

Кстати, конструкция WHERE [ПолеТипаДата] = 43720 вполне работоспособна и вернет всё с датой 12.09.19.

На всякий случай:
Код: vbnet
1.
2.
?Cdbl(Date())
 43720 
...
Рейтинг: 0 / 0
12.09.2019, 16:36
    #39861080
argnis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
Кривцов Анатолий,

Идея хорошая для моего задания, так как я работю с тем, что есть. Правки в базу вносить не могу. Формат даты определен так, как он есть.
...
Рейтинг: 0 / 0
12.09.2019, 16:46
    #39861090
argnis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
Подкиньте пожалуйста идею, как реализовать запрос. Таблицы нарисованы к EXCEL.
...
Рейтинг: 0 / 0
12.09.2019, 16:46
    #39861091
argnis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
Забыл файл
...
Рейтинг: 0 / 0
12.09.2019, 17:33
    #39861112
Stanislav P
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
Кривцов Анатолий,

Double всегда double, а дата/время в Access вариативно и зависит от фаз луны, региональных настроек и настроения очередного индуса в команде разработки MS Access.
Я как-то натолкнулся на проблему с типом поля дата/время. Потом кто-то из гуру по Акссесу то ли в статье, то ли в книге об этом писал.
По той же самой причине я не использую boolean поле, а вместо него integer с проверкой ввода на 0 и -1.
...
Рейтинг: 0 / 0
12.09.2019, 17:37
    #39861114
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
sdkuargnisПомогите оптимизировать запрос.... На не правильно созданной таблице .Без её изменения,как не изощряйся,ничего путного не выйдет
argnisПодкиньте пожалуйста идею, как реализовать запрос....Все это сильно напоминает циклическую ссылку
...
Рейтинг: 0 / 0
13.09.2019, 10:00
    #39861323
argnis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
sdku,

Просто прошлый запрос я не правильно составил, он не учитывал то, что вo второй таблице не все ключи из первой. К сожалению, LEFT JOIN работает очень медленно. Думаю, как обойтись без него.
...
Рейтинг: 0 / 0
13.09.2019, 12:01
    #39861419
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запрос
argnis,
в данном случае словосочетание "циклическая ссылка" применена не к коду а к Вашему вопросу:
-помогите оптимизировать запрос
-не меняя таблицу ничего не выйдет
-ну подкиньте идею,только ничего не меняйте
замкнутый круг,однако
(разве что,пользуясь DateSerial, создать в запросе поле с датой и производить отбор по нему-но вряд ли это сильно что-то изменит)
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Помогите оптимизировать запрос / 24 сообщений из 24, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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