Forceseek delete-hez

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 thoughts on “Forceseek delete-hez

  1. Peter

    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.

    1. Soczó Zsolt Post author

      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…

  2. Peter

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

    1. Soczó Zsolt Post author

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

  3. Berke János

    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 :)

  4. Soczó Zsolt Post author

    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. :)

Comments are closed.