2012-12-10 23 views
6

मैं इस तरह एक प्रश्न है:कैसे मैं पहले सबक्वेरी निष्पादित और फिल्टर करने के लिए एसक्यूएल सर्वर मजबूर कर सकते हैं 'जहां' बयान

select * from (
    select * from TableX 
    where col1 % 2 = 0 
) subquery 
where col1 % 4 = 0 

वास्तविक सबक्वेरी अधिक जटिल है। जब मैं अकेले सबक्वायरी निष्पादित करता हूं तो यह जल्दी से 200rows देता है, लेकिन जब मैं पूरी क्वेरी निष्पादित करता हूं, तो प्रतीक्षा करने में बहुत लंबा समय लगता है।

मुझे पता है कि एसक्यूएल सर्वर यहां कुछ अनुकूलन लेता है और where कथन को सबक्वायरी में विलय करता है, और नई निष्पादन योजना का उत्पादन करता है जो कि कुशल नहीं है। एल्थॉट मैं निष्पादन योजना में जा सकता हूं और विश्लेषण कर सकता हूं कि क्यों, इंडेक्स गायब होने की तरह, सांख्यिकी स्टेल।

लेकिन मुझे निश्चित रूप से पता है कि, मेरी सबक्वायरी जो बेसटेबल के रूप में कार्य करती है केवल डेटा का एक छोटा सा हिस्सा लौटाएगी, इसलिए मैं चाहता हूं कि सभी फ़िल्टरिंग या शामिल होने से डेटा के इन छोटे हिस्से में ही होगा।

मेरा सवाल है, क्या मैं बाहरी where कथन के बारे में देखभाल किए बिना, पहले सबक्वायरी निष्पादित करने के लिए एसक्यूएल सर्वर को मजबूर कर सकता हूं? (Btw, TempTable मेरा आखिरी विकल्प है, CTE काम नहीं कर रहा)

+0

अस्थायी तालिका का उपयोग करने के बारे में क्या? – fnurglewitz

+1

वास्तविक समस्या की व्याख्या करने के बारे में क्या - बल न दें, लेकिन निष्पादन योजना की जांच करें और देखें कि क्यों SQL सर्वर सोचता है कि यह उस तरह से बेहतर है। क्या आप पूरी तरह से पैच हैं? कुछ मुद्दे क्वेरी ऑप्टिमाइज़र के साथ थे - अतीत में लंबे समय तक, लेकिन कुछ लोग अभी भी एसक्यूएल सर्वर 2005 का उपयोग करते हैं। – TomTom

+1

@ टॉमटॉम ये भविष्यवाणियां अनुपयोगी हैं, इसलिए उम्मीद है कि ऑप्टिमाइज़र अनुमान बंद हो जाएंगे। यह आंकड़ों का उपयोग नहीं कर सकता है और केवल अनुमान लगाना होगा। शायद एक गणना कॉलम पर आंकड़े बनाने में मदद मिलेगी। –

उत्तर

-2

आप उस के लिए CTE उपयोग कर सकते हैं:

with cte as(
select * from TableX where col1 % 2 = 0 
) 

select * from (select * from cte) subquery where col1 % 4 = 0 
+3

यह मूल्यांकन के किसी भी विशेष क्रम को मजबूर नहीं करता है। एसक्यूएल सर्वर ओपी में व्युत्पन्न तालिका के साथ ही दो प्रश्नों को मर्ज करेगा। –

+0

सीटी किसी भी क्रम में क्वेरी निष्पादित करने के लिए मजबूर नहीं है। – danihp

+0

@ मार्टिनस्मिथ: प्रश्न के अनुसार, यह बाहरी 'कहां' कथन –

-1

enter image description here

CREATE TABLE [dbo].[Performance](
    [Id1] [int] NOT NULL, 
    [Id2] [int] NOT NULL, 
    [Id3] [int] NOT NULL, 
    [Description] [varchar](50) NOT NULL, 
CONSTRAINT [PK_Performance] PRIMARY KEY CLUSTERED 
(
    [Id1] ASC, 
    [Id2] ASC, 
    [Id3] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) 
) 

select count(*) from [Performance] = 2.000.000

select 
    a.* 
from 
    [Performance] a 
    inner join (
     select Id1,Id2,Id3,Description from [Performance] where (id1 % 2 = 0) 
    ) b on (a.id1 = b.id1) 
where 
    (b.Id3 % 3 = 0) 

स्वयं व्युत्पन्न तालिका

से जुड़ें

परिणाम बहुत तेजी से लौटे, मैं कहूंगा (200.000 पंक्तियां)।

enter image description here

-1

आप की कोशिश की है:

select * from ( select * from TableX as inner where inner.col1 % 2 = 0 ) as subquery where subquery.col1 % 4 = 0

मेरा मानना ​​है कि यह पहली बार यहाँ सबक्वेरी निष्पादित करने के लिए नहीं है, क्योंकि आप स्पष्ट रूप से सबक्वेरी के aliased परिणाम पर जहां हालत हो रही है।