【问题标题】:Query takes long due to using views. How can i merge into simple query?由于使用视图,查询需要很长时间。如何合并到简单查询?
【发布时间】:2019-01-31 19:30:40
【问题描述】:

我有以下使用视图返回数据的查询,但从服务器请求返回似乎需要超过一分钟。

我使用这个代码:

SELECT CROP_CLASS As Closed, SUM(ACREAGE) AS SumofAcreage, SUM(delivered) AS SumofTonnage
FROM dbo.vCurrentParcelStatus 
WHERE CropSeasonsID = @cropseason AND CURRENTSTATUS = '3'
GROUP BY CROP_CLASS
ORDER BY CROP_CLASS ASC

这需要一分钟多的时间,但给了我想要的东西。它从下面的 vCurrentParcelStatus 请求数据:

SELECT     TOP (100) PERCENT dbo.CaneParcel.geoid, MAX(dbo.vCurrentParcelStatusHelp.CurrentStatus) AS CURRENTSTATUS, dbo.CaneParcel.ACREAGE, 
                  dbo.CaneParcel.VARIETY, dbo.CaneParcel.FARMER, dbo.CaneParcel.BRANCH, dbo.CaneParcel.DATE_PLANT, dbo.CaneParcel.CROP_CLASS, 
                  SUM(ROUND(dbo.vCurrentParcelStatusHelp.delivered, 1)) AS delivered, SUM(dbo.vCurrentParcelStatusHelp.number_deliveries) AS number_deliveries, 
                  dbo.CaneParcel.ASSN, dbo.CaneParcel.PRODUCTION, dbo.CaneParcel.REAPING_LE, dbo.vCurrentParcelStatusHelp.parcel_id, 
                  dbo.vCurrentParcelStatusHelp.crop_season, dbo.vCurrentParcelStatusHelp.CropSeasonsID
FROM         dbo.CaneParcel INNER JOIN
                  dbo.vCurrentParcelStatusHelp ON dbo.CaneParcel.FIELD_ID = dbo.vCurrentParcelStatusHelp.parcel_id
GROUP BY dbo.CaneParcel.geoid, dbo.CaneParcel.ACREAGE, dbo.CaneParcel.VARIETY, dbo.CaneParcel.FARMER, dbo.CaneParcel.BRANCH, dbo.CaneParcel.DATE_PLANT, 
                  dbo.CaneParcel.CROP_CLASS, dbo.vCurrentParcelStatusHelp.parcel_id, dbo.CaneParcel.ASSN, dbo.CaneParcel.PRODUCTION, dbo.CaneParcel.REAPING_LE, 
                  dbo.vCurrentParcelStatusHelp.crop_season, dbo.vCurrentParcelStatusHelp.CropSeasonsID
ORDER BY dbo.vCurrentParcelStatusHelp.parcel_id

上面的视图从下面的这个视图(vCurrentParcelStatusHelp)获取数据:

SELECT     TOP (100) PERCENT MAX(parcel_status) AS CurrentStatus, COUNT(tonnage) AS number_deliveries, SUM(tonnage_adjusted) AS delivered, parcel_id, 
                  farmer_owner_bsi, crop_season, CropSeasonsID
FROM         dbo.vDeliveryTons
GROUP BY parcel_id, farmer_owner_bsi, crop_season, CropSeasonsID
ORDER BY parcel_id

我尝试了这个查询,但它没有给我相同的结果:

Select 
   CaneParcel.Crop_Class As Closed, 
   Sum(CaneParcel.Acreage) as SumOfTonnage,
   Sum(DeliveryTons.tonnage_adjusted) as SumOfTonnage
From 
    CaneParcel Left Join
    DeliveryTons On DeliveryTons.parcel_id  = CaneParcel.Field_ID Left Join
    FarmerGroups f On f.farmer_bsi = DeliveryTons.farmer_bsi Join
   (Select Distinct DeliveryTons.parcel_id From DeliveryTons Where parcel_status = 3 AND crop_season=3 and remarks = '') c On c.parcel_id = CaneParcel.Field_ID
Group By 
   CaneParcel.Crop_Class

DeliveryTons 表

