[ТЕМА ЗАКРЫТА]
07.07.2006 09:27
Mtirt
 
Так сложилось, что в базе данных достаточно много дисконтных карт (около 200 000). УКМ4 достаточно долго осуществляет поиск дисконтных карт. Может кто-то сталкивался с подобной проблемой? Какие пути решения вы можете предложить?
10.07.2006 11:46
junior
 
Конфигурация кассы p166/32mb/20Gb

SELECT card_type, name, receipt_amount, classif, modificator FROM disc_std2perscard WHERE (card_code = '365001734' and type = 0) OR ('365001734' like concat(card_code, '%') and type = 1) order by type, card_code desc;

Время выполнения 29-35 секунд.
10.07.2006 12:10
OlegON
 
А если optimize table сделать?
10.07.2006 12:13
Mtirt
 
Не помогает. Делали. Карт около 200000. Пробовали и с 64Mb памяти. Скорость та же.
10.07.2006 12:26
OlegON
 
Проц или винт кладется? Извиняюсь, нет у меня базы УКМки под рукой, чтобы погонять.
10.07.2006 12:28
Mtirt
 
Винт. Просто там всегда идет полное сканирование таблицы. Из-за второго условия в запросе. И индекс никак не используется при этом.
10.07.2006 12:47
OlegON
 
А такой запрос работает? Быстрее/медленнее?
SELECT card_type, name, receipt_amount, classif, modificator
FROM disc_std2perscard
WHERE
(card_code = '365001734' and type = 0)
OR ((instr(card_code, '365001734')=1) and type = 1);
10.07.2006 13:10
Mtirt
 
В 2 раза быстрее. правда 15 секунд - это тоже много...
10.07.2006 13:16
OlegON
 
order by влияет? или только замена на instr такой эффект дает?
10.07.2006 13:20
Mtirt
 
И то, и другое, причем где-то 50/50.
10.07.2006 13:45
OlegON
 
А так?

SELECT card_type,
name,
receipt_amount,
classif,
modificator
FROM disc_std2perscard
WHERE card_code = '365001734' and type = 0
OR
card_code between substring('365001734',1,1)
and '365001734'
and type = 1
order by type, card_code desc;
10.07.2006 13:53
Mtirt
 
А так работает неправильно. Выдал 3 записи. Зато время 0,31 секунда
10.07.2006 16:09
shebdim
 
по идее достаточно создать новый индекс
Код:
alter table disc_std2perscard add index foo (type, card_code desc)
. однако в силу ограничений индексов, они всегда хранятся как asc, поэтому без адаптации кода, который сможет работать с запросом
Код:
SELECT card_type, name, receipt_amount, classif, modificator FROM disc_std2perscard WHERE (card_code = '365001734' and type = 0) OR ('365001734' like concat(card_code, '%') and type = 1) order by type, card_code
(без desc в конце) не обойтись. если время работы такого запроса вас устроит, то можно поправить и код. соответственно в ближайшей версии выдет.

то есть:
создайте индекс
дайте запрос без desc
сообщите время
10.07.2006 17:32
OlegON
 
А что если так?
Код:
SELECT card_type,
name,
receipt_amount,
classif,
modificator
FROM disc_std2perscard
WHERE card_code = '365001734' and type = 0
OR
card_code between '365001734'
and concat('365001734','zzzzzzzzzz')
and type = 1
order by type, card_code desc;
10.07.2006 17:39
Mtirt
 
Цитата:
shebdim по идее достаточно создать новый индекс
Код:
alter table disc_std2perscard add index foo (type, card_code desc)
. однако в силу ограничений индексов, они всегда хранятся как asc, поэтому без адаптации кода, который сможет работать с запросом
Код:
SELECT card_type, name, receipt_amount, classif, modificator FROM disc_std2perscard WHERE (card_code = '365001734' and type = 0) OR ('365001734' like concat(card_code, '%') and type = 1) order by type, card_code
(без desc в конце) не обойтись. если время работы такого запроса вас устроит, то можно поправить и код. соответственно в ближайшей версии выдет.

то есть:
создайте индекс
дайте запрос без desc
сообщите время
Индекс создавать пробовали, правда без desc. Индекс данным запросом не используется вообще.
10.07.2006 17:41
Mtirt
 
