SELECT COUNT(*)
FROM BOM_BILL_OF_MATERIALS BOM /* NEEDED TO GET ORG_ID */ ,
BOM_INVENTORY_COMPONENTS BIC ,
MTL_SYSTEM_ITEMS_B_KFV MSI ,
MTL_SYSTEM_ITEMS_TL MSIT ,
FND_COMMON_LOOKUPS FCL ,
MFG_LOOKUPS ML ,
MFG_LOOKUPS ML1
WHERE BIC.BILL_SEQUENCE_ID = BOM.BILL_SEQUENCE_ID
AND BIC.COMPONENT_ITEM_ID = MSI.INVENTORY_ITEM_ID
AND BOM.ORGANIZATION_ID = MSI.ORGANIZATION_ID
AND MSI.INVENTORY_ITEM_ID = MSIT.INVENTORY_ITEM_ID
AND MSI.ORGANIZATION_ID = MSIT.ORGANIZATION_ID
AND MSIT.LANGUAGE = USERENV('LANG')
AND ML.LOOKUP_CODE(+) = BIC.WIP_SUPPLY_TYPE
AND ML.LOOKUP_TYPE(+) = 'WIP_SUPPLY'
AND ML1.LOOKUP_TYPE(+) = 'BOM_ENFORCE_INT_REQUIREMENTS'
AND ML1.LOOKUP_CODE(+) = BIC.ENFORCE_INT_REQUIREMENTS
AND FCL.LOOKUP_TYPE(+) = 'ITEM_TYPE'
AND FCL.LOOKUP_CODE(+) = MSI.ITEM_TYPE
AND FCL.APPLICATION_ID(+) = 401
AND NVL(BIC.ECO_FOR_PRODUCTION,2) = 2
albertachen提到:
SELECT COUNT(*)
FROM BOM_BILL_OF_MATERIALS BOM /* NEEDED TO GET ORG_ID */ , .....
應改成, SELECT COUNT(BOM.BILL_SEQUENCE_ID )
主表格有值欄位找一個就好了, 要那麼多欄位會操死DB
這個答案一定要推...這麼有資料庫概念的Coding, 在當今程式設計師界已經非常少見了!
多謝賽大的推推.....
其實這個答案還有一個一不錯的解決是,
select count(*) ==> select count(1)
任一欄位就算有值, 和只要有資料就算有值, 是相等意義的...
我比較喜歡當幫助程式設計師調校SQL的DBA, 進入我管的資料庫的SQL指令要快進快出, CPU,IO,RAM會大幅下降, 只是當系統沒事的時候, 我就被看似沒價值了, 就是被隱藏的時候了...
現在積極想轉型為解決既有資訊系統疑難雜症的顧問, 及多學點報表設計在大量資料快速撈取展現了我的優勢啦~~
albertachen提到:
AND NVL(BIC.ECO_FOR_PRODUCTION,2) = 2
欄位運算是效能大忌....
AND (BIC.ECO_FOR_PRODUCTION=2 or BIC.ECO_FOR_PRODUCTION is null )
再者是查看相關表格, 相關選擇性高欄位(通常是主鍵欄位)是否建索引...
一般光由SQL來看那個欄位選擇性高是很難,
通常找出前100筆資料, 就可查出那幾個欄位的選擇性高.....