id  crop_season parcel_id   reaping_code    farmer_pay_bsi  tonnage tonnage_adjusted    grabs   parcel_status   rejected    remarks delivery_status
77701   1   038-0358    CGP001  2064    15.3625 15.3625 34.00   2   2       P
77702   1   038-0358    CGP001  2064    17.4625 17.4625 43.50   2   2       P
77703   1   038-0358    CGP001  2064    13.5875 13.5875 30.00   2   2       P
77704   1   038-0358    CGP001  2064    19.0250 19.0250 44.00   2   2       P
77705   1   038-0358    CGP001  2064    19.6375 19.6375 45.50   2   2       P
77706   1   038-0358    CGP001  2064    16.2125 16.2125 36.50   2   2       P
77707   1   038-0358    CGP001  2064    22.5375 22.5375 55.00   2   2       P
77708   1   038-0358    CGP001  2064    18.1000 18.1000 38.00   2   2       P
77709   1   038-0358    CGP001  2064    23.0000 23.0000 55.50   2   2       P
77710   1   016-0482    BSFA156 7866    19.3000 19.3000 42.00   1   2       P
77711   1   016-0096    BSFA153 10024   15.2625 15.2625 34.00   1   2       P
77712   1   004-0684    BSFA155 10063   17.8125 17.8125 40.00   1   2       P
77713   1   004-0224    BSFA162 198 20.5125 20.5125 47.00   1   2       P
77714   1       BSFA160 212 16.0375 16.0375 0.00    0   2   NO_TICKET   P
77715   1       BSFA159 4570    12.3875 12.3875 0.00    0   2   NO_TICKET   P
77716   1   016-2473    BSFA151 9173    13.6875 13.6875 0.00    3   2       P
77717   1   016-1566    BSFA149 1094    15.7250 15.7250 32.00   1   2       P
77718   1       BSFA160 148 20.2125 20.2125 0.00    0   2   NO_TICKET   P
77719   1   016-1566    BSFA149 1094    12.7625 12.7625 26.00   2   2       P
77720   1   016-1566    BSFA149 1094    15.3875 15.3875 28.00   2   2       P
77721   1   016-2152    BSFA175 926 15.2625 15.2625 0.00    3   2       P
77722   1       BSFA175 5498    13.7250 13.7250 0.00    0   2   NO_TICKET   P
77723   1   016-2465    BSFA173 6529    13.6375 13.6375 0.00    3   2       P
77724   1   016-2373    BSFA177 3791    15.5000 15.5000 31.25   1   2       P
77725   1   016-1020    BSFA171 6468    16.1000 16.1000 19.00   1   2       P
77726   1       BSFA175 3019    13.1125 13.1125 0.00    0   2   NO_TICKET   P
77727   1   016-2465    BSFA173 6529    14.0750 14.0750 0.00    3   2       P
77728   1   016-0309    BSFA182 5311    11.8125 11.8125 26.50   1   2       P

CaneParcel 表:

geoid   FIELD_ID    BSI_CODE    ACREAGE CROP_CLASS  ASSN    FARMER  BRANCH
0   004-0567    47  7.359515    RATOON  CSCPA   MARIN,OMAR  COROZAL
1   004-0008    281 12.38654    RATOON  CSCPA   AKIERMAN,DAVID  COROZAL
2   004-0012    281 7.899037    RATOON  CSCPA   AKIERMAN,DAVID  COROZAL
3   004-0013    281 4.937749    RATOON  CSCPA   AKIERMAN,DAVID  COROZAL
4   004-0014    281 5.002847    RATOON  CSCPA   AKIERMAN,DAVID  COROZAL
5   004-0038    9050    6.731369    RATOON  CSCPA   AKIERMAN,DAVID ISRAEL   COROZAL
6   004-0045    9028    4.120158    RATOON  CSCPA   AKIERMAN,MIRIAM COROZAL
7   004-0039    9050    8.519387    RATOON  CSCPA   AKIERMAN,DAVID ISRAEL   COROZAL
8   004-0147    289 14.801  RATOON  BSCFA-CZ    CAMPOS,ELEONAI  COROZAL
9   004-0572    47  5.878942    PLANTCANE   CSCPA   MARIN,OMAR  COROZAL
10  004-0030    281 14.33925    RATOON  CSCPA   AKIERMAN,DAVID  COROZAL
11  004-1150    281 7.306061    RATOON  CSCPA   AKIERMAN,DAVID  COROZAL
12  004-1152    281 3.814288    RATOON  CSCPA   AKIERMAN,DAVID  COROZAL
13  004-0017    281 11.5479 RATOON  CSCPA   AKIERMAN,DAVID  COROZAL
28  004-0563    47  7.98629 RATOON  CSCPA   MARIN,OMAR  COROZAL

