这是一个执行速度问题。
有两个表格(以下示例)。主表和细节表。 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
-----------------------------------------------------------------------------------------------------
答案 0 :(得分:0)
复杂连接标准的问题在于它可能使SQL Server无法使用索引进行连接,它可能导致溢出到tempdb,因为数据不适合内存或需要其他排序因为数据不再加入聚簇索引(或其他一些昂贵的操作)。
对于这种特殊情况,你可能很容易通过比较实际执行计划和当你为这两种情况打开“statistics io”时显示的i / o数量来解决这个问题。