2016-05-02 3 views
1

Ich habe zwei Tabellen (Usertable und Userprofile) und die Struktur:SQL Server ausgeführt Update dauert es mehr Zeit

 
create table userTable(
id_user int identity(1,1) primary key , 
Name varchar(300) not null , 
Email varchar(500) not null , 
PasswordUser varchar(700) not null, 
userType int , 
constraint usertype_fk foreign key(userType) REFERENCES userType(id_type) 
on delete set null 
) 

und userPtrofile:

 
    create table UserProfile(
    id_profile int identity(1,1) primary key , 
    ClientCmpName varchar(300) null, 
    Clientaddress varchar(500) null, 
    phone varchar(50) null, 
    descriptionClient varchar(400) null, 
    img image null, 
    messageClient text , 
    fk_user int , 
    constraint fkuser foreign key(fk_user) references userTable(id_user) 
    on delete cascade 
    ) 

ich SQL Server bin mit 2008 Die Problem ist, dass, wenn ich Datensätze die ausführende Last ohne Ausführung von aktualisieren, dies Beispielabfrage ist:

Screenshot

enter image description here

+0

Ich vermute, ein Teil der Performance-Hit ist, dass es ein 'Text' Feld aktualisiert, die nicht inline mit dem Rest der Zeilendaten gespeichert ist und ist ein extra Hop pro Datensatz zu aktualisieren. Die Dokumentation hierzu (https://technet.microsoft.com/en-us/library/ms189574(v=sql.105).aspx#Anchor_0) besagt jedoch, dass solange die Daten klein sind, dies nicht der Fall sein sollte um diesen zusätzlichen Hop zu machen. Ich weiß nicht, ob diese Optimierung für 2008 getan wurde. – DiskJunky

Antwort

1

Wenn Ihr Anliegen Leistung für diese Abfrage ist:

update UserProfile 
    set messageClient = N'010383772' 
    where fk_user = 2; 

Dann wird ein Index sehr hilfreich sein:

create index idx_UserProfile_fkuser on UserProfile(fk_user); 

Dies ist die Abfrage momentane fast machen sollte .

Hinweis: Indizes können Einfügungen und andere Operationen verlangsamen. Dies ist normalerweise kein großes Problem, und Indizes für Fremdschlüsselspalten sind üblich.

+0

Vielen Dank, um die Antwort schnell zu machen, aber mein Problem löst nicht –

+0

Fremdschlüssel sind bereits nicht geclusterte Indizes, daher würde das Hinzufügen eines weiteren Indexes keine Leistungssteigerung bringen - wie das OP gesagt hat. – DiskJunky

+0

Ich bin mir nicht sicher, woher Sie diese Informationen erhalten, aber dies gilt nicht für SQL Server (gilt jedoch für MySQL): "Wenn eine Fremdschlüsseleinschränkung für eine Tabelle definiert ist, gilt im Gegensatz zu Primärschlüsseleinschränkungen ein Index wird nicht standardmäßig von SQL Server erstellt. "(https://sqlperformance.com/2012/11/t-sql-queries/benefits-indexing-foreign-keys) –

0

Dumb Frage, warum versuchen Sie ein Update basierend auf einem [userType] Wert zu tun?

update UserProfile set messageClient=N'010383772' where fk_user=2; 

Wollen Sie nicht diesen Wert auf einem bestimmten [UserProfile] aktualisieren basierend auf seiner ID (das ist ein Primärschlüssel ist, so würde viel schneller sein)

UPDATE [UserProfile] 
SET [messageClient]='010383772' 
WHERE id_profile=2; 

Vielleicht ist das Performance-Problem ist darauf zurückzuführen zu Ihrem UPDATE, das versucht, alle Ihre [UserProfile] Aufzeichnungen mit diesem bestimmten UserType Wert zu aktualisieren ...?

Oder ich vermisse den Punkt, was Sie versuchen zu tun (und wie viele Datensätze Sie aktualisieren möchten).

+0

Ich habe nur eine Nummer –

+0

Okay, und wie ist die Leistung? Sie führen mein UPDATE mit einem bestimmten [UserProfile] ID-Wert aus? –

0

Möglicherweise haben Sie bereits eine Transaktion (BEGIN TRANSACTION) auf der Tabelle in einem anderen Prozess (möglicherweise eine andere Abfrageeditorseite) gestartet und bis Sie die Transaktion nicht stoppen, die Tabelle nicht für Updates verfügbar. Überprüfen Sie die Variable, indem Sie @@ trancount auswählen, oder versuchen Sie, die von Ihnen bereits vorgenommenen Aktualisierungen rückgängig zu machen (ROLLBACK TRANSACTION). Überprüfen Sie auch, ob andere Tabellen ohne Probleme aktualisiert werden können.

+0

ich nach anderen Tabelle überprüfen, ist es in Ordnung und Update war Erfolg –

+0

Wenn ich Ihnen in irgendeiner Weise half, überprüfen Sie bitte die Antwort als akzeptiert, nur unter den Pfeilen, danke. –

0

Vielen Dank für den Versuch, mir zu helfen mein Problem das Problem behoben wurde eine andere Abfrage Editor Seite, weil ich mit asp.net und eine andere Seite arbeitete ich den gleichen Datensatz zu aktualisieren den gleichen Datensatz, wenn ich die ASP zu stoppen.net Projekt dann Abfrage war Erfolg