2011-11-09 1 views
1

Je sites table avec les données suivantes:Entity Framework Lorsque des questions de performance d'application MVC requête

websiteID - int [Primary Key] 
websiteName - nvarchar(128) 
... (5 other columns) 

Sur url, j'ai la route avec le nom d'un site Web. À la méthode OnActionExecuting je cours:

public Website GetWebsiteByName(String wwwName) 
{ 
    return _zEntity.Websites.Where(w => w.websiteName == wwwName).First(); 
} 

pour obtenir des données de site Web. Système peut fonctionner avec de nombreux sites Web sur une base de données (exigence), mais le problème a commencé le premier. Lorsque je fais un test de performance avec le temps de réponse ANTS est de 3 sec. Pourquoi cela prend-il autant de temps? Comment l'ignorer?

+1

Combien de temps la requête prend-elle si vous l'exécutez à partir de SSMS (en supposant SQL Server)? – Dean

+0

L'exécution de la requête SSMS montre 00:00:00 – Kederf

Répondre

0

Ajoutez un index dans la colonne nom_web ou une requête par site Web à la place.

Sans un index, vos requêtes seront lentes.

+0

J'ai un index sur la colonne websiteName. – Kederf

+0

WebsiteName est le premier champ de votre index? Juste l'avoir comme l'un des nombreux champs dans un index ne sera pas nécessaire. –

+0

WebsiteName est-il mappé en tant que 'nvarchar'? Si EF le traite comme 'varchar', sql n'utilisera pas l'index. – jrummell

0

Sur la base des informations que vous avez fournies, je suggérerais de mettre un index sur le nom du site dans votre tableau. Cela devrait accélérer les choses. Mais je considérerais l'appariement sur l'id de site Web au lieu du nom de site Web: appariement sur des nombres entiers est simplement plus rapide que comparant des chaînes de 128 caractères.

+0

Oui, je le sais. Mais à mon avis, le nom du site semble beaucoup mieux sur l'URL que l'ID. Je peux raccourcir la longueur de la colonne à 16 caractères. Je pensais à la solution pour lire tous les sites Web sur ApplicationStart écrire dans les données d'application mais pas comme IEnumerable , mais ajouter le préfixe à chaque nom de site Web "wi-" et lire les données exactes de l'application (ne pas les lire de db sur chaque requête) . Qu'est-ce que tu penses? – Kederf

+0

@MariuszGarsztka Dean, ci-dessus, fait un très bon point. Savez-vous combien de temps est occupé par la requête de base de données réelle par opposition à l'activité EF? (Et, en fait, je ne sais pas avec certitude si vous utilisez EF.) Si vous voulez mettre en cache les objets du site (et j'utiliserais le webcache plutôt que l'état de l'application, mais c'est à vous de choisir) , et y accéder par le nom du site, j'utiliserais un objet dictionnaire et j'utiliserais le nom du site comme clé. Vous devrez peut-être utiliser un objet de dictionnaire personnalisé, car les objets de dictionnaire intégrés ne sont pas sérialisables, mais il y en a plusieurs. –

+0

Oui, j'utilise Entity Framework. La requête sur DB est rapide. J'essaierais de mettre en cache les objets du site Web. Merci pour vos suggestions. Savez-vous comment attraper la requête créée par EF pour voir ce qui ne va pas? – Kederf