powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Нужна помощь с оптимизацией запросa
15 сообщений из 15, страница 1 из 1
Нужна помощь с оптимизацией запросa
    #33772774
antand
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ASA 7.0.4
Есть таблица A:
id - код строки, первичный ключ
GOODGRPID - код товара(есть индекс)
dateedit - дата изменения записи, datetime
price - цена товара
Записей в таблице уже более 60000

Нужно сделать быструю выборку во временную таблицу #B
GOODGRPID - код товара, первичный ключ
dateedit - дата последней записи
price - цена в последней записи

В процедуре таблица #B сейчас заполняется следующим образом:
insert into #B(GOODGRPID,DATEEDIT)
select GOODGRPID,max(DATEEDIT) from A
group by GOODGRPID
update #CUSTGOODS set PRICE = A.PRICE from
A where A.GOODGRPID = #B.GOODGRPID and
A.DATEEDIT = #B.DATEEDIT

Структура не моя и править могу только процедуру этого заполнения.
Пока записей в А было до 30000 скорость устраивала.
Сейчас притормаживает и в будущем объем будет только расти.
Повторю, интересует именно наилучший запрос по скорости для заполнения #B
...
Рейтинг: 0 / 0
Нужна помощь с оптимизацией запросa
    #33772781
Фотография Рыжий Кот
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а индексы можете добавлять?
...
Рейтинг: 0 / 0
Нужна помощь с оптимизацией запросa
    #33772784
antand
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, с базой могу делать все.
Не могу править в клиенте ничего, который выдает вызов процедуры.
...
Рейтинг: 0 / 0
Нужна помощь с оптимизацией запросa
    #33772796
Фотография Рыжий Кот
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а на дату индекс пробовали?
...
Рейтинг: 0 / 0
Нужна помощь с оптимизацией запросa
    #33772826
antand
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Рыжий Кота на дату индекс пробовали?
Пробовал, но помогает слабо. Там timestamp.

Я уже о триггере подумываю, чтобы при изменении записи в A где-то помечать последнюю запись для каждого товара, чтобы от группировки отказаться.
...
Рейтинг: 0 / 0
Нужна помощь с оптимизацией запросa
    #33772842
antand
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу прошения. Допустил ошибку в тексте процедуры.
Так верно

insert into #B(GOODGRPID,DATEEDIT)
select GOODGRPID,max(DATEEDIT) from A
group by GOODGRPID
update #B set PRICE = A.PRICE from
A where A.GOODGRPID = #B.GOODGRPID and
A.DATEEDIT = #B.DATEEDIT
...
Рейтинг: 0 / 0
Нужна помощь с оптимизацией запросa
    #33773272
antand
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну так как предложений новых нет ни у кого?
Может кто ускорял подобное?
Мне почему-то кажется что с подобной структурой данных, простое изменение текста запроса не спасет.
Предложение есть такое:
Добавить еще одну таблицу как #B и в триггере на таблице A ее править.
...
Рейтинг: 0 / 0
Нужна помощь с оптимизацией запросa
    #33773314
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Индексы делать надо, индексы.
Сделай один индекс на две колонки (GOODGRPID, DATEEDIT) и усе...

--
http://www.rusug.ru] Портал рускоязычной группы пользователей Sybase
...
Рейтинг: 0 / 0
Нужна помощь с оптимизацией запросa
    #33773605
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Думаю, что это направление верное: "Добавить еще одну таблицу как #B и в
триггере на таблице A ее править.".
Триггер будет простейший, и в дальнейшем, увеличение объема таблицы А хоть
до 1000000 никак не скажется на времени выборок из В. Запросы будут летать.
Главное в этом деле не облажаться и хорошо отладить триггеры (удаление из А
возможно?), чтоб целостность данных была.


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Нужна помощь с оптимизацией запросa
    #33773633
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iLLer
Думаю, что это направление верное: "Добавить еще одну таблицу как #B и в
триггере на таблице A ее править.".
Триггер будет простейший, и в дальнейшем, увеличение объема таблицы А хоть
до 1000000 никак не скажется на времени выборок из В. Запросы будут летать.
Главное в этом деле не облажаться и хорошо отладить триггеры (удаление из А
возможно?), чтоб целостность данных была.
Поддерживаю. Только еще в #B не забыть добавить поле price, чтобы вообще к таблице A обращений не было лишних. На триггерах реализуется элементарно, производительность не пострадает по той простой причине, что операция обновления каталога цен достаточно редкая, гораздо реже, чем операция получения текущей цены ;)

