Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在视图中运行sql查询需要更多时间_Sql Server_Sql Server 2005 - Fatal编程技术网

Sql server 在视图中运行sql查询需要更多时间

Sql server 在视图中运行sql查询需要更多时间,sql-server,sql-server-2005,Sql Server,Sql Server 2005,大家好 我有一个巨大的sql查询。当我把这个查询放在一个存储的进程中时,执行它需要5秒,就像运行一个查询一样,它需要4-5秒,但是当我在一个视图中运行它时,它需要5分钟 请告诉我为什么它在视图中运行得那么慢 sql查询如下: CREATE VIEW dbo.Client_Billing_RS AS SELECT DISTINCT TOP (100) PERCENT CLIENT.OH_Code AS CLIENT, BUYER.OH_Cod

大家好

我有一个巨大的sql查询。当我把这个查询放在一个存储的进程中时,执行它需要5秒,就像运行一个查询一样,它需要4-5秒,但是当我在一个视图中运行它时,它需要5分钟

请告诉我为什么它在视图中运行得那么慢

sql查询如下:

CREATE VIEW dbo.Client_Billing_RS      
AS        
SELECT DISTINCT TOP (100) PERCENT       
CLIENT.OH_Code AS CLIENT,       
BUYER.OH_Code AS BUYER,       
dbo.Client_ReturnWK(pallet.MB_PR_CLOSED_DT) AS WEEKNUM,       
dbo.Client_PadString(DATEPART(MONTH, CONVERT(varchar(8), pallet.MB_PR_CLOSED_DT, 112)), '0', 2) AS MONTH,      
DATEPART(YEAR, CONVERT(varchar(8), pallet.MB_PR_CLOSED_DT, 112)) AS YEAR,      
shipment.JS_ActualVolume,      
shipment.JS_ActualWeight,       
packing.MB_PD_Units ,       
orderHeader.JD_OH_Buyer,       
OrgMiscServ_1.OM_CustomAttrib3,         
shipment.JS_TransportMode AS MODE,       
shipment.JS_UniqueConsignRef ,       
consol.JK_UniqueConsignRef,         
DestRefCountry.RN_Desc,       
part.OP_PartNum,       
part.OP_Desc AS TITLE,       
CONVERT(VARCHAR(8), part.OP_CustomAttrib1, 1) AS COVER_DATE,       
docketLine.WE_CustomDate1 AS ON_SALE_DATE,      
docketLine.WE_CustomAttrib3 AS US_BARCODE,       
part.OP_CustomAttrib3 AS UK_BARCODE,       
CASE WHEN freight IS NULL THEN 0 ELSE freight END AS FREIGHT,       
CASE WHEN war IS NULL THEN 0 ELSE war END AS WAR,       
CASE WHEN fuel IS NULL THEN 0 ELSE FUEL END AS FUEL,       
shipment.JS_ActualChargeable * 1000 AS CHRG_KG,       
shipment.JS_PackingMode,       
'' AS MIN_CHRG,      
BUYER.OH_FullName AS BUYER_NAME,         
CASE WHEN Client_MF_Billing_Job_Cost_PIVOT.FUEL + Client_MF_Billing_Job_Cost_PIVOT.WAR IS NULL         
                      THEN 0 ELSE Client_MF_Billing_Job_Cost_PIVOT.FUEL + Client_MF_Billing_Job_Cost_PIVOT.WAR END AS SUR_AMT1,         
(packing.MB_PD_Units  * part.OP_Weight) * (CASE WHEN rate IS NULL THEN 0 ELSE RATE END + (CASE WHEN JS_TransportMode = 'AIR' THEN CASE WHEN FUEL_LOOKUP IS NULL         
                      THEN 0 ELSE FUEL_LOOKUP END ELSE 0 END)) AS TITLE_AMT,       
consol.JK_CustomDate1 AS LOAD_DATE_OLD,       
docket.WD_DocketID,       
orderHeader.JD_IsCancelled,       
CASE WHEN RATE IS NULL THEN 0 ELSE rate END AS RATE,      
packing.MB_PD_Units  * part.OP_Weight * CASE WHEN Client_Tariff_Job_Rate.RATE IS NULL THEN 0 ELSE rate END AS FRT_AMT,       
part.OP_PK,       
CASE WHEN LEN(part.OP_CustomAttrib2)= 1 THEN '0' + OP_CustomAttrib2 ELSE OP_CustomAttrib2 END AS ISSUE_NUMBERx,      
'9' + LEFT(dbo.Client_PadString(part.OP_CustomAttrib2, '0', 2), 2) AS ISSUE_NUMBER,       
Client_Consol.ETD AS LOAD_DATE,         
CASE WHEN docketLine.WE_CustomAttrib3 IS NULL THEN '' ELSE SUBSTRING(docketLine.WE_CustomAttrib3, 7, 5) END AS UPC_CODE,       
BUYER.OH_PK AS BUYER_PK,       
CLIENT.OH_PK AS CLIENT_PK,       
CASE WHEN LEN(SUBSTRING(part.OP_PartNum,1, CASE WHEN CHARINDEX('-', part.OP_PartNum) > 0 THEN CHARINDEX('-', part.OP_PartNum) - 1 ELSE 0 END))         
     = 0 THEN OU_LocalPartNumber ELSE SUBSTRING(part.OP_PartNum, 1, CASE WHEN CHARINDEX('-',         
                      part.OP_PartNum) > 0 THEN CHARINDEX('-', part.OP_PartNum) - 1 ELSE 0 END) END AS MAG_CODE,      

