SQL de mise à Jour est vraiment très lent (environ 20-50sec), Sélectionnez prend moins de 1 seconde
J'ai un SQL Tabe "Document" qui contient beaucoup de lignes (jusqu'à quelques millions de dollars).
Quand je suis à l'exécution d'un Select-Déclaration, il faut environ 0,5 seconde.
Mais quand je suis à l'exécution d'une mise à Jour avec la même clause where, il faut environ 20 à 50 secondes, en fonction de la quantité de lignes affectées.
Voici mes Relevés.
//Select
SELECT * FROM Document
WHERE (State=20 OR State=23) AND
LetterClosed IS NOT NULL AND
TYPE=0 AND
SendLetter=1
//Mise à jour
UPDATE Document set State=32
WHERE (State=20 OR State=23) AND
LetterClosed IS NOT NULL AND
TYPE=0 AND
SendLetter=1
L'OU-Mappeur en interne envoyer cette mise à jour-déclaration suivie de la base de données:
exec sp_executesql N'Update
Document
SET
State=@p4
WHERE
(
(
(
(Document.State = @p0 OR Document.State = @p1)
AND Document.LetterClosed IS NOT NULL
)
AND Document.Type = @p2
)
AND Document.SendLetter = @p3
)'
,N'@p0 int,@p1 int,@p2 int,@p3 bit,@p4 int',@p0=20,@p1=23,@p2=0,@p3=1,@p4=32
Le problème, c'est que je reçois un Délai d'Exception au bout de 30 secondes de mon LightSpeed(OU de Base de données-Mappeur en c#).
Quelqu'un pourrait-il m'aider?
Edit:
Et ce sont nos indices créés automatiquement par SQL-Server:
CREATE NONCLUSTERED INDEX [_dta_index_Document_9_133575514__K42_1_2_3_4_5_6_7_8_9_11_12_13_14_15_16_17_18_19_20_21_22_23_24_25_26_27_28_29_30_31_32_33_34_] ON [Document]
(
[State] ASC
)
INCLUDE (
[Id],[DocumentId],[SendLetter],[SendFax],[Archive],[Crm],[Validation],[CreationDate],[PageCount],
[InformationLetter],[TermsOfDelivery],[DeliveryTypeNo],[SeparateDelivery],[FormName],[FormDescription],[TemplateFileName],[RecipientType],
[HealthInsuranceNo],[FamilyHealthInsuranceNo],[PensionInsuranceNo],[EmployerCompanyNo],[RecipientName1],[RecipientName2],[RecipientName3],
[RecipientStreet],[RecipientCountryCode],[RecipientZipCode],[RecipientCity],[RecipientFaxNo],[AuthorId],
[AuthorName],[AuthorEmailAddress],[CostcenterDepartment],[CostcenterDescription],[MandatorNo],[MandatorName],[ControllerId],
[ControllerName],[EditorId],[EditorName],[StateFax],[Editable],[LetterClosedDate],[JobId],[DeliveryId],[DocumentIdExternal],[JobGroupIdExternal],
[GcosyInformed]) WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [PRIMARY]
go
CREATE NONCLUSTERED INDEX [_dta_index_Document_9_133575514__K2_1_46] ON [Document]
(
[DocumentId] ASC
)
INCLUDE ( [Id],
[JobId]) WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [PRIMARY]
go
CREATE NONCLUSTERED INDEX [_dta_index_Document_9_133575514__K46_K2] ON [Document]
(
[JobId] ASC,
[DocumentId] ASC
)WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [PRIMARY]
go
CREATE NONCLUSTERED INDEX [Document_State_Id] ON [Document]
(
[State] ASC,
[Id] ASC
)WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [PRIMARY]
go
CREATE NONCLUSTERED INDEX [Document_State_CreationDate] ON [Document]
(
[State] ASC,
[CreationDate] ASC
)WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [PRIMARY]
go
Edit 2:
Maintenant, j'ai une exécution graphique-plan :
L'exécution du plan: https://skydrive.live.com/redir?resid=597F6CF1AB696567!444&authkey=!ABq72SAWXOoAXfI
L'exécution du plan de l'Indice de détails mise à Jour: https://skydrive.live.com/?cid=597f6cf1ab696567&id=597F6CF1AB696567%21445&sff=1&authkey=!ADDPWvxB2JLLvWo
Ce SQL-mise à Jour a été d'environ 35 secondes à s'exécuter. Habituellement, cette mise à Jour ne prend que de 0,3 secondes. Il semble qu'un autre processus bloqué. J'ai vu quelques autres sélectionne qui a commencé au milieu de cette mise à jour et j'ai attendu jusqu'à la mise à jour a été achevée qu'ils ont fini de là, sélectionnez-exécution.
Il semble donc que l'indice lui-même est correct (généralement de 0,3 sec exécution).
Tous les sélectionne (à partir de java/jtds, php, .net) sont le niveau d'isolation read committed (par défaut). Serait-il m'aider à changer tous les sélectionne read uncommitted pour éviter ce blocage lors de l'indice de mise à jour?
Merci
Tobi
SELECT
? Ce SGBD que vous utilisez? (Je suppose que SQL Server à partir de la sp_executesql
) Pouvez-vous montrer le CREATE TABLE
(et les index existants)? Pouvez-vous ajouter le plan d'exécution?Nous sommes à l'aide de MYSQL-Server 2005. Je vais essayer de poster l'exécution du plan et de créer de l'instruction.
Également inclure tous les index de cette table, vous avez besoin de faire pour obtenir une réponse précise, il sera trop d'index ou trop peu, ou que vous avez juste besoin de modifier légèrement. Lorsque vous obtenez le plan d'exécution dans SSMS, il peut même suggérer un index qui permettra d'accélérer.
Avez-vous le même temps d'exécution si vous exécutez des requêtes à partir de votre application et de SSMS?
Habituellement, les gens attacher capture d'écran avec le plan, mais il ne pouvait pas travailler pour de grands projets.
OriginalL'auteur Tobias Koller | 2013-01-11
Vous devez vous connecter pour publier un commentaire.
Sans plan d'exécution, nous ne pouvons que deviner ce qui se passe.
Je voudrais commencer à partir de:
document
tableau a (mais il est difficile de croire que la mise à jour des index prend beaucoup de temps).Toutes ces mesures doivent être visibles sur le plan de l'exécution.
Une autre raison pourrait être que le moteur SQL a un plan d'exécution pour
SELECT
de la requête et de l'autre pourUPDATE
requête...Mise à JOUR
Après la recherche dans les index.
À mon avis index
_dta_index_Document_9_133575514__K42_1_2_3_4_5_6_7_8_9_11_12_13_14_15_16_17_18_19_20_21_22_23_24_25_26_27_28_29_30_31_32_33_34_
est complètement faux.D'inclure un grand nombre de colonnes qui pourrait faire la mise à jour lent.
Essayer de l'enlever ou de le remplacer par
CLUSTERED
index surstate
colonne.CLUSTERED
index* comprendre* (accès direct) pour toutes les colonnes de l'enregistrement sans lit supplémentaire.Probablement, il doit être combiné avec l'un des autres indices commencé avec
state
colonne -- je supposestate
a juste quelques valeurs.Malheureusement, je ne suis pas capable d'interpréter le plan d'exécution au format texte.
merci pour votre réponse. Format de plan d'exécution, pouvez-vous lire? peut-être que je peux le changer en un autre format. Je vais essayer de supprimer tous les index et de créer de nouvelles, sans faire confiance à la base de données MSSQL optimiseur créé des index 😉
L'Image est le easiests, mais il n'a pas de conseils. J'ai vu que le plan peut être enregistré en tant que fichier XML, mais je ne suis pas sûr que je pourrais interpréter au mieux. Regardez votre plan, recherche pour IO coûts, le nombre de dossiers et d'octets lus, vérifiez si vous n'avez pas les analyses de la table (généralement de mauvaise chose), de l'indice des analyses ou recherches de RID -- ces cols de bouteille.
OriginalL'auteur Grzegorz Gierlik
Vous avez probablement index sur la table du Document. Les indices de faire une sélection plus rapide, mais la mise à jour lente/inset/opération de suppression.
Essayez de supprimer les inutiles index.
C'est probablement le manque d'index qui est à l'origine de ce que l'existence d'un lot.
Quand j'ai créé la table, j'ai couru quelques tests, enregistré chaque énoncé avec le profiler et utilisé le SQLServer DatabaseOptimizer pour créer mon Index.
pourquoi "seulement un index unique"? Êtes-vous en supposant que seule la colonne index existent? Que faire si
State
fait partie de plusieurs indices? Sans le plan, nous ne le savons pas, mais je ne pense pas que vous pouvez préciser que cela ne concerne qu'un seul index.salut Aaron. J'ai posté le XML-Executionplan déjà. Peut-être vous pouvez avoir un coup d'oeil? son interface graphique et devrait être plus facile à lire. voici le Lien agail: Edit 2: Maintenant, j'ai une exécution graphique-plan : l'Exécution du plan: lien l'Exécution du plan de mise à Jour des Index de détails: lien
OriginalL'auteur semao
J'ai eu ce problème une fois sur SQL Server 2008 et SQL Server 2014 serveurs liés. Un solution de contournement pour moi était de stocker le "Select" des résultats dans une table temporaire et de l'utiliser pour faire la mise à jour plutôt faire le complexe de l'interrogation et la mise à jour à la fois.
Dans votre cas, ce serait:
OriginalL'auteur nbougiou