2017-06-13 1 views
0

Une requête exécutée par mon application sur un client particulier est très lente. Je me suis rendu compte que le client a beaucoup d'enregistrements en particulier dans une table.Jointure interne avec requête de ralentissement de la grande table

la requête est quelque chose comme ça

SELECT T1.Field1,BT.Field2, T3.Field3 
FROM TABLE1 T1 INNER JOIN 
BIGTABLE BT ON FIELDS INNER JOIN 
TABLE2 T2 ON FIELDS 

J'ai remarqué que des commentaires comme celui-ci se révèle dans une requête beaucoup plus rapide:

SELECT T1.Field1,/*BT.Field2,*/ T3.Field3 
FROM TABLE1 T1 /*INNER JOIN 
BIGTABLE BT ON FIELDS*/ INNER JOIN 
TABLE2 T2 ON FIELDS 

donc j'ai essayé cette astuce pour réduire la taille de la BigTable :

--I use top 10 while the BIGTABLE contains 150000 records 
SELECT top 10 * 
INTO #BIGTABLE 
FROM BIGTABLE 

SELECT T1.Field1,BT.Field2, T3.Field3 
FROM TABLE1 T1 INNER JOIN 
#BIGTABLE BT ON FIELDS INNER JOIN 
TABLE2 T2 ON FIELDS 

DROP TABLE #BIGTABLE 

Avant l'exécution de ce que je m'attendais à une requête beaucoup plus rapide, mais l'exécution le temps de l'action était assez similaire. Pourriez-vous suggérer un moyen d'étudier la performance?

Merci.

+3

Vous avez probablement juste besoin d'index sur les colonnes utilisées dans les jointures. –

+2

Je ne considérerais pas 150 000 enregistrements comme une "grande" table, en particulier pour SQL Server. Pouvez-vous poster le plan d'exécution? Cela peut être n'importe quoi, mais les statistiques ou un index peuvent être désactivés. Publiez également le schéma, si vous vous joignez à de grands champs varchar non indexés, vous allez avoir un mauvais moment. –

+2

Regardez la première 2 (ou toutes) des vidéos ici: Cela va vous aider beaucoup: https://www.brentozar.com/archive/2016/10/think-like-engine-class-now-free- open-source/ –

Répondre

0

Pour étudier les performances, vous pouvez faire quelques choses:

Si vous exécutez la requête à partir SSMS puis il suffit d'inclure le plan d'exécution réel (cocher une petite icône dans la barre d'outils) avant d'exécuter la requête et l'exécuter. Regardez le sqlplan ou vous pouvez le poster ici. Parfois, il peut y avoir des «scans de table» ou d'autres opérations consommatrices de ressources qui causent de la lenteur. Le plan vous aidera à comprendre. En dehors de votre requête, il pourrait y avoir d'autres choses en cours d'exécution sur le serveur, Dans le passé, j'ai utilisé Who Is Active Script from Adam Machanic pour trouver ce que d'autres choses occupent le serveur. Voyez si votre SPID est bloqué par d'autres requêtes (Si vous exécutez le script d'Adam, il a une colonne blocking_session qui vous le montrera). Vous avez besoin du privilège DBA pour exécuter le script. Certaines personnes ne recommandent pas d'exécuter ce script souvent sur les serveurs de production.

Vous pouvez utiliser l'indication "WITH (READUNCOMMITED)" pour voir si cela vous aide. Cela n'est pas recommandé si vous ne souhaitez pas voir de données incorrectes dans votre requête.

+0

Salut. Merci pour la réponse. J'ai collé le plan ici https://www.brentozar.com/pastetheplan/?id=B1MIB96Mb pouvez-vous dire quelque chose? – LaBracca

+0

EVA_REFERENCES est la grande table – LaBracca

+0

Si vous voulez sélectionner uniquement MF.ID_FUNZIONE et PA.ID_DIPENDENTE alors vous pouvez essayer cette requête: 'select MF.ID_FUNZIONE, PA.ID_DIPENDENTE de PER_ANAGRAFICA PA INNER JOIN MSQ_PERS_FUNZIONI FPM SUR FPM. ID_DIPENDENTE = PA.ID_DIPENDENTE ET PA.STATO = 1 INNER JOIN MSQ_FUNZIONI MF ON MF.ID_FUNZIONE = MPF.ID_FUNZIONE OÙ EXISTE (CHOISIR 1 À pARTIR EVA_REFERENCES ER INNER JOIN \t \t \t \t APP_SSHSR APP SUR APP.ID_REF_IS_SS_PERIODICO_MANSIONI = ER.ID_EVA_REFERENCE_TYPES \t \t \t \t O ER ER.ID_FOR_ALL = MF.ID_FUNZIONE) ' – Nachi