| |
Veteran
Beiträge: 101
| Ich habe eine grosse Tabelle (mit vielen Einträgen). Die Tabelle hat einen 'clustered index' auf dem 'primary key', einem integer autoincrement. Daneben hat die Tabelle noch weitere acht Indizes.
Jetzt habe ich am Schluss zwei Felder angefügt vom Typ BIT NOT NULL.
Diese beiden Felder möchte ich bei allen bereits bestehenden Einträgen auf den Wert FALSE setzen (numerisch: 0).
Dazu benütze ich folgenden Command:
UPDATE (tablename)
SET (columnname) =0
WHERE (indexfield1) BETWEEN (date1) and (date2)
Das dauert unendlich lange. Ein Blick in den 'estimated execution plan' offenbart Erstaunliches:
Der SQL Server macht einen 'clustered index update' auf allen Einträgen; dieser benötigt 98% der totalen Kosten.
Dabei wird der PK gar nicht geändert. Der 'execution plan' sieht übrigens im Wesentlichen gleich aus, wenn ich die WHERE-Klausel weglasse.
Wie ist das zu erklären? Und wie bringt man den SQL Server dazu, sich nur um das eine BIT-Feld zu kümmern und die Finger vom clustered index zu lassen?
Edited by Marzer 24.05.16 04:46
Anhänge ---------------- Donkarl01.jpg (75KB - 3 downloads)
| |
|