我将如何优化?我需要从不同的表中提取数据,并在查询中使用查询结果

问题描述 投票:0回答:1

[请提出一种我应该遵循的方法,因为我显然遗漏了这一点。我是SQL的新手,但仍然考虑MS Access。这是我要执行的操作的一个示例:就像我说的,不用担心细节,我只想知道如何在SQL中执行此操作。

我有下表:

小时工作量(工作人员,日期,小时)(超过20万条记录)Units_Done(团队,日期,类型)(几千条记录)Rate_Per_Unit(日期,团队,RatePerUnit)(几千条记录)Staff_Effort(员工,团队,时间戳)(最终3-4百万条记录)

所以我需要执行以下操作:

1]通过将每个单位乘以RatePerUnit并按“团队和日期分组”来计算每个团队的收入。我创建一个视图TeamEarnPerDay:

Create View teamEarnPerDay AS
        SELECT  
               ,Units_Done.Date, 
               ,Units_Done.TeamID, 
               ,Sum([Units_Done]*[Rate_Per_Unit.Rate]) AS Earn
        FROM Units_Done INNER JOIN Rate_Per_Unit 
        ON (Units_Done.quality = Rate_Per_Unit.quality) 
        AND (Units_Done.type = Rate_Per_Unit.type) 
        AND (Units_Done.TeamID = Rate_Per_Unit.TeamID) 
        AND (Units_Done.Date = Rate_Per_Unit.Date)
        GROUP BY 
                 Units_Done.Date, 
                 Units_Done.TeamID;

2)通过将Team_Effort分组到Team和Date并计数记录来计算TEAM的工作量。该表有几百万条记录。我必须将时间戳记转换为日期。...

CREATE View team_effort AS
SELECT 
       TeamID 
      ,CAST([Timestamp] AS Date) as TeamDate, 
      ,Count(Staff_EffortID) AS TeamEffort
FROM Staff_Effort
GROUP BY
        TeamID
        ,CAST([Timestamp] AS Date);

3)计算球队的薪金比率:(1)球队收益/(2)球队努力我使用上面创建的2个视图。这种观点的表现下降了,但我仍然可以接受。

Create View team_rate_of_pay AS
  SELECT 
        tepd.Date 
       ,tepd.TeamID 
       ,tepd.Earn 
       ,tepd.TeamBags 
       ,[Earn]/[TeamEffort] AS teamRate
FROM teamEarnPerDay 
INNER JOIN team_effort 
ON (teamEarnPerDay.Date = team_effort.TeamDate) 
AND (teamEarnPerDay.TeamID = team_effort.TeamID);

4)将Staff_Effort分组到Date和Staff上,并计数记录以获取每个人的努力。 (团队努力的一部分)我必须将时间戳记转换为日期。...

Create View staff_effort AS
SELECT 
   TeamID
  ,StaffID
  ,CAST([Timestamp] AS Date) as StaffDate
  ,Count(Staff_EffortID) AS StaffEffort
FROM Staff_Effort
GROUP BY 
  ,TeamID
  ,StaffID
  ,CAST([Timestamp] AS Date);

5)通过以下方式计算员工收入:(4)Staff_Effort x(3)team_rate_of_pay将个人的工作量乘以他每天工作的团队比率。这个速度太慢了。实际上,它没有用。

CREATE View staff_earnings AS
SELECT 
    staff_effort.StaffDate
   ,staff_effort.StaffID
   ,sum(staff_effort.StaffEffort) AS StaffEffort 
   ,sum([StaffEffort]*[TeamRate]) AS StaffEarn
FROM staff_effort INNER JOIN team_rate_of_pay
ON (staff_effort.TeamID = team_rate_of_pay.TeamID) 
AND (staff_effort.StaffDate = team_rate_of_pay.Date)
Group By  
    staff_effort.StaffDate, 
    staff_effort.StaffID;

所以您明白我的意思了。...我需要各种结果,后续查询取决于这些结果。

我试图做的是为上述每个步骤编写一个视图,然后仅在下一步中使用该视图,依此类推。它们可以正常工作,但查看nr 3的运行速度要比其他运行速度慢,即使仍然可以接受。 View nr 5太慢了。

我实际上在nr.5之后有另一种观点,它也使工作量发挥了作用,但要花几行时间永远是永远的。

我想为每位工作人员写一行,显示他根据上述计算得出的每天收入以及每天的工作时间。

我还尝试通过使用子查询来减少视图数量,但这花费了更长的时间。

一些指导/方向将不胜感激。

提前感谢。

-编辑-

接受评论中发布的查询。做了一些格式化,添加了别名并进行了一些清理,看起来像这样。

SELECT epd.CompanyID
    ,epd.DATE
    ,epd.TeamID
    ,epd.Earn
    ,tb.TeamBags
    ,epd.Earn / tb.TeamBags AS RateperBag
FROM teamEarnPerDay epd
INNER JOIN teamBags tb ON epd.DATE = tb.TeamDate
    AND epd.TeamID = tb.TeamID;
sql sql-server query-optimization
1个回答
0
投票

我最终做了两件事:1)通过使用子查询来减少嵌套视图的nr。这并不能显着提高性能,但似乎使用更少的视图更简单。

2)实际的改进是通过使用LEFT JOIN代替了Inner Join引起的。最终视图使用“内部联接”运行了50分钟,但尚未产生任何一行。使用LEFT JOIN,它可以在20秒内产生所有结果!

希望这对某人有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.