Конференция "Прочее" » А Ораклоиды здесь есть?
 
  • Рваный Башмак (10.05.08 19:52) [0]
    Таблица движения товара
    CREATE TABLE wh_goods
       (dtsave                         DATE,
       id_sys_operations              NUMBER,
       id_goods                       NUMBER,
       nvalue                         NUMBER NOT NULL,
       nsum                           NUMBER(10,2),
       id_doc                         NUMBER NOT NULL,
       id_discountsreasons            NUMBER)
     PCTFREE     10
     PCTUSED     40
     INITRANS    1
     MAXTRANS    255
     TABLESPACE  system
     STORAGE   (
       INITIAL     458752
       MINEXTENTS  1
       MAXEXTENTS  2147483645
     )
     NOCACHE
     MONITORING
    /

    -- Indexes for WH_GOODS

    CREATE INDEX i_wh_goods ON wh_goods
     (
       id_goods                        ASC,
       dtsave                          ASC
     )
     PCTFREE     10
     INITRANS    2
     MAXTRANS    255
     TABLESPACE  system
     STORAGE   (
       INITIAL     65536
       MINEXTENTS  1
       MAXEXTENTS  2147483645
     )
    /

    -- Foreign Key
    ALTER TABLE wh_goods
    ADD CONSTRAINT fk_wh_goods_goods FOREIGN KEY (id_goods)
    REFERENCES goods (id) ON DELETE CASCADE
    /



    Функция для получения остатков на дату:
    CREATE OR REPLACE
    FUNCTION get_goods_rest (pid_goods IN NUMBER, pdt IN DATE)
      RETURN NUMBER
    IS
      aresult   NUMBER;
    BEGIN
      SELECT NVL (SUM (nvalue), 0)
        INTO aresult
        FROM wh_goods
       WHERE id_goods = pid_goods AND dtsave <= pdt;
      RETURN aresult;
    EXCEPTION
      WHEN NO_DATA_FOUND
      THEN
         RETURN 0;
    END;
    /



    16 тыс. позиций в номенклатуре, запрос на получение остатков работает не так уж и быстро.

    Возможно ли это соптимизировать каким-либо образом? Переписать функцию получения остатков или неправильное проектирование?
  • Loginov Dmitry © (10.05.08 22:09) [1]
    Для каждого из 16 тыс. товаров отдельно пересчитывать остаток - жжесть!
  • Loginov Dmitry © (10.05.08 22:26) [2]
    Если для каждого из 16 тыс товаров нужно получить остаток, то может что-то типа этого:


    SELECT g.id_goods, SUM(g.nvalue), SUM(g.nvalue * g.nsum)
    FROM wh_goods g
    WHERE g.dtsave <= pdt
    GROUP BY g.id_goods



    Но в любом случае непонятно, где же тут запрос на получение остатков? Где учитывается вид движения (приход/расход)?
 
Конференция "Прочее" » А Ораклоиды здесь есть?
Есть новые Нет новых   [134435   +9][b:0][p:0.002]