2011-06-20 17 views
5

मेरे पास दो टेबल TableA और TableB हैं जिनके पास जानकारी मैं पुनर्प्राप्त करना और एक साथ अपडेट करना चाहता हूं। जब मैंINNER JOIN और ताले

SELECT TOP 2 SomeFieldA 
FROM TableA WITH (ROWLOCK , UPDLOCK , READPAST) 

सब कुछ ठीक काम करता है का उपयोग करें और प्रक्रिया 1 देखता है, कहते हैं, पंक्तियों 1 और 2, जबकि प्रक्रिया 2, देखता है कहते हैं, पंक्तियों 3 और 4. यह अपेक्षित व्यवहार है। साथ ही, जब मैं EXEC sp_lock निष्पादित करता हूं तो मुझे केवल दो KEY प्रविष्टियां दिखाई देती हैं। हालांकि, जब मैं

SELECT TOP 2 SomeFieldA 
FROM TableA WITH (ROWLOCK , UPDLOCK , READPAST) 
INNER JOIN 
Table B WITH (ROWLOCK , UPDLOCK , READPAST) 
ON TableA.ID = TableB.IDRef` 

पहली प्रक्रिया पंक्तियों 1 और 2 को देखता है, लेकिन प्रक्रिया 2 को कुछ भी नहीं दिखता है। sp_lock निष्पादित करता है कि अब सभी पंक्तियों को अवरुद्ध कर दिया गया है। ये क्यों हो रहा है?

संपादित करें: निष्पादन योजना:

<?xml version="1.0" encoding="utf-16"?> 
<ShowPlanXML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Version="1.1" Build="10.50.1617.0" xmlns="http://schemas.microsoft.com/sqlserver/2004/07/showplan"> 
    <BatchSequence> 
    <Batch> 
     <Statements> 
     <StmtSimple StatementCompId="2" StatementEstRows="2" StatementId="1" StatementOptmLevel="FULL" StatementOptmEarlyAbortReason="GoodEnoughPlanFound" StatementSubTreeCost="0.00670141" StatementText="SELECT TOP 2 * FROM Request R WITH (ROWLOCK , UPDLOCK , READPAST) INNER JOIN Options O WITH (ROWLOCK , UPDLOCK , READPAST) ON (R.RequestID = O.RequestID)&#xD;&#xA;&#xD;" StatementType="SELECT" QueryHash="0xA35BE09F9DD52334" QueryPlanHash="0x95BEDE8C14AB4C68"> 
      <StatementSetOptions ANSI_NULLS="true" ANSI_PADDING="true" ANSI_WARNINGS="true" ARITHABORT="true" CONCAT_NULL_YIELDS_NULL="true" NUMERIC_ROUNDABORT="false" QUOTED_IDENTIFIER="true" /> 
      <QueryPlan DegreeOfParallelism="1" CachedPlanSize="16" CompileTime="3" CompileCPU="3" CompileMemory="160"> 
      <RelOp AvgRowSize="58" EstimateCPU="2E-07" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="2" LogicalOp="Top" NodeId="0" Parallel="false" PhysicalOp="Top" EstimatedTotalSubtreeCost="0.00670141"> 
       <OutputList> 
       <ColumnReference Database="[TestDatabase]" Schema="[dbo]" Table="[Request]" Alias="[R]" Column="RequestID" /> 
       <ColumnReference Database="[TestDatabase]" Schema="[dbo]" Table="[Request]" Alias="[R]" Column="DateEntered" /> 
       <ColumnReference Database="[TestDatabase]" Schema="[dbo]" Table="[Request]" Alias="[R]" Column="Priority" /> 
       <ColumnReference Database="[TestDatabase]" Schema="[dbo]" Table="[Options]" Alias="[O]" Column="RequestID" /> 
       <ColumnReference Database="[TestDatabase]" Schema="[dbo]" Table="[Options]" Alias="[O]" Column="SomeOptions" /> 
       </OutputList> 
       <RunTimeInformation> 
       <RunTimeCountersPerThread Thread="0" ActualRows="2" ActualEndOfScans="1" ActualExecutions="1" /> 
       </RunTimeInformation> 
       <Top RowCount="false" IsPercent="false" WithTies="false"> 
       <TopExpression> 
        <ScalarOperator ScalarString="(2)"> 
        <Const ConstValue="(2)" /> 
        </ScalarOperator> 
       </TopExpression> 
       <RelOp AvgRowSize="58" EstimateCPU="7.524E-05" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="2" LogicalOp="Inner Join" NodeId="1" Parallel="false" PhysicalOp="Nested Loops" EstimatedTotalSubtreeCost="0.00670121"> 
        <OutputList> 
        <ColumnReference Database="[TestDatabase]" Schema="[dbo]" Table="[Request]" Alias="[R]" Column="RequestID" /> 
        <ColumnReference Database="[TestDatabase]" Schema="[dbo]" Table="[Request]" Alias="[R]" Column="DateEntered" /> 
        <ColumnReference Database="[TestDatabase]" Schema="[dbo]" Table="[Request]" Alias="[R]" Column="Priority" /> 
        <ColumnReference Database="[TestDatabase]" Schema="[dbo]" Table="[Options]" Alias="[O]" Column="RequestID" /> 
        <ColumnReference Database="[TestDatabase]" Schema="[dbo]" Table="[Options]" Alias="[O]" Column="SomeOptions" /> 
        </OutputList> 
        <RunTimeInformation> 
        <RunTimeCountersPerThread Thread="0" ActualRows="2" ActualEndOfScans="0" ActualExecutions="1" /> 
        </RunTimeInformation> 
        <NestedLoops Optimized="false"> 
        <Predicate> 
         <ScalarOperator ScalarString="[TestDatabase].[dbo].[Options].[RequestID] as [O].[RequestID]=[TestDatabase].[dbo].[Request].[RequestID] as [R].[RequestID]"> 
         <Compare CompareOp="EQ"> 
          <ScalarOperator> 
          <Identifier> 
           <ColumnReference Database="[TestDatabase]" Schema="[dbo]" Table="[Options]" Alias="[O]" Column="RequestID" /> 
          </Identifier> 
          </ScalarOperator> 
          <ScalarOperator> 
          <Identifier> 
           <ColumnReference Database="[TestDatabase]" Schema="[dbo]" Table="[Request]" Alias="[R]" Column="RequestID" /> 
          </Identifier> 
          </ScalarOperator> 
         </Compare> 
         </ScalarOperator> 
        </Predicate> 
        <RelOp AvgRowSize="45" EstimateCPU="0.0001603" EstimateIO="0.003125" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="2" LogicalOp="Clustered Index Scan" NodeId="2" Parallel="false" PhysicalOp="Clustered Index Scan" EstimatedTotalSubtreeCost="0.0032842" TableCardinality="3"> 
         <OutputList> 
         <ColumnReference Database="[TestDatabase]" Schema="[dbo]" Table="[Options]" Alias="[O]" Column="RequestID" /> 
         <ColumnReference Database="[TestDatabase]" Schema="[dbo]" Table="[Options]" Alias="[O]" Column="SomeOptions" /> 
         </OutputList> 
         <RunTimeInformation> 
         <RunTimeCountersPerThread Thread="0" ActualRows="2" ActualEndOfScans="0" ActualExecutions="1" /> 
         </RunTimeInformation> 
         <IndexScan Ordered="false" ForcedIndex="false" NoExpandHint="false"> 
         <DefinedValues> 
          <DefinedValue> 
          <ColumnReference Database="[TestDatabase]" Schema="[dbo]" Table="[Options]" Alias="[O]" Column="RequestID" /> 
          </DefinedValue> 
          <DefinedValue> 
          <ColumnReference Database="[TestDatabase]" Schema="[dbo]" Table="[Options]" Alias="[O]" Column="SomeOptions" /> 
          </DefinedValue> 
         </DefinedValues> 
         <Object Database="[TestDatabase]" Schema="[dbo]" Table="[Options]" Index="[PK__Options__33A8519A1DE57479]" Alias="[O]" IndexKind="Clustered" /> 
         </IndexScan> 
        </RelOp> 
        <RelOp AvgRowSize="20" EstimateCPU="8.51E-05" EstimateIO="0.0032035" EstimateRebinds="0" EstimateRewinds="1.33333" EstimateRows="6" LogicalOp="Table Scan" NodeId="3" Parallel="false" PhysicalOp="Table Scan" EstimatedTotalSubtreeCost="0.00340207" TableCardinality="6"> 
         <OutputList> 
         <ColumnReference Database="[TestDatabase]" Schema="[dbo]" Table="[Request]" Alias="[R]" Column="RequestID" /> 
         <ColumnReference Database="[TestDatabase]" Schema="[dbo]" Table="[Request]" Alias="[R]" Column="DateEntered" /> 
         <ColumnReference Database="[TestDatabase]" Schema="[dbo]" Table="[Request]" Alias="[R]" Column="Priority" /> 
         </OutputList> 
         <RunTimeInformation> 
         <RunTimeCountersPerThread Thread="0" ActualRows="8" ActualEndOfScans="1" ActualExecutions="2" /> 
         </RunTimeInformation> 
         <TableScan Ordered="false" ForcedIndex="false" NoExpandHint="false"> 
         <DefinedValues> 
          <DefinedValue> 
          <ColumnReference Database="[TestDatabase]" Schema="[dbo]" Table="[Request]" Alias="[R]" Column="RequestID" /> 
          </DefinedValue> 
          <DefinedValue> 
          <ColumnReference Database="[TestDatabase]" Schema="[dbo]" Table="[Request]" Alias="[R]" Column="DateEntered" /> 
          </DefinedValue> 
          <DefinedValue> 
          <ColumnReference Database="[TestDatabase]" Schema="[dbo]" Table="[Request]" Alias="[R]" Column="Priority" /> 
          </DefinedValue> 
         </DefinedValues> 
         <Object Database="[TestDatabase]" Schema="[dbo]" Table="[Request]" Alias="[R]" IndexKind="Heap" /> 
         </TableScan> 
        </RelOp> 
        </NestedLoops> 
       </RelOp> 
       </Top> 
      </RelOp> 
      </QueryPlan> 
     </StmtSimple> 
     </Statements> 
    </Batch> 
    </BatchSequence> 
</ShowPlanXML> 

एसक्यूएल:

CREATE TABLE Request 
(
    RequestID INT PRIMARY KEY, 
    Priority INT, 
    DateEntered DATETIME 
) 

CREATE TABLE Options 
(
    RequestIDRef INT PRIMARY KEY, 
    SomeOptions  NVARCHAR(MAX) 
) 
ALTER TABLE Options ADD 

    CONSTRAINT FK_REQUESTIDREF FOREIGN KEY (RequestIDRef) REFERENCES [Request] (RequestID) 

GO 

INSERT INTO Request VALUES (1, 2, GETDATE()) 
INSERT INTO Request VALUES (2, 1, GETDATE()) 
INSERT INTO Request VALUES (3, 3, GETDATE()) 
INSERT INTO Request VALUES (4, 2, GETDATE()) 

INSERT INTO Options VALUES (1, 'a') 
INSERT INTO Options VALUES (2, 'b') 
INSERT INTO Options VALUES (3, 'c') 
INSERT INTO Options VALUES (4, 'd') 

CREATE NONCLUSTERED INDEX IX_REQUESTIDREF ON [Options] (RequestIDRef) 
CREATE NONCLUSTERED INDEX IX_PRIORITY_DATEENTERED ON [Request] (Priority , DateEntered) INCLUDE (RequestID) 

अब,

BEGIN TRANSACTION 

SELECT TOP 2 * FROM [Request] WITH (ROWLOCK , UPDLOCK , READPAST) INNER JOIN [Options] WITH (ROWLOCK , UPDLOCK , READPAST) ON (Request.RequestID = Options.RequestIDRef) ORDER BY Priority, DateEntered 

WAITFOR DELAY '00:00:02.5' 

COMMIT TRANSACTION 

QUERY1 पर रिटर्न 2 और 1, अपेक्षा के अनुरूप है, लेकिन पर प्रश्न 2 यह कुछ भी नहीं देता है। हालांकि, अगर मैं INNER JOIN को हटाता हूं और दूसरी तालिका यह काम करता है और क्वेरी 2 में (और 1) क्विरी 2 में (3,4) देता है।

+0

कितने पंक्तियों प्रत्येक तालिका में हैं कवर नहीं कर रहे हैं? –

+0

क्या आप कृपया क्वेरी योजना जोड़ सकते हैं? और वास्तविक डेटा? और सूचकांक? – gbn

+0

एर ... टेक्स्ट प्लान, एक्सएमएल नहीं – gbn

उत्तर

4

तार्किक रूप से, ए और बी का कार्टेशियन उत्पाद छेड़छाड़ या मिलान पंक्तियों तक ही सीमित है।

इन मिलान पंक्तियों को खोजने के लिए, TableA.ID और TableB.IDRef को देखा जाता है। पर कोई तालिका स्कैन की आवश्यकता नहीं है यदि कोई अनुक्रमणिका नहीं है। इसलिए स्कैन

के लिए सभी पंक्तियों को बंद कर दिया गया है, इसलिए TableA.ID और TableB.IDRef दोनों में अनुक्रमणिका होना आवश्यक है। मुझे संदेह है कि TableA.ID पहले से ही पीके के रूप में है लेकिन TableB.IDRef नहीं करता है।

टॉप बाद में लागू किया जाता है BTW

यह मेरा जवाब यहाँ जहां से कोई आदेश और कोई सूचकांक के साथ टॉप पर है के समान है: ORDER BY and WITH(ROWLOCK, UPDLOCK, READPAST)। यदि आपने पहली क्वेरी में ORDER जोड़ा है, तो दूसरी प्रक्रिया में कुछ भी अधिक संभावना नहीं दिखाई देगी।

संपादित करें: आपके अपडेट के लिए, चुनें * सूचकांक उपयोग को अमान्य और स्कैन का कारण होगा: अनुक्रमित चयन के साथ बहुत उपयोग * नहीं हैं, क्योंकि वे

+0

हाय जीबीएन, और एक बार फिर धन्यवाद। लेकिन यह अभी भी काम नहीं करता है। कृपया मेरा संपादन देखें। –

संबंधित मुद्दे