По идее получится триггер на таблицу A для 7-ой версии:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
CREATE TRIGGER CalcLastPrice AFTER INSERT, UPDATE, DELETE
ON "A"
REFERENCING NEW AS NewValue OLD AS OldValue
FOR EACH ROW
BEGIN
  DECLARE @goodsgrpip unsigned int;
  DECLARE @dateedit timestamp;
  DECLARE @price money;

  SET @goodsgrpid = IF INSERTING THEN 
      NewValue.goodgrpid
    ELSE 
      OldValue.goodgrpid
    ENDIF;

  SELECT dateedit, price
  INTO @dateedit, @price
  FROM A
  WHERE goodgrpid = @goodgrpid AND
        dateedit = (
          SELECT Max(dateedit) 
          FROM A 
          WHERE goodgrpid = @goodgrpid )


  UPDATE B
  SET dateedit = @dateedit,
      price = @price
  WHERE goodgrpid = @goodgrpid;

  IF @@ROWCOUNT =  0 
  THEN
    INSERT INTO B (goodsgrpid, dateedit, price)
    VALUES (@goodsgrpid, @dateedit, @price);
  END IF;
END;
и короче для 9-ой версии:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
CREATE TRIGGER CalcLastPrice AFTER INSERT, UPDATE, DELETE
ON "A"
REFERENCING NEW AS Inserted OLD AS Deleted
FOR EACH STATEMENT
BEGIN
  INSERT INTO B WITH AUTO NAME ON EXISTING UPDATE
    SELECT goodsgrpid, dateedit, price
    FROM A a
      INNER JOIN (
        SELECT goodsgrpid, Max(dateedit) AS last_dateedit
        FROM A
        GROUP BY goodsgrpid
      ) AS l ON l.goodsgrpid = a.goodsgrpid AND
                l.last_dateedit = a.dateedit
    WHERE a.goodsgrpid IN (
            SELECT goodsgrpid
            FROM Inserted
            UNION ALL
            SELECT goodsgrpid
            FROM Deleted );
END;

Естественно подразумевается, что у таблицы B первичным ключом будет поле goodsgrpid.
...
Рейтинг: 0 / 0
Нужна помощь с оптимизацией запросa
    #33774038
antand
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все ребята, всем огромное спасибо.
Я в том же направлении думал(про триггер), хотел от знающих людей мнение услышать. У меня в базе уже есть подобные вещи на таблицах оборотов товаров, правда там все сложнее, но принцип тот же. Здесь все попроще, думал оптимизацией запроса обойтись, но от судьбы не уйдешь, придется на триггере делать.
Ну целостность данных, мы конечно учтем, тем более, что таблица A в репликациях.
...
Рейтинг: 0 / 0
Нужна помощь с оптимизацией запросa
    #33774060
Фотография Александр Гoлдун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
antand пишет:
> товаров, правда там все сложнее, но принцип тот же. Здесь все попроще,
> думал оптимизацией запроса обойтись, но от судьбы не уйдешь, придется на
> триггере делать.

Так все-таки, составной индекс на 2 колонки GOODGRPID, DATEEDIT пробовал
или нет?
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Нужна помощь с оптимизацией запросa
    #33774145
antand
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Александр Гoлдун
antand пишет:
> товаров, правда там все сложнее, но принцип тот же. Здесь все попроще,
> думал оптимизацией запроса обойтись, но от судьбы не уйдешь, придется на
> триггере делать.

Так все-таки, составной индекс на 2 колонки GOODGRPID, DATEEDIT пробовал
или нет?
Posted via ActualForum NNTP Server 1.3

Пробовал, тоже само по производительности.
План запроса тот же. Дело наверно в колонке DateEdit, т.к. там реальный timestamp.
...
Рейтинг: 0 / 0
Нужна помощь с оптимизацией запросa
    #33774295
Фотография Александр Гoлдун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
antand пишет:

>> Так все-таки, составной индекс на 2 колонки GOODGRPID, DATEEDIT пробовал
>> или нет?

> Пробовал, тоже само по производительности.
> План запроса тот же. Дело наверно в колонке DateEdit, т.к. там реальный
> timestamp.

И что? Как раз его селективность будет очень хорошей в таком случае и
как минимум во второй выборке он будет идеален. CREATE STATISTICS
попробуй и еще раз глянь планы.
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Нужна помощь с оптимизацией запросa
    #33774318
antand
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Александр Гoлдун
antand пишет:

>> Так все-таки, составной индекс на 2 колонки GOODGRPID, DATEEDIT пробовал
>> или нет?

> Пробовал, тоже само по производительности.
> План запроса тот же. Дело наверно в колонке DateEdit, т.к. там реальный
> timestamp.

И что? Как раз его селективность будет очень хорошей в таком случае и
как минимум во второй выборке он будет идеален. CREATE STATISTICS
попробуй и еще раз глянь планы.
Posted via ActualForum NNTP Server 1.3
Хорошо, я попробую еще раз этот путь. Все внимательно посмотрю.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Нужна помощь с оптимизацией запросa
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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