Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Нужна помощь с оптимизацией запросa / 15 сообщений из 15, страница 1 из 1
05.06.2006, 16:22
    #33772774
antand
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с оптимизацией запросa
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
05.06.2006, 16:23
    #33772781
Рыжий Кот
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с оптимизацией запросa
а индексы можете добавлять?
...
Рейтинг: 0 / 0
05.06.2006, 16:25
    #33772784
antand
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с оптимизацией запросa
Да, с базой могу делать все.
Не могу править в клиенте ничего, который выдает вызов процедуры.
...
Рейтинг: 0 / 0
05.06.2006, 16:28
    #33772796
Рыжий Кот
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с оптимизацией запросa
а на дату индекс пробовали?
...
Рейтинг: 0 / 0
05.06.2006, 16:36
    #33772826
antand
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с оптимизацией запросa
Рыжий Кота на дату индекс пробовали?
Пробовал, но помогает слабо. Там timestamp.

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

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
05.06.2006, 19:02
    #33773272
antand
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с оптимизацией запросa
Ну так как предложений новых нет ни у кого?
Может кто ускорял подобное?
Мне почему-то кажется что с подобной структурой данных, простое изменение текста запроса не спасет.
Предложение есть такое:
Добавить еще одну таблицу как #B и в триггере на таблице A ее править.
...
Рейтинг: 0 / 0
05.06.2006, 19:25
    #33773314
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с оптимизацией запросa
Индексы делать надо, индексы.
Сделай один индекс на две колонки (GOODGRPID, DATEEDIT) и усе...

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


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
05.06.2006, 23:41
    #33773633
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с оптимизацией запросa
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
06.06.2006, 10:49
    #33774038
antand
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с оптимизацией запросa
Все ребята, всем огромное спасибо.
Я в том же направлении думал(про триггер), хотел от знающих людей мнение услышать. У меня в базе уже есть подобные вещи на таблицах оборотов товаров, правда там все сложнее, но принцип тот же. Здесь все попроще, думал оптимизацией запроса обойтись, но от судьбы не уйдешь, придется на триггере делать.
Ну целостность данных, мы конечно учтем, тем более, что таблица A в репликациях.
...
Рейтинг: 0 / 0
06.06.2006, 10:53
    #33774060
Александр Гoлдун
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с оптимизацией запросa
antand пишет:
> товаров, правда там все сложнее, но принцип тот же. Здесь все попроще,
> думал оптимизацией запроса обойтись, но от судьбы не уйдешь, придется на
> триггере делать.

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

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

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

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

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

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

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

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

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


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