2015-09-18 83 views
2

我有一個簡單計數查詢的表。按照下面的屏幕截圖,除了單個索引位於不同列上以外,表上沒有主鍵。簡單計數查詢的成本

如何降低此查詢的成本?

enter image description here

實際的查詢是: enter image description here

即使以後我創建了transactionno列額外指數的成本沒有什麼區別。該表有45列。表的總大小是520MB。

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

爲什麼要在大約150萬行表上執行「count(*)」往往足以關心查詢的性能?除非你想定義一個主鍵(無論如何你應該這樣做),否則不可能有比進行表掃描更有效的方法。您可能會並行查詢,這會使其返回的更快,但也會導致它在服務器上消耗更多的資源。 –

+0

更新了quetion ..請建議。 –

+0

您的編輯未顯示'transactionNo'上的索引。你確定你創建了這個索引嗎? –

回答

0

任何索引可用於計數,只要它是基於約束的列是NOT NULL,或者如果它是否則保證保持的值的每一行 - 例如位圖索引或(my_column,0)上的索引。

或者,您可以使用SAMPLE子句獲得估計的行數。

編輯:你說你創建了transactionno上的索引,並且因爲DDL顯示不限制爲NOT NULL。要麼在ROW_NUMBER上創建索引(唯一不爲NULL的列),要麼在(transactionno,0)上創建一個基於函數的索引

+0

重點是當我正在尋找其他表的解釋計劃爲相同的查詢..它的成本更少,因爲它使用主鍵。即使在同一張桌子上創建主鍵但沒有改進之後,也會導致相同的成本。 –

+0

請顯示錶格和索引定義 - 按照您在問題中說的方式創建索引,而不是主鍵。 –

+0

我已經創建了主鍵,但是當我發現成本沒有提高時,我放棄了這一點。 –