CASE WHEN JS_TransportMode = 'AIR' THEN (FUEL_LOOKUP) * (ROUND(packing.MB_PD_Units  * part.OP_Weight + .5, 0)) ELSE 0 END AS SUR_AMT,       
CASE WHEN JS_TransportMode = 'AIR' THEN FUEL_LOOKUP ELSE 0 END AS FUEL1,         
Client_Tariff_Job_Rate.WAR_LOOKUP AS SUGGESTED_WAR,       
Client_Tariff_Job_Rate.FUEL_LOOKUP AS SUGGESTED_FUEL,         
Client_Tariff_Job_Rate.SHIPPING_LINE,       
OrgMiscServ.OM_CustomAttrib1,       
OrgMiscServ.OM_CustomDate1,       
CLIENT.OH_PK AS ClientPK,      
part.OP_Weight,       
 packing.MB_PD_Units * part.OP_Weight AS FRT_WEIGHT,      

packing.MB_PD_Units * part.OP_Weight + Client_CHRG_PALLET.PALLET_KG_PORTION AS FRT_WEIGHT_GROSS,         
(packing.MB_PD_Units  * part.OP_Weight + Client_CHRG_PALLET.PALLET_KG_PORTION)         
                      * CASE WHEN Client_Tariff_Job_Rate.RATE IS NULL THEN 0 ELSE rate END AS FRT_AMT_GROSS,      

(packing.MB_PD_Units  * part.OP_Weight + Client_CHRG_PALLET.PALLET_KG_PORTION) * (CASE WHEN rate IS NULL         
                      THEN 0 ELSE RATE END + (CASE WHEN JS_TransportMode = 'AIR' THEN CASE WHEN FUEL_LOOKUP IS NULL         
                      THEN 0 ELSE FUEL_LOOKUP END ELSE 0 END)) AS TITLE_AMT_GROSS,       
orderHeader.JD_PK,       
orderHeader.JD_OrderNumber,         
Client_Tariff_Job_Rate.ONWARD_DELIVERY,         
packing.MB_PD_Units  * part.OP_Weight * CASE WHEN Client_Tariff_Job_Rate.ONWARD_DELIVERY IS NULL         
                      THEN 0 ELSE ONWARD_DELIVERY END AS ONWARD_DELIVERY_AMT,       
docketLine.WE_CustomDecimal4 AS COVER_PRICE,      
CLIENT.OH_FullName,       
(packing.MB_PD_Units  * (part.OP_Weight + 0.009) + Client_CHRG_PALLET.PALLET_KG_PORTION)         
                      * CASE WHEN Client_Tariff_Job_Rate.RATE IS NULL THEN 0 ELSE rate END AS FRT_AMT_GROSS_UPLIFT,         
(packing.MB_PD_Units  * (part.OP_Weight + 0.009) + Client_CHRG_PALLET.PALLET_KG_PORTION)      
                      * (CASE WHEN rate IS NULL THEN 0 ELSE RATE END + (CASE WHEN JS_TransportMode = 'AIR' THEN CASE WHEN FUEL_LOOKUP IS NULL         
                      THEN 0 ELSE FUEL_LOOKUP END ELSE 0 END)) AS TITLE_AMT_GROSS_UPLIFT,         
packing.MB_PD_Units  * (part.OP_Weight + 0.009) AS FRT_WEIGHT_UPLIFT,         
packing.MB_PD_Units  * (part.OP_Weight + 0.009) + Client_CHRG_PALLET.PALLET_KG_PORTION AS FRT_WEIGHT_GROSS_UPLIFT,       
part.OP_Weight + 0.009 AS COPY_KG_UPLIFT,      
(packing.MB_PD_Units  * (part.OP_Weight + 0.009)) * (CASE WHEN rate IS NULL         
                      THEN 0 ELSE RATE END + (CASE WHEN JS_TransportMode = 'AIR' THEN CASE WHEN FUEL_LOOKUP IS NULL         
                      THEN 0 ELSE FUEL_LOOKUP END ELSE 0 END)) AS TITLE_AMT_UPLIFT,       
