2015-09-18 2 views
2

У меня есть запрос простого подсчета на таблицу. Как показано ниже снимок экрана, в таблице нет первичного ключа, за исключением того, что один индекс находится в другом столбце.Стоимость простого подсчета запросов

Как я могу уменьшить стоимость этого запроса?

enter image description here

Фактический запрос: enter image description here

Нет разницы в стоимости даже после того, как я создал дополнительный индекс transactionno колонка. Таблица имеет 45 столбцов. Общий размер таблицы составляет 520 МБ.

CREATE TABLE TBL_COUNT 
    ( ROW_NUMBER NUMBER(22,0) NOT NULL ENABLE, 
    DATECREATED TIMESTAMP (6), 
    TRANSACTIONDATE VARCHAR2(64), 
    TRANSACTIONTIME VARCHAR2(64), 
    TRANSACTIONNO VARCHAR2(100), 
    FIRST_NAME VARCHAR2(100), 
    LAST_NAME VARCHAR2(100), 
    REG_NO VARCHAR2(30), 
    EMAIL VARCHAR2(100), 
    PURCHASE_TYPE VARCHAR2(50), 
    RA_STATUS VARCHAR2(50), 
    BSCS_CODE VARCHAR2(20), 
    ORACLE_ITEM_CODE VARCHAR2(100), 
    ORACLE_PACKAGE_CODE VARCHAR2(100), 
    SKU_CODE VARCHAR2(50), 
    ITEM_DESCRIPTIONS VARCHAR2(100), 
    MSISDN VARCHAR2(150), 
    QUANTITY NUMBER(22,0), 
    UNIT_PRICE NUMBER(22,2), 
    SERVICE_TAX NUMBER(22,2), 
    TOTAL_PRICE NUMBER(22,2), 
    PAYMENT_METHOD VARCHAR2(50), 
    PAYMENT_CHANNEL VARCHAR2(50), 
    PAYMENT_MERCHANT_ID VARCHAR2(50), 
    REGISTER_REGION VARCHAR2(30), 
    AR_INTERFACESTATUS VARCHAR2(30), 
    PAYMENT_STATUS VARCHAR2(30), 
    PAYMENT_DATE VARCHAR2(64), 
    PAYMENT_TIME VARCHAR2(64), 
    ISSUING_BANK VARCHAR2(50), 
    CREDIT_CARD_NO VARCHAR2(50), 
    CREDIT_CARD_REASON_CODE VARCHAR2(100), 
    BANK_APPROVAL_CODE VARCHAR2(30), 
    BANK_REGISTER_REGION VARCHAR2(30), 
    BANK_REF_NO VARCHAR2(30), 
    PRIMARY_CONTACT_NO VARCHAR2(30), 
    ALTERNATE_CONTACT_NO VARCHAR2(30), 
    REFERENCE_CONTACT_NO VARCHAR2(30), 
    PRODUCT_UID VARCHAR2(30), 
    BANK_BIN VARCHAR2(50), 
    SETTLEMENT_DATE TIMESTAMP (3), 
    SKU_TYPE VARCHAR2(50), 
    EXTERNAL_ORDER_NUMBER VARCHAR2(64), 
    GST_TAX_AMOUNT NUMBER(22,2), 
    GST_TAX_CODE VARCHAR2(255) 
    ) TABLESPACE TS ; 

    CREATE INDEX USER.TBL_COUNT_INDEX ON USER.TBL_COUNT (DATECREATED) 
    TABLESPACE TS_IDX ; 
+0

Почему вы делаете 'count (*)' на 1,5 миллиона строк таблицы достаточно часто, чтобы заботиться о производительности запроса? Вероятно, вряд ли будет более эффективный подход, чем сканирование таблицы, если вы не хотите определять первичный ключ (который вам все равно нужен). Вы могли бы распараллелить запрос, который заставит его вернуться быстрее, но это также приведет к тому, что он будет потреблять больше ресурсов на сервере. –

+0

Обновлено quetion .. Пожалуйста, предложите на этом. –

+0

Ваше изменение не отображает индекс на 'transactionNo'. Вы уверены, что создали этот индекс? –

ответ

0

Любой индекс может быть использован для подсчета, до тех пор, как он основан на колонке с ограничениями, чтобы быть NOT NULL, или если иным образом гарантируется для хранения значения для каждой строки - например, растровый индекс или индекс (my_column, 0).

В качестве альтернативы вы можете получить примерное количество строк, используя предложение SAMPLE.

Редактировать: Вы говорите, что вы создали индекс на транзакции, и, как показывает DDL, это не ограничено значением NOT NULL. Либо создайте индекс в ROW_NUMBER (единственный столбец, который не равен NULL), либо создайте индекс на основе функции (transactionno, 0)

+0

Дело в том, что я ищу план объяснения для другой таблицы для одного и того же запроса. Стоимость его меньше, так как она использует первичный ключ. Даже после того, как я создал первичный ключ в одной таблице, но не улучшился, вы получите такую ​​же стоимость. –

+0

Пожалуйста, покажите определения таблиц и индексов - кстати, вы говорите в своем вопросе, что вы создали индекс, а не первичный ключ. –

+0

Я создал первичный ключ, но когда не нашел улучшения в стоимости, я отказался от этого. –

Смежные вопросы