Когато машината за заявки види това...
(SELECT TOP 1 [val] FROM @randomStuff ORDER BY NEWID())
... всичко е като "оооо, кешираща скаларна подзаявка, ще я кеширам!"
Трябва да подмамите машината за заявки да мисли, че не може да се кешира. отговор
беше близо, но машината за заявки беше достатъчно интелигентна, за да види тавтологията на MyTable.MyColumn = MyTable.MyColumn
, но не е достатъчно умен, за да разбере това.
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
Чрез въвеждането на външната таблица (MT) в подзаявката, машината за заявки приема, че подзаявката ще трябва да бъде преоценена. Всичко ще работи наистина, но избрах (предполагаемия) първичен ключ на MyTable.Id, тъй като той ще бъде индексиран и ще добави много малко допълнителни разходи.
Курсорът вероятно би бил също толкова бърз, но със сигурност не е толкова забавен.