Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

FORCEPLAN के साथ अपने T-SQL जॉइन के लिए क्वेरी ऑप्टिमाइज़र को ओवरराइड करें

SET FORCEPLAN स्टेटमेंट SQL सर्वर क्वेरी ऑप्टिमाइज़र द्वारा T-SQL को प्रोसेस करने के लिए उपयोग किए गए लॉजिक को ओवरराइड करता है SELECT बयान।

अधिक विशेष रूप से, जब FORCEPLAN ON पर सेट है , क्वेरी ऑप्टिमाइज़र उसी क्रम में शामिल होने की प्रक्रिया करता है जैसे तालिकाएँ FROM . में दिखाई देती हैं एक प्रश्न का खंड।

यह नेस्टेड लूप जॉइन के उपयोग को भी बाध्य करता है जब तक कि क्वेरी के लिए योजना बनाने के लिए अन्य प्रकार के जॉइन की आवश्यकता नहीं होती है, या उनसे जुड़ने के संकेत या क्वेरी संकेत के साथ अनुरोध किया जाता है।

उदाहरण

यह प्रदर्शित करने के लिए कि कैसे FORCEPLAN काम करता है, मैं दो SELECT चलाने जा रहा हूं क्वेरी, पहले FORCEPLAN . के साथ ON पर सेट करें , फिर FORCEPLAN . के साथ OFF पर सेट करें .

दोनों प्रश्न समान हैं, इस अपवाद के साथ कि सम्मिलित तालिकाएं एक अलग क्रम में सूचीबद्ध हैं।

इस उदाहरण में मैं SHOWPLAN_XML . का उपयोग करता हूं अनुमानित क्वेरी योजना दिखाने के लिए, लेकिन आप उतनी ही आसानी से किसी अन्य विधि का उपयोग कर सकते हैं (जैसे Azure डेटा स्टूडियो में समझाएं बटन, या Include Actual Execution Plan वास्तविक क्वेरी योजना प्रदर्शित करने के लिए SSMS में आइकन)।

फोर्सप्लान चालू करें

SET FORCEPLAN ON;
GO

SET SHOWPLAN_XML ON;
GO

SELECT
    ar.ArtistName,
    al.AlbumName,
    g.Genre
FROM 
    Artists ar 
    INNER JOIN Albums al 
    ON ar.ArtistId = al.ArtistId 
    INNER JOIN Genres g 
    ON al.GenreId = g.GenreId;

SELECT
    ar.ArtistName,
    al.AlbumName,
    g.Genre
FROM 
    Albums al
    INNER JOIN Genres g 
    ON al.GenreId = g.GenreId
    INNER JOIN Artists ar 
    ON ar.ArtistId = al.ArtistId;

परिणाम:

हम देख सकते हैं कि प्रत्येक क्वेरी के लिए क्वेरी योजना उस क्रम को दर्शाती है जिसमें मैंने FROM में तालिका के नाम शामिल किए हैं खंड।

फोर्सप्लान बंद करें

SET SHOWPLAN_XML OFF;
GO

SET FORCEPLAN OFF;
GO

SET SHOWPLAN_XML ON;
GO

SELECT
    ar.ArtistName,
    al.AlbumName,
    g.Genre
FROM 
    Artists ar 
    INNER JOIN Albums al 
    ON ar.ArtistId = al.ArtistId 
    INNER JOIN Genres g 
    ON al.GenreId = g.GenreId;

SELECT
    ar.ArtistName,
    al.AlbumName,
    g.Genre
FROM 
    Albums al
    INNER JOIN Genres g 
    ON al.GenreId = g.GenreId
    INNER JOIN Artists ar 
    ON ar.ArtistId = al.ArtistId;

परिणाम:

इस बार, दोनों प्रश्नों का परिणाम एक समान क्वेरी योजना में होता है। क्वेरी ऑप्टिमाइज़र ने उस क्रम को नज़रअंदाज़ कर दिया जिसमें मैंने उन्हें FROM . में सूचीबद्ध किया था खंड और अपना स्वयं का आदेश निर्धारित किया।

ध्यान दें कि FORCEPLAN सेटिंग SELECT . द्वारा लौटाए गए डेटा को नहीं बदलती है बयान। वास्तविक परिणाम समान हैं चाहे FORCEPLAN ON पर सेट है या OFF . केवल अंतर ही तालिकाओं को संसाधित करने का तरीका है (जो प्रदर्शन पर प्रभाव डाल सकता है)।

आप SET FORCEPLAN का उपयोग कर सकते हैं क्वेरी ऑप्टिमाइज़र के संयोजन के साथ यह संकेत देता है कि क्वेरी कैसे संसाधित की जाती है।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Microsoft SQL Server 2008 R2 के लिए अनुक्रमणिका ऑटोइनक्रिकमेंट

  2. टी-एसक्यूएल का उपयोग करते हुए फजी मिलान

  3. रैंड () SQL सर्वर में उदाहरण

  4. किसी भिन्न SQL सर्वर पर किसी भिन्न डेटाबेस में तालिका की प्रतिलिपि बनाएँ

  5. फ़ील्ड मान का निर्धारण कैसे करें जो SQL सर्वर में (दशमलव, फ्लोट, इंट) में परिवर्तित नहीं हो सकता है