2

這個問題在SO中已經問了很多次,但沒有一個答案對我的情況滿意。在GROUP BY後連接一個字段

  1. Question 1
  2. Question 2
  3. Question 3
  4. Question 4

我處理一個包含多個版本的大約120萬唯一對象(增加)DataObjectVersions表。我需要爲每個唯一對象連接來自特定字段的更改。

現在我正在使用Q3中提供的XML Path的解決方案,但在此表上運行這樣的查詢是一個總體性能災難。 SQL Server在19mn後開始重新調用數據。知道這些數據將會加入兩次以上,你可以想象這種影響。

我正在尋找最高效的可伸縮性感知方式來連接由其他字段(當然不是鍵)分組的不同行的相同字段的值。更確切地說,這是在Datawarehouse的視圖中使用的。

編輯:

我試圖簡化描述,但這裏是一個完整的概述 我有多個表與視圖用於返回所有的工會下面列

 
    [ID] 
    [CreatedTime] 
    [CreatedBy] 
    [DeletedTime] 
    [DeletedBy] 
    [ResourceId] 
    [AccountId] 
    [Type] 

來自所有表格的記錄,這些記錄仍然會返回相同的列(在我的問題中由版本表格描述)。 [ResourceId][AccountId]是對象(組成員資格,系統帳戶等)的唯一組合標識符。 [Type]用於標識不同的級別(如文件分配時的讀/寫/執行)

所有其他字段對於不同的唯一對象包含相同的值(在不同的表中)。我需要獲取對象並連接[Type]列的值。所有行都在後面處理,並且([ResourceId][AccountId])組合必須是唯一的(不同類型存在時不是這種情況)。

編輯2:

我使用這個功能:

CREATE FUNCTION [dbo].[GetUniqueType] 
(
    @ResourceId as uniqueidentifier, 
    @Account as uniqueidentifier 
) 
RETURNS nvarchar(100) 
AS 
BEGIN 
    return STUFF((select ',' + raType.Type from vwAllAssignments raType where raType.AccountId = @Account and raType.ResourceId = @ResourceId and raType.DeletedBy is null for xml path('')), 1,1,'') 
END 

GO 

vwAllAssignments是返回所有錶行的工會的看法。

最後我選擇

SELECT [CreatedTime] 
     ,[DeletedTime] 
     ,[DeletedBy] 
     ,[ResourceId] 
     ,[AccountId] 
     ,dbo.GetUniqueType([ResourceId],[AccountId]) AS [Type] 
FROM vwAllAssignments 
GROUP BY [ResourceId], [AccountId], [CreatedTime], [DeletedTime], [DeletedBy] 
+0

你指的是具有類似 「對象」, 「V1,V2,V3,V4」? – Diego

+0

是的,但僅適用於特定列,並非所有列如連接類型或更改不同版本的日期 –

+0

請顯示您的數據庫佈局。我在較大的表上使用SQL Server 8中的連接,並獲得更好的性能。我懷疑一些放置好的索引將解決性能問題。 –

回答

2

試試這個:

SELECT [CreatedTime] 
     ,[DeletedTime] 
     ,[DeletedBy] 
     ,[ResourceId] 
     ,[AccountId] 
     ,STUFF((select ',' + raType.Type 
       from vwAllAssignments raType 
       where raType.AccountId = vwAllAssignments.AccountId and 
        raType.ResourceId = vwAllAssignments.ResourceId and 
        raType.DeletedBy is null 
       for xml path('')), 1,1,'') AS [Type] 
FROM vwAllAssignments 
GROUP BY [ResourceId], [AccountId], [CreatedTime], [DeletedTime], [DeletedBy] 

而且像這樣的指標應該是有幫助的。

create index IX_vwAllAssignments on vwAllAssignments(AccountId, ResourceId, DeletedBy) include(Type) 
+0

比我以前有點好:)謝謝! –

+0

我的意思是更好!數據在20秒後開始返回!並在3mn下完成查詢! BRILLIANT –

+0

現在有1,25百萬條記錄。這很快謝謝你! –