2012-03-05 36 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