Soci (Soczó Zsolt) szakmai blogja

2017.08.17.

Forceseek delete-hez

Filed under: Adatbázisok,SQL Server,Szakmai élet — Soczó Zsolt @ 18:02

Volt egy delete-em, ami nem akart rendesen index mentén lefutni. A delete-et kicserélve select-re ugyanez volt a helyzet, de select esetén egy oszlopokkal kikényszerített forceseek segített.
Viszont delete-et nem lehet hintelni. A megoldás CTE volt, így indirekten mégiscsak lehet hintelni. A lekérdezés pár százszor gyorsabb lett. :)

Érdemes megjegyezni három trükköt tanulságul:
1. CTE kimenetén lehet futtatni DDL-eket
2. Így indirekten lehet hintelni
3. Néha jó index esetén se seekel a szerver, ilyenkor csakis az oszlopokkal megsegített forceseek segít.

;with B
as
(
select * from dbo.Bar with(forceseek(IX_Natural_Key(TickerId, BDT)))
where TickerId = @tickerId and BDT in 
    (select DATEADD(day, DATEDIFF(day,'19000101',DATEADD(DAY, 1, cast(StartDate as datetime))), CAST(ClosingTime AS DATETIME2(7)))
    from TradingHours where TickerId = @timeTemplateTickerId and StartDate is not null and EndDate is null and IsEnabled = 1 and Priority > 10)
)
delete from B;

6 Comments

  1. Akkor mi történt volna, vagy történik, ha meg tudod nézni, ha az IN-ben lévő expression-t materializálód előbb egy #tempTáblába, majd annak az eredményét használva JOIN-nal szűsz esetleg úgy, hogy a BDT lehetséges értékei a #tempTáblában a PKEY maga?

    Kíváncsi lennék, milyen is az a két tábla, meg milyen verziójú a szerver. Ha tippelnem kellene itt az optimizer eltolja a nyakatekert expression miatt az IN-ben.

    Comment by Peter — 2017.08.18. @ 11:34

  2. Először én is temp táblával mentem neki, de nem akart egyszerre két oszlopra seekelni. Mondjuk stat frissítés nem volt…

    Comment by Soczó Zsolt — 2017.08.18. @ 13:21

  3. Multi-Column stat tudna egyébként segíteni – elméletben – ilyen esetben?

    Comment by Peter — 2017.08.31. @ 10:07

  4. Elképzelhető, igen. Ezt akkor nem próbáltam ki, de az ilyen esetekben időnként segít eltéríteni az optimizert.

    Comment by Soczó Zsolt — 2017.09.02. @ 10:28

  5. Azért a select-re néznék egy futási tervet, lenne pár ötletem. A multi col stat egyébként jó lehet, de a probléma oka nem feltétlen ez :)

    Comment by Berke János — 2017.09.04. @ 21:28

  6. Multi col stat pont van a kérdéses oszlopokon, de jogos az észrevétel, update stat with fullscan után már tudja a dolgát a szerver.

    Tanulság a szokásos: hintelés előtt stat update. :)

    Comment by Soczó Zsolt — 2017.09.28. @ 09:16

RSS feed for comments on this post.

Sorry, the comment form is closed at this time.

Powered by WordPress