Domanda

In relazione al modo più efficiente per restituire più aggregati in un unico proc memorizzato?

Ho una domanda di tipo e-mail e vuole selezionare tutti i messaggi di posta in arrivo () per un utente. Il problema è che io normalizzare la parte di intestazione dei messaggi di posta elettronica nel DB in modo tale che i dati piatta va in una tabella dei messaggi e la da, verso, CC, BCC vengono memorizzati ad un altro tavolo.

Qual è il modo migliore per selezionare i messaggi (in piena - che significa denormalizzare il messaggio completo) in modo che ogni record contiene tutti i campi pertinenti messaggio includendo tutti i campi della tabella messaggio ed eventuali record correlati dalla tabella destinatario relativa al messaggio di cui al PK / FK rapporto.

Una cosa che mi sto mettendo molto peso sulla è l'efficienza della soluzione SQL, perché questo sarà il codice che viene eseguito molte volte più e sarà probabilmente la più sql corsa di tutto il DB

Per contesto qui è una vista del mio schema di DB.

DB SCHEMA

È stato utile?

Soluzione

Questo è come io lo farei. Io uso regolarmente Coalesce comprese di righe in campi delimeted e sempre esegue e scale e (fino a quando si rendo conto che una sottoquery sta andando sempre causare qualche calo di prestazioni).

Se non ti piace correre come una stored procedure si potrebbe anche facilmente riscrivere in funzione del valore della tabella.

Un altro approccio sarebbe un CTE suppongo, ma io non sono come familiarità con questo approccio di tipo da zero.

CREATE PROCEDURE GetMessageById
    @pMessageID int
AS
BEGIN

SET NOCOUNT ON;

Declare @pTo varchar(max)
Declare @pCC varchar(max)
Declare @pBC varchar(max)

SELECT @pTo = COALESCE(@pTo + ', ', '') + [EmailAddress]
FROM MessageRecipient
WHERE MessageID = @pMessageID AND RecipientTypeID = 1 /** or whatever the id of TO field is */

SELECT @pCC = COALESCE(@pCC + ', ', '') + [EmailAddress]
FROM MessageRecipient
WHERE MessageID = @pMessageID AND RecipientTypeID = 2 /** or whatever the id of CC field is */

SELECT @pBC = COALESCE(@pBC + ', ', '') + [EmailAddress]
FROM MessageRecipient
WHERE MessageID = @pMessageID AND RecipientTypeID = 3 /** or whatever the id of BCC field is */

SELECT Message.*, @pTo as [ToField], @pCC as [CCField], @pBC as [BCCField], (SELECT TOP 1 [EmailAddress] FROM MessageRecipient Where RecipientTypeID = 0 /**<sender id>*/ AND MessageID = @pmessageID) AS [FromField] FROM Message Where Message.ID = @pMessageID

END
GO

Potreste chiedervi come funziona Coalesce se usato in questo modo (l'ho fatto, quando ho visto la prima volta usato). Fondamentalmente si crea una query ricorsiva ritornare ogni successivo valore non nullo nel set, a sua volta, fino alla fine del set ritorno. Uscendo l'altra estremità si ottiene un elenco di coma delimitato di tutti i risultati come una singola stringa.

Altri suggerimenti

I creerebbe una vista denominata viewInbox che è stato ideato da tutti gli one-to-one le tabelle di relazione. Questo sarebbe il mio principale vista query. Userei questo punto di vista (viewInbox) per visualizzare un elenco di tutti gli elementi di posta in arrivo.

Quando l'utente trapani giù nel messaggio, vorrei poi riportare tutte le informazioni compreso il uno-a-molti rapporti dai molteplici To, CC e BCC di .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top