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;
Could you hire me? Contact me if you like what I’ve done in this article and think I can create value for your company with my skills.
LEAVE A COMMENT
6 COMMENTS
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.
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…
Multi-Column stat tudna egyébként segíteni – elméletben – ilyen esetben?
Elképzelhető, igen. Ezt akkor nem próbáltam ki, de az ilyen esetekben időnként segít eltéríteni az optimizert.
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 :)
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. :)