जब क्वेरी इंजन इसे देखता है...
(SELECT TOP 1 [val] FROM @randomStuff ORDER BY NEWID())
... यह सब कुछ इस तरह है, "ओह, एक कैचेबल स्केलर सबक्वेरी, मैं इसे कैश करने वाला हूं!"
आपको क्वेरी इंजन को यह सोचने की ज़रूरत है कि यह गैर-कैश करने योग्य है। jfar's उत्तर
करीब था, लेकिन क्वेरी इंजन इतना स्मार्ट था कि 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
बाहरी तालिका (एमटी) को सबक्वायरी में लाकर, क्वेरी इंजन मानता है कि सबक्वायरी का पुनर्मूल्यांकन करने की आवश्यकता होगी। कुछ भी वास्तव में काम करेगा, लेकिन मैं MyTable.Id की प्राथमिक कुंजी (माना गया) के साथ गया था क्योंकि इसे अनुक्रमित किया जाएगा और बहुत कम ओवरहेड जोड़ देगा।
एक कर्सर शायद उतना ही तेज़ होगा, लेकिन निश्चित रूप से उतना मज़ेदार नहीं है।