Saat mesin kueri melihat ini...
(SELECT TOP 1 [val] FROM @randomStuff ORDER BY NEWID())
... semuanya seperti, "ooooh, subquery skalar yang dapat di-cache, saya akan menyimpannya di cache!"
Anda perlu mengelabui mesin kueri agar menganggapnya tidak dapat disimpan dalam cache. jfar jawab
dekat, tetapi mesin kueri cukup pintar untuk melihat tautalogi MyTable.MyColumn = MyTable.MyColumn
, tapi tidak cukup pintar untuk melihat ini.
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
Dengan memasukkan tabel luar (MT) ke dalam subquery, mesin kueri mengasumsikan subquery perlu dievaluasi ulang. Apa pun akan benar-benar berfungsi, tetapi saya menggunakan kunci utama (diasumsikan) dari MyTable.Id karena akan diindeks dan akan menambahkan sedikit overhead.
Kursor mungkin sama cepatnya, tetapi tentu saja tidak semenyenangkan ini.