FarmerGroups 表:

ID  ASSN    BSI_CODE    FARMER  CROP_SEASON PROD_EST    BRANCH
10473   BSCFA-OW    5752    GARCIA,EUGENIO R    2   464 YO CREEK
10474   BSCFA-OW    8894    GARCIA,RAUL R   2   488 YO CREEK
10475   BSCFA-OW    4427    PECH,EVELIA 2   458 YO CREEK
10476   BSCFA-OW    5226    GONZALEZ,DALIA MARIA    2   195 YO CREEK
10477   BSCFA-OW    5753    GONZALEZ,ELVIRA 2   124 YO CREEK
10478   BSCFA-OW    9295    GONZALEZ,RAUL   2   138 YO CREEK
10479   BSCFA-OW    9996    GONZALEZ,TRANSITO   2   450 YO CREEK
10480   BSCFA-OW    10099   PERAZA,ALBERTA  2   830 YO CREEK
10481   BSCFA-OW    4537    GARCIA,SANTIAGO SILVERIO    2   167 YO CREEK
10482   BSCFA-OW    8573    ACK,AMELITA M   2   76  YO CREEK
10483   BSCFA-OW    7467    ACK,EUCARIO 2   96  YO CREEK
10484   BSCFA-OW    7468    ACK,MOISES  2   43  YO CREEK
10485   BSCFA-OW    1848    AGUIRRE,NENCIE  2   64  YO CREEK
10486   BSCFA-OW    4355    BLANCO,SILVIO   2   79  YO CREEK
10487   BSCFA-OW    4476    CAL,ALBERTA GARCIA  2   152 YO CREEK
10488   BSCFA-OW    4480    CAL,ENRIQUE 2   409 YO CREEK
10489   BSCFA-OW    2545    CAL,ERNESTO T   2   54  YO CREEK
10490   BSCFA-OW    6877    CAL,REMIGIO 2   76  YO CREEK

我希望从不同的 Field_Is 中获取面积总和和吨位总和,如果状态为 1 和 2,并且交付吨数中有字段 ID,则这些字段的最大包裹状态为 3,结合吨位通过 BSI 代码表也能够获得关联。

【问题讨论】:

  • 定义This takes more than a minute。您正在对表进行聚合,加入正在对另一个视图进行聚合的视图,并且谁知道该视图中的内容。展示你的执行计划,看看瓶颈在哪里。正如@bjk116 所说,“你的索引怎么样?”
  • 索引是什么意思?超过一分钟给我结果我的意思是最多 2 分钟@WEI_DBA
  • 你的表有正确的索引吗?或者他们只是用 PK Identity 列索引?显示查询的执行计划...这将告诉您问题出在哪里。
  • 我明白了:/* SQLQuery30.sql 中缺少索引详细信息 - SIMISMAIN.simisdb (sa (114)) 查询处理器估计实施以下索引可以将查询成本提高 65.9822%。 / / USE [simisdb] GO CREATE NONCLUSTERED INDEX [] ON [dbo].[DeliveryTons] ([delivery_status]) INCLUDE ([delivery_id]) GO */
  • 你有权创建索引吗?如果是这样,请在查询分析器中运行它,USE [simisdb] GO CREATE NONCLUSTERED INDEX [IX_DeliveryTons_Delivery_Status_IVIAS] ON [dbo].[DeliveryTons] ([delivery_status]) INCLUDE ([delivery_id]) GO

标签: sql sql-server


【解决方案1】:

您的索引如何?您加入/执行 where 子句的所有内容都有索引吗?试验您在联接/where 子句中使用的列,尤其是对于行数最多的表的列。

根据您的表有多大,不建议只索引所有内容,这会占用大量不必要的内存。但我会转到行数最多的表,看看它的哪些列在你的 where/joins 中被使用,并确保它们被索引。

另外,查看SQL ServerEXPLAIN 功能,它会告诉您在哪里进行全表扫描(慢),这可以帮助您优化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    相关资源
    最近更新 更多