ठीक है, मेरे पास समानांतर चयन है लेकिन नहीं टेबल वेरिएबल पर
मैंने इसे गुमनाम कर दिया है और:
- BigParallelTable 900k पंक्तियों और चौड़ी है
- विरासत कारणों से, BigParallelTable आंशिक रूप से विकृत है (मैं इसे बाद में, वादा कर दूंगा)
- BigParallelTable अक्सर समानांतर योजनाएँ बनाता है क्योंकि यह आदर्श नहीं है और "महंगी" है
- SQL सर्वर 2005 x64, SP3, 4035, 16 कोर का निर्माण करें
प्रश्न + योजना:
DECLARE @FilterList TABLE (bar varchar(100) NOT NULL)
INSERT @FilterList (bar)
SELECT 'val1' UNION ALL 'val2' UNION ALL 'val3'
--snipped
SELECT
*
FROM
dbo.BigParallelTable BPT
JOIN
@FilterList FL ON BPT.Thing = FL.Bar
StmtText
|--Parallelism(Gather Streams)
|--Hash Match(Inner Join, HASH:([FL].[bar])=([BPT].[Thing]), RESIDUAL:(@FilterList.[bar] as [FL].[bar]=[MyDB].[dbo].[BigParallelTable].[Thing] as [BPT].[Thing]))
|--Parallelism(Distribute Streams, Broadcast Partitioning)
| |--Table Scan(OBJECT:(@FilterList AS [FL]))
|--Clustered Index Scan(OBJECT:([MyDB].[dbo].[BigParallelTable].[PK_BigParallelTable] AS [BPT]))
अब, इसके बारे में सोचते हुए, एक टेबल वैरिएबल लगभग हमेशा एक टेबल स्कैन होता है, इसमें कोई आंकड़े नहीं होते हैं और इसे एक पंक्ति माना जाता है "पंक्तियों की अनुमानित संख्या =1", "वास्तविक .. =3"।
क्या हम घोषित कर सकते हैं कि तालिका चर समानांतर में उपयोग नहीं किए जाते हैं, लेकिन युक्त योजना कहीं और समानता का उपयोग कर सकती है? तो BOL सही है और SQL संग्रहण आलेख गलत है