SQL Server 2008中的T-SQL - 复杂的连接条件或单独查询的并集

时间:2015-02-08 15:16:58

标签: sql-server database join

这是一个执行速度问题。

有两个表格(以下示例)。主表和细节表。 main的主键在两个不同的外键列的详细信息表中引用。该决定基于主表的状态列。

有关于task table和taskdet表的内容。 Taskdet表有两个对Task表主键的引用。任务表主键在taskdet表的一个外键列中根据任务​​类型引用,如下所示:

iType=0 --> Original task with or without modifications 
            TaskDet.MainTskFk=Task.TaskID
iType=1 --> Task unchanged and assigned
            TaskDet.MainTskFk=Task.TaskID
iType=2 --> Change on original task
            TaskDet.ModiTskFk=Task.TaskID
Additionally detail table has a pointer to original task that gets modified
            TaskDet.MainTskFk=Task.TaskID of task table entry where its itype=0 
iType=3 --> Original Task completed
            TaskDet.ModiTskFk=Task.TaskID

用于获取原始任务的查询和人员任务的修改(PartnerFk字段)可以通过两种方式完成。使用复杂条件的内部联接 - SQL 1-或查询任务和详细信息表会缠绕并联合结果 - SQL 2 - 。

它们都适用于少量数据,但是当应用于任务表中有560k条目且任务详细信息表中有250k条目的数据库时,SLQ 1无法运行。我认为两次查询同一个表比在单个查询中连接表并使用SQL 1中的连接条件要慢。

与构建复杂连接相比,查询同一个表两次的性能提升是什么时候?

SQL#1:

    SELECT 
        Task.TaskID
        ,Task.dtFrom
        ,Task.dtTo
        ,Case Task.itype When 2 Then TaskDet.MainTskFk When Else 0 END As ModfierOfTaskID
        ,TaskDet.ItemDesc
        ,TaskDet.EstimatedTime
    FROM 
        Task 
    INNER JOIN 
        TaskDet ON (Task.iType =3 and Task.TaskID = TaskDet.MainTskFK) 
                   OR (Task.iType =2 and Task.TaskID = TaskDet.ModiTskFK)
    WHERE
        Task.PartnerFK = 1

SQL#2:

SELECT 
    Task.TaskID
    ,Task.dtFrom
    ,Task.dtTo
    ,0 As ModfierOfTaskID
    ,TaskDet.ItemDesc
    ,TaskDet.EstimatedTime
FROM 
    Task 
INNER JOIN 
    TaskDet ON (Task.iType = 3 and Task.TaskID = TaskDet.MainTskFK)
WHERE  
    Task.PartnerFK = 1

UNION ALL

SELECT 
    Task.TaskID
    ,Task.dtFrom
    ,Task.dtTo
    ,TaskDet.MainTskFk As ModfierOfTaskID
    ,TaskDet.ItemDesc
    ,TaskDet.EstimatedTime
FROM 
    Task 
INNER JOIN 
    TaskDet ON (Task.iType =2 and Task.TaskID = TaskDet.ModiTskFK)
WHERE
    Task.PartnerFK = 1

表格结构和数据:

Task表格以TaskID为主键

Task表:

    TaskID  dtFrom             dtTo             Notes                    PartnerFK  iType
    -----------------------------------------------------------------------------------------------------
      1 01-01-2014  20-03-2014  Original Task Requires modification         1       0
      2 18-02-2014  20-04-2014  Assigned task and unchanged                 4       1
      3 28-01-2014  18-02-2014  Original Task assiged not started unchanged 4       0
      4 02-04-2014  05-05-2014  Changes required on assigned task           1       2
      5 31-12-2013  01-04-2014  Assigned task and unchanged                 2       1
      6 12-03-2014  24-03-2014  Original task completed                     1       3
    -----------------------------------------------------------------------------------------------------

TaskDet表:

DetID   MainTskFK ModiTskFK         Itemdesc    EstimatedTime
-----------------------------------------------------------------------------------------------------
1    1          Prepare end of month letter            200
2    1          Reconcile bank statements              150
3    2          tsk1                                   200
4    2          tsk2                                   150
5    5          Conclude lease agreement                25
6    5          Get sales figures as EOM               100
7    5          Glass cleaning                          35
8    6          Prepare car exhibition                 500
9    6          Conclude exhibition lease agreements    85
10   1      4   Requires additional Time                50
-----------------------------------------------------------------------------------------------------

1 个答案:

答案 0 :(得分:0)

复杂连接标准的问题在于它可能使SQL Server无法使用索引进行连接,它可能导致溢出到tempdb,因为数据不适合内存或需要其他排序因为数据不再加入聚簇索引(或其他一些昂贵的操作)。

对于这种特殊情况,你可能很容易通过比较实际执行计划和当你为这两种情况打开“statistics io”时显示的i / o数量来解决这个问题。