Comment améliorer le sorting de la vitesse par champ datetime d'une autre table?

J'ai une table de produits qui contient des centaines de milliers d'loggings. La structure de base de la table est comme ça:

ProductID (int pk) | ObjectID (int fk) | ProductTitle | Price 101 | 5005 | Toothbrush | 1.50 

J'ai une autre table pour les objects qui stocke des informations sur différents objects, mais surtout à qui ils ont été créés et quand.

 ObjectID (int pk) | DateCreated (datetime) | UserID 5005 | 2017-11-16 13:00:00 | 50 

La requête suivante sélectionnant Produits s'exécute en une demi-seconde:

 SELECT p.* FROM dbo.Products p ORDER BY ProductID DESC 

Cette requête suivante prend presque 3,5 secondes

 SELECT p.* FROM dbo.Products p INNER JOIN dbo.Objects o ON o.ObjectID = p.ObjectID ORDER BY o.DateCreated DESC 

ObjectID dans la table Products a été configuré en tant que key étrangère dans la table Objects . Il a également un index unique sur lui.

Le champ DateCreated dans Objects a également été indexé.

Pourquoi la deuxième requête s'exécute-t-elle 5 fois plus lentement simplement parce que je command par un champ DateTime d'une autre table? Je sais que order par un int est censé être plus rapide, d'autant plus que son regroupement, mais je ne m'attendais pas à ce que la différence soit aussi énorme.

Des suggestions s'il vous plaît? J'utilise SQL Server 2016.

Pour vraiment comprendre ce qui se passe, vous devez regarder les plans d'exécution. Cependant, les résultats ne sont pas surprenants.

La première requête est plus rapide parce que – probablement – la requête peut utiliser un index sur la table pour la order by . Je ne serais pas surpris si l'identifiant était une key primaire, rendant la command encore plus efficace.

La deuxième requête est plus lente car l' order by est probablement un sorting réel. Ceci est souvent nécessaire lorsque vous joignez des tables set.

Il est possible qu'un index sur Objects(DateCreated, ObjectId) soit un peu plus efficace. Si SQL Server décide de l'utiliser dépend des statistics des tables.