SQL Server a frissítési lekérdezések optimalizálása nagy Adatmennyiségekhez
a nagyon nagy táblák frissítése időigényes feladat lehet, és néha órákig is eltarthat. Ezen felül blokkolási problémákat is okozhat.
íme néhány tipp, hogy az SQL Server optimalizálja a frissítéseket a nagy adatmennyiségek.
- index eltávolítása a frissítendő oszlopon.
- a frissítés végrehajtása kisebb tételekben.
- a törlési triggerek letiltása.
- az Update utasítás cseréje tömeges Beszúrási művelettel.
ennek ellenére alkalmazzuk a fenti pontokat a frissítési lekérdezés optimalizálására.
az alábbi kód létrehoz egy dummy táblát 200 000 sorral és kötelező indexekkel.
CREATE TABLE tblverylargetable ( sno INT IDENTITY, col1 CHAR(800), col2 CHAR(800), col3 CHAR(800) ) GO DECLARE @i INT=0 WHILE( @i < 200000 ) BEGIN INSERT INTO tblverylargetable VALUES ('Dummy', Replicate('Dummy', 160), Replicate('Dummy', 160)) SET @i=@i + 1 ENDGOCREATE INDEX ix_col1 ON tblverylargetable(col1) GO CREATE INDEX ix_col2_col3 ON tblverylargetable(col2) INCLUDE(col3)
fontolja meg a következő frissítési lekérdezést, amelyet optimalizálni kell. Ez egy nagyon egyenes lekérdezés egyetlen oszlop frissítésére.
UPDATE tblverylargetable SET col1 = 'D'WHERE col1 = 'Dummy'
a lekérdezés végrehajtása 2:19 percet vesz igénybe.
nézzük meg az alábbi lekérdezés végrehajtási tervét. A fürtözött indexfrissítés mellett az ix_col1 index is frissül. Az indexfrissítés és a rendezési művelet együttesen a végrehajtási költség 64% – át teszi ki.
1. Az index eltávolítása a frissítendő oszlopon
ugyanez a lekérdezés 14-18 másodpercet vesz igénybe, ha nincs index a col1-en. Így a frissítési lekérdezés gyorsabban fut, ha a frissítendő oszlop nem indexkulcs oszlop. Az index mindig létrehozható a frissítés befejezése után.
2. A frissítés végrehajtása kisebb tételekben
a lekérdezés tovább optimalizálható kisebb tételekben történő végrehajtással. Ez általában gyorsabb. Az alábbi kód 20000-es tételekben frissíti a rekordokat.
DECLARE @i INT=1 WHILE( @i <= 10 ) BEGIN UPDATE TOP(20000) tblverylargetable SET col1 = 'D' WHERE col1 = 'Dummy' SET @i=@i + 1 END
a fenti lekérdezés végrehajtása 6-8 másodpercet vesz igénybe. Kötegekben történő frissítéskor, még akkor is, ha a frissítés sikertelen vagy le kell állítani, csak az aktuális köteg sorai kerülnek vissza.
3. A törlési triggerek letiltása
a kurzorokkal történő triggerek rendkívül lelassíthatják a törlési lekérdezés teljesítményét. A Törlés utáni letiltás jelentősen növeli a lekérdezés teljesítményét.
4. Az Update utasítás cseréje tömeges Beszúrási művelettel
az update utasítás teljesen naplózott művelet, így minden bizonnyal jelentős időt vesz igénybe, ha több millió sort kell frissíteni.A frissítési lekérdezés felgyorsításának leggyorsabb módja az, ha tömeges beszúrási művelettel helyettesíti. Ez egy minimálisan naplózott művelet egyszerű és tömeges naplózott helyreállítási modellben. Ezt meg lehet tenni könnyen csinál egy tömeges-helyezze be egy új táblázatot, majd nevezze át a táblázatot az eredeti egy. A szükséges indexek és korlátozások szükség szerint létrehozhatók egy új táblán.
az alábbi kód azt mutatja, hogy a frissítés Hogyan konvertálható tömeges beszúrási műveletre. A végrehajtás 4 másodpercig tart.
SELECT sno, CASE col1 WHEN 'Dummy' THEN 'D' ELSE col1 END AS col1, col2, col3 INTO tblverylargetabletemp FROM tblverylargetable
az ömlesztett lapka ezután tovább optimalizálható, hogy további teljesítménynövekedést érjen el.
Remélem, ez segít!!!
Lájkolj minket a FaceBook-on | Kövess minket a Twitteren | Csatlakozz a leggyorsabban növekvő SQL Server csoporthoz a FaceBook-on