2012-12-24 40 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代替函数调用,则将使用单个整体(预期效率最高的)查询执行计划。