packing.MB_PD_Units  * (part.OP_Weight + 0.009) * CASE WHEN Client_Tariff_Job_Rate.RATE IS NULL THEN 0 ELSE rate END AS FRT_AMT_UPLIFT,         
packing.MB_PD_Units  * (part.OP_Weight + 0.009) * CASE WHEN Client_Tariff_Job_Rate.ONWARD_DELIVERY IS NULL THEN 0 ELSE ONWARD_DELIVERY END AS ONWARD_DELIVERY_AMT_UPLIFT,    
packing.MB_PR_PalletRef    

FROM Client_whspalletpacking packing WITH (NOLOCK)     
inner join whsDocketLine docketLine WITH (NOLOCK) on  packing.we_fk  =docketline.we_pk      
inner join whsDocket  docket WITH (NOLOCK) on docketline.we_wd =docket.wd_pk      
inner join client_whspallet pallet WITH (NOLOCK) on packing.MB_PD_PR = pallet.MB_PR_PK      
inner join jobshipment shipment WITH (NOLOCK) on packing.mb_js= shipment.js_pk      
inner join jobOrderHeader orderHeader WITH (NOLOCK) on docket.WD_ExternalReference =OrderHeader.JD_OrderNumber      
inner join orgheader Client WITH (NOLOCK) on docket.wd_oh_client= Client.oh_pk      
inner join orgheader Buyer WITH (NOLOCK) on packing.MB_PR_OH=Buyer.oh_pk      
inner join jobconsol consol WITH (NOLOCK) on  packing.mb_jk=consol.jk_pk      
INNER JOIN OrgSupplierPart part WITH (NOLOCK) ON docketline.WE_OP = part.OP_PK      
inner join OrgPartRelation WITH (NOLOCK) on part.op_pk=OrgPartRelation.OU_OP      
LEFT JOIN RefUNLOCO As DestUNLOCO WITH (NOLOCK) On DestUNLOCO.RL_Code = shipment.JS_RL_NKDestination      
LEFT JOIN RefCountry As DestRefCountry WITH (NOLOCK)  On DestRefCountry.RN_PK = DestUNLOCO.RL_RN      
LEFT OUTER JOIN Client_Tariff_Job_Rate WITH (NOLOCK)  ON orderHeader.JD_PK = Client_Tariff_Job_Rate.JOB_ORDER_PK       
LEFT OUTER JOIN Client_MF_Billing_Job_Cost_PIVOT WITH (NOLOCK) ON packing.MB_JH = Client_MF_Billing_Job_Cost_PIVOT.JR_JH      

inner join Client_CHRG_PALLET WITH (NOLOCK) on packing.WE_FK = Client_CHRG_PALLET.WE_FK  and packing.mb_pr_palletref=Client_CHRG_PALLET.mb_pr_palletref ---change    
left outer join OrgMiscServ WITH (NOLOCK) on CLIENT.OH_PK =OrgMiscServ.OM_OH       
inner join OrgMiscServ AS OrgMiscServ_1 WITH (NOLOCK) on BUYER.OH_PK =OrgMiscServ_1.OM_OH      
left outer join Client_Consol  WITH (NOLOCK) on consol.jk_pk=Client_Consol.CONSOL_PK      
where (DestRefCountry.RN_Desc = 'United States')        
ORDER BY CLIENT, TITLE, BUYER, MONTH DESC, WEEKNUM DESC, MODE DESC  

根据你的评论,我怀疑你找到了这个短语

观察。。。左侧连接的WHERE将此更改为连接

LEFT JOIN RefCountry As DestRefCountry...
....
where (DestRefCountry.RN_Desc = 'United States')

根据你的评论,我怀疑你找到了这个短语

观察。。。左侧连接的WHERE将此更改为连接

LEFT JOIN RefCountry As DestRefCountry...
....
where (DestRefCountry.RN_Desc = 'United States')
提示:更换

CASE WHEN freight IS NULL THEN 0 ELSE freight END AS FREIGHT, 

使用存储过程时,执行计划将被编译和存储,因此SQL引擎不必创建它

当您运行这个as查询时,您可能已经在缓存中有了这个计划,这就是为什么执行中没有差异

可能在使用视图时,必须从头开始创建执行计划

提示:更换

CASE WHEN freight IS NULL THEN 0 ELSE freight END AS FREIGHT, 

使用存储过程时,执行计划将被编译和存储,因此SQL引擎不必创建它

当您运行这个as查询时,您可能已经在缓存中有了这个计划,这就是为什么执行中没有差异


可能在使用视图时,必须从头开始创建执行计划

