2012-03-05 34 views
1

我正试图对两个不相关的表执行完整的外部连接。每个表都有一个location_id,最终形成主键/外键关系(一旦我找出这个性能问题)。当执行外部连接时,它只是消失。在不到一秒的时间内,对每个表执行查询和触发器。外部连接两个表与连续指导档位

此表有21000个记录:

CREATE TABLE [dbo].[TBL_LOCATIONS](
    [OBJECTID] [int] NOT NULL, 
    [Loc_Name] [nvarchar](100) NULL, 
    [Location_ID] [uniqueidentifier] NULL, 
    [SHAPE] [geometry] NULL, 

CONSTRAINT [R33_pk] PRIMARY KEY CLUSTERED 
(
    [OBJECTID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 75) ON [PRIMARY] 
) ON [PRIMARY] 
GO 
ALTER TABLE [dbo].[TBL_LOCATIONS] WITH CHECK ADD CONSTRAINT [g17_ck] CHECK (([SHAPE].[STSrid]=(26917))) 
GO 
ALTER TABLE [dbo].[TBL_LOCATIONS] ADD CONSTRAINT [DF_TBL_LOCATIONS_Location_ID] DEFAULT (newsequentialid()) FOR [Location_ID] 
GO 

CREATE SPATIAL INDEX [S17_idx] ON [dbo].[TBL_LOCATIONS] 
(
    [SHAPE] 
)USING GEOMETRY_GRID 
WITH (
BOUNDING_BOX =(224827, 3923750, 323464, 3967780), GRIDS =(LEVEL_1 = HIGH,LEVEL_2 = HIGH,LEVEL_3 = HIGH,LEVEL_4 = HIGH), 
CELLS_PER_OBJECT = 16, PAD_INDEX = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
GO 

CREATE UNIQUE NONCLUSTERED INDEX [UUID_OID_33] ON [dbo].[TBL_LOCATIONS] 
(
    [Location_ID] ASC, 
    [OBJECTID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 75) ON [PRIMARY] 
GO 

这个表有53000条记录

CREATE TABLE [dbo].[TBL_EVENTS](
    [OBJECTID] [int] NOT NULL, 
    [Event_ID] [uniqueidentifier] NULL, 
    [Location_ID] [uniqueidentifier] NULL, 
CONSTRAINT [PK_TBL_EVENTS] PRIMARY KEY CLUSTERED 
(
    [OBJECTID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 
ALTER TABLE [dbo].[TBL_EVENTS] ADD CONSTRAINT [DF_TBL_EVENTS_Event_ID] DEFAULT (newsequentialid()) FOR [Event_ID] 
GO 
ALTER TABLE [dbo].[TBL_EVENTS] ADD CONSTRAINT [DF_TBL_EVENTS_Event_ID] DEFAULT (newsequentialid()) FOR [Event_ID] 
GO 

CREATE UNIQUE NONCLUSTERED INDEX [R36_SDE_ROWID_UK] ON [dbo].[TBL_EVENTS] 
(
    [OBJECTID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 75) ON [PRIMARY] 
GO 

这里是正在运行....和运行查询...... 1小时,无结果。

SELECT  
    TBL_LOCATIONS.Loc_Name, 
    TBL_LOCATIONS.Location_ID, 
    TBL_LOCATIONS.SHAPE, 
    TBL_EVENTS.Event_ID 
FROM   
    TBL_EVENTS 
FULL OUTER JOIN 
    TBL_LOCATIONS ON TBL_EVENTS.Location_ID = TBL_LOCATIONS.Location_ID 

我试过属性索引的每一个排列在两个表,重建和重组他们,没有什么会影响性能。应用程序要求使用ObjectID作为PK,与sequ​​entialGUID一样。我不认为这些都是因素,因为这些表格在这个查询之外都表现出色。 SQL Server 2008 SP1 64位RAID 10/48 GB RAM。

回答

2

FULL JOIN当用于链接表的列中的数据是唯一的时候工作良好。

对于行包含重复数据FULL JOIN行为就像CROSS JOIN,并可能导致服务表现的问题。

因此可能的瓶颈来自LOCATION_ID列中的重复项。

1

如果链接字段值不是全部唯一(位置),则查询大小可能会接近相当大的数量。

在一个极端的例子中,如果两个表中的位置只有值“1”,那么总行数将接近交叉连接大小,大约为1,113,000,000行(21,000 * 53,000)。这个大小(超过10亿行)的查询将需要很长时间才能运行。

编辑 - 更新不正确的语句在评论

+1

IMO'CROSS JOIN'使两个表的笛卡尔乘积,'FULL JOIN'表现出一点点不同...... – Radek 2012-03-05 20:22:01

+0

啊,是的,你是对的 - 我一定很快就读过这个问题。但是,如果链接字段值是不是所有的独特,查询规模可能接近一个相当大的数字(在一个极端的例子,如果位置只有“1”两个表中的值,总列数将接近交叉连接大小)。 – Chris 2012-03-05 20:36:23

2

指出,也许你需要考虑关闭事务日志记录,同时做了这一切。

+0

事务日志记录无法关闭。只有永久存储日志可以被禁用,但写入总是发生。 – usr 2012-03-05 20:37:43

+0

@Radek,你是对的。毕竟SequentialID并非如此顺序。更正了5K实例的重复位置(出于某种原因,所有这些实例都是相同的),查询现在以.49秒执行。 – tpcolson 2012-03-05 20:42:13