J'essaye de faire des versions de lignes en utilisant une vue indexée, en regroupant les enregistrements selon leur clé et leur horodatage, et en prenant l'enregistrement max (timestamp). C'est bien, mais la requête que j'ai utilisée (voir la vue ci-dessous) fait une auto-jointure, ce qui signifie qu'elle ne peut pas être utilisée dans une vue indexée, ce qui, je pense, sera essentiel à la performance. Y at-il un moyen de réécrire la requête afin que la vue peut être créée avec succès avec SCHEMABINDING?SQL GROUP BY: obtention de l'enregistrement le plus récemment mis à jour pour une vue indexée
J'utilise 2005, mais une solution 2008 seulement serait bien aussi.
IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[Items]'))
DROP VIEW [dbo].[Items]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[ItemHistory]') AND type in (N'U'))
DROP TABLE [dbo].[ItemHistory]
GO
CREATE TABLE [dbo].[ItemHistory](
[Key] [nchar](10) NOT NULL,
[Value] [int] NOT NULL,
[TimeStamp] Timestamp NOT NULL,
[LastUpdateBy] [varchar](50) NOT NULL CONSTRAINT [DF_ItemHistory_LastUpdateBy] DEFAULT (SUSER_NAME()),
[Deleted] BIT NOT NULL DEFAULT (0)
CONSTRAINT [PK_ItemHistory] PRIMARY KEY CLUSTERED
(
[Key] ASC,
[TimeStamp] ASC
) ON [PRIMARY]
)
GO
CREATE VIEW dbo.Items
--WITH SCHEMABINDING --doesnt work with the query below :(
AS
SELECT ih.[key], ih.[Value] FROM ItemHistory ih
INNER JOIN (
SELECT [Key], Max([TimeStamp]) [TimeStamp]
FROM ItemHistory
GROUP BY [Key]
) ih2 ON ih.[key] = ih2.[key] AND ih.[TimeStamp] = ih2.[TimeStamp] AND Deleted = 0
GO
INSERT INTO Items ([Key], [Value]) VALUES ('ItemA', 1)
INSERT INTO Items ([Key], [Value]) VALUES ('ItemA', 2)
INSERT INTO Items ([Key], [Value]) VALUES ('ItemA', 3)
GO
SELECT * FROM ItemHistory
SELECT * FROM Items
Vous monsieur, êtes un génie. Je suis monsieur, je suis un idiot. N'a pas lu le message de création correctement. Would SELECT ih. [Touche], ih. [Valeur] DE dbo.ItemHistory ih OU PAS EXISTS (SELECT TOP 1 [Key] DE dbo.ItemHistory AS IH2 OU ih. [Key] = IH2. [ key] ET ih. [TimeStamp]
mcintyre321
Vous êtes trop gentil. Je ne suis pas sûr si la clause TOP 1 supplémentaire le rendrait plus rapide car SQL Server effectue beaucoup d'optimisations en coulisses et en fait les plans d'exécution sont identiques. Comme autre exemple, il n'y a pas de différence, autant que je sache, entre l'utilisation de SELECT * et SELECT [Key] pour la sous-requête en termes de vitesse d'exécution car SQL Server ne s'intéresse qu'à l'existence ou non d'une ligne. – MikeD