Цитата:
olegon А что если так?
Код:
SELECT card_type,
name,
receipt_amount,
classif,
modificator
FROM disc_std2perscard
WHERE card_code = '365001734' and type = 0
OR
card_code between '365001734'
and concat('365001734','zzzzzzzzzz')
and type = 1
order by type, card_code desc;
Работает. 0,12 секунды. на 32Мб. Как бы УКМ4 быстро поменять?
10.07.2006 17:49
OlegON
 
Результат верный? А то у нас с shebdim тут разногласия *05
10.07.2006 17:52
Mtirt
 
Проверила и для карты и для префикса. Выдает 1 запись. Вроде верно.
10.07.2006 17:54
Mtirt
 
Цитата:
shebdim по идее достаточно создать новый индекс
Код:
alter table disc_std2perscard add index foo (type, card_code desc)
. однако в силу ограничений индексов, они всегда хранятся как asc, поэтому без адаптации кода, который сможет работать с запросом
Код:
SELECT card_type, name, receipt_amount, classif, modificator FROM disc_std2perscard WHERE (card_code = '365001734' and type = 0) OR ('365001734' like concat(card_code, '%') and type = 1) order by type, card_code
(без desc в конце) не обойтись. если время работы такого запроса вас устроит, то можно поправить и код. соответственно в ближайшей версии выдет.

то есть:
создайте индекс
дайте запрос без desc
сообщите время
0,30 сек. То есть в 100 раз быстрее.
10.07.2006 17:56
shebdim
 
Цитата:
Mtirt Индекс создавать пробовали, правда без desc. Индекс данным запросом не используется вообще.
новый индекс может использоваться только в том случае, когда запрос выполняется без обратной сортировки.

тот запрос который вы просите вставить в код содержит ошибку, хотя и работает очень быстро.
10.07.2006 17:59
Mtirt
 
В чем кокретно ошибка? Может у меня она просто не проявится, в силу особенности данных?
10.07.2006 18:03
shebdim
 
неверно обрабатываются префиксы карт, в вашем случае они видимо попросту не используются. то есть случай когда скидка даётся не просто на карту, а на все карты которые начинаются с какого-то номера.

если ошибку исправить, то становится опять медленно.
10.07.2006 18:04
Mtirt
 
Я выше писала. Префиксы я проверила. Обрабатываются нормально. Правда я шаблоны ввода порезала - оставила только, чтобы сам префикс и передавался.
10.07.2006 18:10
shebdim
 
Цитата:
Mtirt Я выше писала. Префиксы я проверила. Обрабатываются нормально. Правда я шаблоны ввода порезала - оставила только, чтобы сам префикс и передавался.
я допускаю, что мы говорим про разные префиксы, те которые записаны с type=1 в принципе не могут быть обработаны. то есть результат запроса должен дать следующие данные:
  • точные совпадения номера карты
  • частичные совпадения, начиная с самых полных совпадений
10.07.2006 18:26
OlegON
 
Mtirt, подтверждаю, работать будет не у всех. *11
10.07.2006 19:40
Mtirt
 
Но и вариант предложенный выше shebdim меня бы вполне устроил. Если быстро какой-нибудь патчик получить. Например в течение завтрашнего дня. Никак нельязя оргнизовать?
11.07.2006 09:13
OlegON
 
Насчет патчика не знаю, мне тут подсказали еще один вариант :) Я все таки сторонник правильного кода, а не его доводки со стороны. Что так дает?
Код:
SELECT card_type, 
       name, 
       receipt_amount, 
       classif, 
       modificator 
  FROM disc_std2perscard 
 WHERE card_code = '365001734' and type = 0
      OR 
      card_code between substring('365001734',1,1)
                    and '365001734' 
  and instr('365001734', card_code)=1
  and type = 1 
order by type, card_code desc;
11.07.2006 09:34
Mtirt
 
Вроде тоже работает. 0,37 секунд.
11.07.2006 09:36
Mtirt
 
Про патчик кого мучить? Фамилию хочу, с кем общаться?
11.07.2006 09:39
OlegON
 
Не бойся, кому надо уже знает. Если хочешь пробивать самостоятельно, код я тебе сделал - вперед, к менеджеру...
Изображения
Тип файла: jpg mxl.jpg (83.8 Кб, 513 просмотров)
Тип файла: jpg mxl.jpg (83.8 Кб, 513 просмотров)


Опции темы


Часовой пояс GMT +3, время: 02:14.

 

Форум сделан на основе vBulletin®
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot и OlegON
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.