MS Access SQL加入性能改进

时间:2014-03-20 09:43:11

标签: sql sql-server performance ms-access

我希望能提供一些帮助,帮助我改进下面的查询,这个问题需要一个绝对的年龄来执行。

我知道LEFT JOIN导致语句运行得如此缓慢,但我不知道如何运行查询以提高性能并返回所需的结果。

查询

SELECT 
    s.id, s.first_name, s.last_name, COUNT(a.AbsenceId)
FROM ((
      dbo_ds_staff AS s
      INNER JOIN dbo_ds_team_staff_member AS tsm ON s.id=tsm.staff_id
    )
    INNER JOIN dbo_ds_team_leader AS tl ON tsm.team_id=tl.team_id
)
LEFT JOIN ct_adt_Absence AS a ON s.id=a.StaffId
  WHERE 
     tl.staff_id=2169
     And tsm.start_date<NOW() 
     And (
        tsm.end_date>=NOW() 
        Or tsm.end_date Is Null
    ) 
    And tl.start_date<NOW()
    And (
     tl.end_date>=NOW() 
     Or tl.end_date Is Null
   )
   GROUP BY s.id, s.first_name, s.last_name
   ORDER BY s.first_name, s.last_name;

如果有任何进一步的信息我可以提供帮助,请告诉我!感谢

2 个答案:

答案 0 :(得分:2)

正如对问题的评论中所建议的那样,Access中的传递查询可能会通过将SQL Server表的处理推送到SQL Server本身来加快速度。例如,带有SQL

的名为[ptqStaffList]的传递查询
SELECT 
    s.id, s.first_name, s.last_name
FROM
    dbo.ds_staff AS s
    INNER JOIN 
    dbo.ds_team_staff_member AS tsm 
        ON s.id=tsm.staff_id
    INNER JOIN 
    dbo.ds_team_leader AS tl 
        ON tsm.team_id=tl.team_id
WHERE tl.staff_id=2169
    AND tsm.start_date < CURRENT_TIMESTAMP 
    AND (tsm.end_date >= CURRENT_TIMESTAMP OR tsm.end_date IS NULL)
    AND tl.start_date < CURRENT_TIMESTAMP
    AND (tl.end_date >= CURRENT_TIMESTAMP OR tl.end_date IS NULL)

...在Access ...中看起来像这样......

ptq.png

...返回:

id  first_name  last_name
--  ----------  ---------
1   Gord        Thompson

然后我们可以在常规SELECT查询中使用它与本地Access表

SELECT 
    s.id, 
    s.first_name, 
    s.last_name, 
    COUNT(a.AbsenceId) AS AbsenceCount
FROM
    ptqStaffList AS s
    LEFT JOIN 
    ct_adt_Absence AS a 
        ON s.id=a.StaffId
   GROUP BY s.id, s.first_name, s.last_name
   ORDER BY s.first_name, s.last_name;

返回

id  first_name  last_name  AbsenceCount
--  ----------  ---------  ------------
1   Gord        Thompson              1

答案 1 :(得分:1)

SELECT s.*, COUNT(a.AbsenceId)
FROM
    (SELECT s.id, s.first_name, s.last_name
    FROM ((dbo_ds_staff AS s
    INNER JOIN dbo_ds_team_staff_member AS tsm ON s.id=tsm.staff_id)
    INNER JOIN dbo_ds_team_leader AS tl ON tsm.team_id=tl.team_id)
    WHERE tl.staff_id=2169 And tsm.start_date<NOW() And (tsm.end_date>=NOW() Or tsm.end_date Is Null) And tl.start_date<NOW() And (tl.end_date>=NOW() Or tl.end_date Is Null)
    GROUP BY s.id
    ORDER BY s.first_name, s.last_name) as s
LEFT JOIN ct_adt_Absence AS a ON s.id=a.StaffId
GROUP BY s.id

我会首先选择用户,然后添加LEFT JOIN以计算缺席。

另外,我不知道为什么需要first_name和last_name

进行分组