2012-12-24 39 views
3

我有一個sql查詢從視圖中只提取一條記錄。我的觀點是由許多功能組成的。它正在返回大約60,000條記錄。 我想從這個視圖中獲取的最高記錄需要8-9秒。 我如何優化我的視圖,以便最多需要1-2秒。 這裏是我的看法和sql查詢。請幫忙!任何建議都是可觀的。提前致謝。提高從查看提取查詢數據的性能

CREATE View dbo.OMOrderPrePaymentINT  
As  

select 
    dbo.int_payment_customer_number_out('','OMOrderPaymentMasterINT',payment_id) 
    as customer_number,  
    dbo.int_customer_name_out('','OMOrderPaymentMasterINT',payment_id)  
    as customer_name,  
    dbo.int_FormatDate('','OMOrderPaymentMasterINT',document_date)  
    as payment_date,  
    dbo.int_payment_amount_out('','OMOrderPaymentMasterINT',document_amount) 
    as payment_amount,  
    dbo.int_checkbook_id_out('','OMOrderPaymentMasterINT',null)       
    as checkbook_id,  
    dbo.int_cheque_number_out('','OMOrderPaymentMasterINT',payment_id)  
    as cheque_number,  
    dbo.int_cc_type_out ('','OMOrderPaymentMasterINT',payment_id)  
    as cc_type,  
    dbo.int_cc_number_out('','OMOrderPaymentMasterINT',payment_id)  
    as cc_number,  
    dbo.int_cc_authcode_out('','OMOrderPaymentMasterINT',payment_id)  
    as cc_authcode,  
    dbo.int_ach_account_type_out('','OMOrderPaymentMasterINT',payment_id)  
    as ach_account_type,  
    dbo.int_ach_account_number_out('','OMOrderPaymentMasterINT',payment_id)  
    as ach_account_number,  
    dbo.int_ach_authcode_out('','OMOrderPaymentMasterINT',payment_id)  
    as ach_authcode,  
    dbo.int_expiration_date_out('','OMOrderPaymentMasterINT',payment_id)  
    as creditcard_expiration_date,  
    dbo.int_order_payment_type_out('','OMOrderPaymentMasterINT',payment_id)   
    as payment_type,  
    dbo.int_payment_method_out('','OMOrderPaymentMasterINT',payment_id)  
    as payment_method,  
    dbo.int_erp_payment_action_out('','OMOrderPaymentMasterINT',null)  
    as [action],  
    dbo.int_modified_user_id_out('','',null)   
    as modified_user_id,  
    'NOT MAPPED'     
    as void_date,  
    export_completed     
    as exportcompleted,  
    dbo.int_ordergroup_id_out('','OMOrderPaymentMasterINT',payment_id)  
    as ordergroup_id,  
    'ECOM'      
    as USRDEFND1,  
    dbo.int_ResponseToken_out('','OMOrderPaymentMasterINT',payment_id)  
    as USRDEFND4,  
    dbo.int_transaction_id_out('','OMOrderPaymentMasterINT',payment_id)  
    as USRDEFND5 
from PaymentLine 
where dbo.int_exportPayment(payment_id) = 1 

SQL查詢

select top 1 * 
from OMOrderPrePaymentINT 
where ordergroup_id = '943177C1-50B6-4E7C-A442-BA90CF2A03F6'  
order by payment_date desc 

回答

5

哎喲。

用戶定義的函數在SQL服務器中已知爲the worst performance offenders,並且您的視圖使用很多其中。 UDF在row-by-row模式下工作,所以需要一段時間。

嘗試更換儘可能多的人,你可以使用內聯SQL。

1

內聯sql不能做什麼功能?每個函數調用將使用該給定函數的查詢執行計劃。如果使用內聯SQL代替函數調用,則將使用單個整體(預期效率最高的)查詢執行計劃。