我同意Vash的观点,作为vaiew运行的额外时间可能是由于编译执行计划的额外时间

试着运行这个

Set Statistics Time On
Select * from view

and then Set Statistics On
Exec yourSPHere
你会得到这样的东西

SQL Server解析和编译时: CPU时间=0毫秒,运行时间=1毫秒

SQL Server执行时间:CPU 时间=0毫秒,经过的时间=1毫秒

5475行受影响的表 “ContactBase”。扫描计数1,逻辑 读取428,物理读取0, 预读读取0,lob逻辑读取 0,lob物理读取0,lob 预读为0

SQL Server执行时间:CPU 时间=47毫秒,经过的时间=470毫秒


如果SQL Server解析和编译时间:解释了两次之间的差异,您的答案是,存储过程使用缓存的执行计划时,视图每次都必须创建一个执行计划。

我同意Vash的观点,作为vaiew运行的额外时间可能是由于编译执行计划

试着运行这个

Set Statistics Time On
Select * from view

and then Set Statistics On
Exec yourSPHere
你会得到这样的东西

SQL Server解析和编译时: CPU时间=0毫秒,运行时间=1毫秒

SQL Server执行时间:CPU 时间=0毫秒,经过的时间=1毫秒

5475行受影响的表 “ContactBase”。扫描计数1,逻辑 读取428,物理读取0, 预读读取0,lob逻辑读取 0,lob物理读取0,lob 预读为0

SQL Server执行时间:CPU 时间=47毫秒,经过的时间=470毫秒



如果SQL Server解析和编译时:解释了两次之间的差异,您的答案是,存储过程使用缓存的执行计划时,视图每次都必须创建一个执行计划。

您是否可以向我们展示有问题的代码?除非有更多内容,否则不应该这样做。你能提供代码吗?你在视图上有没有不在其内部的过滤器=?我使用的视图的执行查询是:选择*from Client\u Billing\r,其中weeknum='21'和year='2010'可能与你的问题无关,但排在前100%。。。订购人。。。在一个视图中,它充其量是多余的。它根本不能保证返回的行的顺序。在这种情况下,ORDER BY only用于确定TOP的组成部分。您是否可以向我们展示有问题的代码?除非有更多内容,否则它不应该这样做。你能提供代码吗?你在视图上有没有不在其内部的过滤器=?我使用的视图的执行查询是:选择*from Client\u Billing\r,其中weeknum='21'和year='2010'可能与你的问题无关,但排在前100%。。。订购人。。。在一个视图中,它充其量是多余的。它根本不能保证返回的行的顺序。在这种情况下,ORDER BY only用于确定什么构成回复的TOP感谢,但是它是否每次都从头开始创建执行计划?@Martin-当运行视图中的查询并执行SELECT*from sys.dm_tran_locks,其中resource_database_id='28'并排出现时,我在result@Amit-通常为否。该定义的长度为8081个字符。我似乎记得,对于计划缓存,很长的定义可能会得到不同的处理,但我记不清任何细节。我怀疑这能解释5分钟的差异。@Amit。您需要比较两次运行的实际执行计划,并查看谓词是否在以后应用于视图版本,如gbn的回答所示。如果是这样的话,使用参数化的内联TVF就可以很容易地解决这个问题
回复,但它是否每次都从头开始创建执行计划?@Martin-当在视图中运行查询并从sys.dm_tran_locks执行SELECT*from sys.dm_tran_locks,其中resource_database_id='28'并排出现时,我在result@Amit-通常为否。该定义的长度为8081个字符。我似乎记得,对于计划缓存,很长的定义可能会得到不同的处理,但我记不清任何细节。我怀疑这能解释5分钟的差异。@Amit。您需要比较两次运行的实际执行计划,并查看谓词是否在以后应用于视图版本,如gbn的回答所示。如果是这样的话,使用参数化的内联TVF就可以很容易地解决这个问题?很抱歉,上次的编辑毫无意义。视图无法参数化。@马丁·史密斯:大约3-4分钟,但结构不太复杂。@Vash-好的-我从未经历过这样的事情。但我也不认为我曾经像OP的帖子中那样做过20个表的连接!我想我们得等OP报告回来了。你所见过的编译时间最长的是什么?很抱歉,上次的编辑毫无意义。视图无法参数化。@马丁·史密斯:大约3-4分钟,但结构不太复杂。@Vash-好的-我从未经历过这样的事情。但我也不认为我曾经像OP的帖子中那样做过20个表的连接!我想我们得等OP报告回来。我不知道这个现象有名字。但我同意——看起来过滤可能被推迟了。如果我们能看到这些计划,我们肯定会知道的。我不知道这个现象有名字。但我同意——看起来过滤可能被推迟了。如果我们能看到计划,我们肯定会知道的。