Når forespørgselsmotoren ser dette...
(SELECT TOP 1 [val] FROM @randomStuff ORDER BY NEWID())
... det hele er ligesom, "åååh, en skalær underforespørgsel, der kan cachelagres, den skal jeg cache!"
Du skal narre forespørgselsmotoren til at tro, at den ikke er cachbar. jfars svar
var tæt på, men forespørgselsmotoren var smart nok til at se tautalogien af MyTable.MyColumn = MyTable.MyColumn
, men det er ikke smart nok at gennemskue dette.
UPDATE MyTable
SET MyColumn = (SELECT TOP 1 val
FROM @randomStuff r
INNER JOIN MyTable _MT
ON M.Id = _MT.Id
ORDER BY NEWID())
FROM MyTable M
Ved at bringe den ydre tabel (MT) ind i underforespørgslen, antager forespørgselsmotoren, at underforespørgsel skal revurderes. Alt vil virkelig fungere, men jeg brugte den (antagede) primære nøgle til MyTable.Id, da den ville blive indekseret og ville tilføje meget lidt overhead.
En markør ville nok være lige så hurtig, men er bestemt ikke så sjov.