এসএনকিউএল সার্ভারে অন্তর্ভুক্ত বনাম বনাম বাম যোগদান করুন


259

আমি এসকিউএল কমান্ড তৈরি করেছি যা 9 টি টেবিলগুলিতে অভ্যন্তরীণ যোগদান করে, যাইহোক এই কমান্ডটি খুব দীর্ঘ সময় নেয় (পাঁচ মিনিটেরও বেশি)। সুতরাং আমার লোকেরা আমাকে অন্তর্ভুক্ত করে বাম যোগে পরিবর্তিত করার পরামর্শ দিয়েছে কারণ আমি যা জানি তা সত্ত্বেও বাম জয়েন্টের অভিনয় আরও ভাল। আমি এটি পরিবর্তন করার পরে, প্রশ্নের গতি উল্লেখযোগ্যভাবে উন্নত হয়েছে।

আমি জানতে চাই কেন বাম জোট অন্তর্ভুক্তের চেয়ে দ্রুত?

আমার এসকিউএল কমান্ড নীচের মত দেখতে: SELECT * FROM A INNER JOIN B ON ... INNER JOIN C ON ... INNER JOIN D এবং আরও

আপডেট: এটি আমার স্কিমা সংক্ষিপ্ত।

FROM sidisaleshdrmly a -- NOT HAVE PK AND FK
    INNER JOIN sidisalesdetmly b -- THIS TABLE ALSO HAVE NO PK AND FK
        ON a.CompanyCd = b.CompanyCd 
           AND a.SPRNo = b.SPRNo 
           AND a.SuffixNo = b.SuffixNo 
           AND a.dnno = b.dnno
    INNER JOIN exFSlipDet h -- PK = CompanyCd, FSlipNo, FSlipSuffix, FSlipLine
        ON a.CompanyCd = h.CompanyCd
           AND a.sprno = h.AcctSPRNo
    INNER JOIN exFSlipHdr c -- PK = CompanyCd, FSlipNo, FSlipSuffix
        ON c.CompanyCd = h.CompanyCd
           AND c.FSlipNo = h.FSlipNo 
           AND c.FSlipSuffix = h.FSlipSuffix 
    INNER JOIN coMappingExpParty d -- NO PK AND FK
        ON c.CompanyCd = d.CompanyCd
           AND c.CountryCd = d.CountryCd 
    INNER JOIN coProduct e -- PK = CompanyCd, ProductSalesCd
        ON b.CompanyCd = e.CompanyCd
           AND b.ProductSalesCd = e.ProductSalesCd 
    LEFT JOIN coUOM i -- PK = UOMId
        ON h.UOMId = i.UOMId 
    INNER JOIN coProductOldInformation j -- PK = CompanyCd, BFStatus, SpecCd
        ON a.CompanyCd = j.CompanyCd
            AND b.BFStatus = j.BFStatus
            AND b.ProductSalesCd = j.ProductSalesCd
    INNER JOIN coProductGroup1 g1 -- PK = CompanyCd, ProductCategoryCd, UsedDepartment, ProductGroup1Cd
        ON e.ProductGroup1Cd  = g1.ProductGroup1Cd
    INNER JOIN coProductGroup2 g2 -- PK = CompanyCd, ProductCategoryCd, UsedDepartment, ProductGroup2Cd
        ON e.ProductGroup1Cd  = g2.ProductGroup1Cd

1
আপনি থেকে কোন বৈশিষ্ট্য প্রজেক্ট coUOM? যদি না হয় আপনি একটি আধা জয়েন্ট ব্যবহার করতে সক্ষম হতে পারেন। যদি হ্যাঁ, আপনি UNIONবিকল্প হিসাবে ব্যবহার করতে সক্ষম হবেন । FROMএখানে কেবল আপনার ধারা পোস্ট করা অপর্যাপ্ত তথ্য।
ওনেডেওহেন

1
আমি এটি প্রায়শই ভাবছি (কারণ আমি সব সময় দেখি)।
পল ড্রাগার

1
আপনি নিজের সংক্ষিপ্ত স্কিমা দ্বারা কোনও অর্ডার মিস করেছেন? আমি সম্প্রতি একটি সমস্যার মুখোমুখি হয়েছি যেখানে একটি অন্তঃসত্ত্বা বাম আউটয়ার জোনে পরিবর্তিত হয়ে ক্যোরিটি 3 মিনিট থেকে 10 সেকেন্ড পর্যন্ত গতিবেগ করেছে। আপনার প্রশ্নের মধ্যে যদি সত্যই অর্ডার বাই থাকে তবে আমি উত্তর হিসাবে আরও ব্যাখ্যা করব। দেখে মনে হচ্ছিল যে সমস্ত উত্তরগুলি সত্যই আমার মুখোমুখি হওয়া মামলার ব্যাখ্যা দেয় নি।
ফুয়াহ ইয়ে কিট

উত্তর:


403

LEFT JOINএকেবারে দ্রুতগতির চেয়ে দ্রুত নয় INNER JOIN। আসলে, এটি ধীর; সংজ্ঞা দ্বারা, একটি বাহ্যিক যোগদান (LEFT JOIN বা RIGHT JOIN) এর সমস্ত কাজ করতে হয়INNER JOIN ফলাফলের সমস্ত কাজটি বাতিল করতে হবে ফলাফলগুলি নাল-প্রসারিত করার জন্য। এটি আরও বেশি সারি ফেরত প্রত্যাশা করবে, ফলাফল নির্ধারিত আকারের বৃহত আকারের কারণে আরও কার্যকরকরণের সময় আরও বাড়িয়ে তুলবে।

(এবং যদি কোনও নির্দিষ্ট ক্ষেত্রে আরও দ্রুত LEFT JOIN ছিল তবেও পরিস্থিতিতে কিছু কঠিন টু কল্পনা কারণের জনতা, তাই না বৈশিষ্ট্যগুলি একটি সমতূল্য কারণে INNER JOIN, তাই আপনি কেবল অপরের সাথে এক সমস্ত উদাহরণ প্রতিস্থাপন যেতে পারে না!)

সম্ভবত আপনার পারফরম্যান্সের সমস্যাগুলি অন্য কোথাও রয়েছে যেমন প্রার্থীর চাবি বা বিদেশী কী সঠিকভাবে সূচকযুক্ত না হওয়া। 9 টি টেবিল যোগ দেওয়ার জন্য যথেষ্ট তাই মন্দা আক্ষরিক অর্থে প্রায় কোথাও হতে পারে। আপনি যদি আপনার স্কিমা পোস্ট করেন তবে আমরা আরও বিশদ সরবরাহ করতে সক্ষম হতে পারি।


সম্পাদনা:

এ সম্পর্কে আরও প্রতিবিম্বিত করে, আমি এমন একটি পরিস্থিতিতে ভাবতে পারি যার অধীনে LEFT JOINকোনওর চেয়ে দ্রুততর হতে পারে INNER JOINএবং তা যখন:

  • কিছু টেবিল খুব ছোট (10 সারি নীচে বলে);
  • টেবিলগুলিতে ক্যোয়ারীটি কভার করার জন্য পর্যাপ্ত সূচী নেই।

এই উদাহরণ বিবেচনা করুন:

CREATE TABLE #Test1
(
    ID int NOT NULL PRIMARY KEY,
    Name varchar(50) NOT NULL
)
INSERT #Test1 (ID, Name) VALUES (1, 'One')
INSERT #Test1 (ID, Name) VALUES (2, 'Two')
INSERT #Test1 (ID, Name) VALUES (3, 'Three')
INSERT #Test1 (ID, Name) VALUES (4, 'Four')
INSERT #Test1 (ID, Name) VALUES (5, 'Five')

CREATE TABLE #Test2
(
    ID int NOT NULL PRIMARY KEY,
    Name varchar(50) NOT NULL
)
INSERT #Test2 (ID, Name) VALUES (1, 'One')
INSERT #Test2 (ID, Name) VALUES (2, 'Two')
INSERT #Test2 (ID, Name) VALUES (3, 'Three')
INSERT #Test2 (ID, Name) VALUES (4, 'Four')
INSERT #Test2 (ID, Name) VALUES (5, 'Five')

SELECT *
FROM #Test1 t1
INNER JOIN #Test2 t2
ON t2.Name = t1.Name

SELECT *
FROM #Test1 t1
LEFT JOIN #Test2 t2
ON t2.Name = t1.Name

DROP TABLE #Test1
DROP TABLE #Test2

আপনি যদি এটি চালান এবং এক্সিকিউশন প্ল্যানটি দেখতে পান তবে আপনি দেখতে পাবেন যে INNER JOINক্যোয়ারির জন্য সত্যই বেশি দাম LEFT JOINপড়েছে, কারণ এটি উপরের দুটি মানদণ্ডকে সন্তুষ্ট করে। এটি কারণ এসকিউএল সার্ভার এর জন্য একটি হ্যাশ ম্যাচ করতে চায় INNER JOINতবে এর জন্য নেস্ট লুপ করে না LEFT JOIN; পূর্ববর্তীটি সাধারণত খুব দ্রুত, তবে যেহেতু সারিগুলির সংখ্যা এত ছোট এবং ব্যবহারের জন্য কোনও সূচক নেই, তাই হ্যাশিং অপারেশনটি ক্যোয়ারীর সবচেয়ে ব্যয়বহুল অংশ হিসাবে প্রমাণিত।

5 টি উপাদান সহ বনাম একটি হ্যাশ টেবিলের সাথে তালিকায় প্রচুর সংখ্যক লুকআপ করতে আপনার পছন্দসই প্রোগ্রামিং ভাষায় একটি প্রোগ্রাম লিখে আপনি একই প্রভাব দেখতে পারেন। আকারের কারণে হ্যাশ টেবিল সংস্করণটি আসলে ধীর। তবে এটি 50 টি উপাদান বা 5000 টি উপাদানগুলিতে বাড়ান এবং তালিকার সংস্করণটি ক্রলের দিকে ধীর হয়ে যায় কারণ হ্যাশটেবলের জন্য এটি ও (এন) বনাম ও (1)।

তবে এই ক্যোয়ারির IDপরিবর্তে কলামে থাকার জন্য পরিবর্তন করুন Nameএবং আপনি একটি খুব আলাদা গল্প দেখতে পাবেন। সেক্ষেত্রে এটি উভয় প্রশ্নের জন্য নেস্টেড লুপ করে, তবে INNER JOINসংস্করণটি ক্লাস্টারড ইনডেক্স স্ক্যানগুলির একটি সন্ধানের সাথে প্রতিস্থাপন করতে সক্ষম - যার অর্থ এটি আক্ষরিক অর্থে একটি বৃহত সংখ্যক সারি সহ দ্রুততর আকারের ক্রম হবে ।

সুতরাং উপসংহারটি কমবেশি আমি উপরে কয়েকটি অনুচ্ছেদের উল্লেখ করেছি; এটি সম্ভবত একটি সূচক বা সূচক কভারেজ সমস্যা, সম্ভবত এক বা একাধিক খুব ছোট টেবিলের সাথে মিলিত। সেগুলিই একমাত্র পরিস্থিতিতে যার অধীনে এসকিউএল সার্ভার কখনও কখনও এর চেয়ে খারাপ বাস্তবায়ন পরিকল্পনা বেছে নিতে পারেINNER JOINLEFT JOIN


4
আরও একটি দৃশ্যাবলী রয়েছে যা একটি অন্তর্ভুক্ত যোগদানের চেয়ে আরও ভাল পারফরম্যান্সের জন্য আউটর জিনকে নিয়ে যেতে পারে। আমার উত্তর নীচে দেখুন।
dbenham

12
আমি এটি উল্লেখ করতে চাই যে মূলত অভ্যন্তরীণ যোগদান এবং বহিরাগতভাবে পারফরম্যান্সে আলাদাভাবে যোগদানের এই ধারণাকে সমর্থন করার জন্য কোনও ডাটাবেস ডকুমেন্টেশন নেই। অভ্যন্তরীণ যোগদানের তুলনায় বাইরের যোগদানগুলি কিছুটা ব্যয়বহুল, কারণ ডেটার পরিমাণ এবং ফলাফলের আকারের পরিমাণ। যাইহোক, অন্তর্নিহিত অ্যালগরিদমগুলি ( এমএসডিএন.মাইক্রোসফট.ফেন / লিবারিয়ান / ms191426 ( v=sql.105 ) .aspx ) উভয় ধরণের যোগদানের জন্য একই। যখন তারা একই পরিমাণে ডেটা ফেরত দেয় তখন পারফরম্যান্স একই হওয়া উচিত।
গর্ডন লিনফ

3
অ্যারোনট । । এই উত্তরটি একটি মন্তব্যে উল্লেখ করা হয়েছিল যা "বাইরের সাথে যোগদান করে" অন্তর্ভুক্ত হওয়ার চেয়ে উল্লেখযোগ্যভাবে খারাপ সম্পাদন করে "এই প্রসঙ্গে কিছু বলেছিল। এই ভুল ব্যাখ্যাটি যাতে ছড়িয়ে পড়ে না তা নিশ্চিত হয়ে আমি মন্তব্য করেছিলাম।
গর্ডন লিনফ

16
আমি মনে করি এই উত্তরটি একটি গুরুত্বপূর্ণ দিক থেকে বিভ্রান্তিকর: কারণ এটিতে "একটি বাম জয়েন্ট একটি অভ্যন্তরীণ যোগদানের চেয়ে একেবারে দ্রুত নয়" বলে উল্লেখ করা হয়েছে। এই লাইনটি সঠিক নয়। এটি তাত্ত্বিকভাবে কোনও অন্তর্ভুক্ত যোগদানের চেয়ে দ্রুত নয়। এটি "একেবারে দ্রুত নয় "। প্রশ্নটি বিশেষত পারফরম্যান্সের প্রশ্ন। অনুশীলনে আমি এখন কয়েকটি সিস্টেম দেখেছি (খুব বড় সংস্থাগুলি দ্বারা!) যেখানে আন্ডার জিনের তুলনায় ইনার জিন হাস্যকরভাবে ধীর ছিল। তত্ত্ব এবং অনুশীলন খুব আলাদা জিনিস।
ডেভিড ফ্রেঙ্কেল

5
@ ডেভিড ফ্রেঙ্কেল: এটি অত্যন্ত সম্ভাবনা নয়। মৃত্যুদণ্ড কার্যকর করার পরিকল্পনার সাথে আমি এ / বি তুলনা দেখতে বলব, যদি আপনি বিশ্বাস করেন যে এই ধরনের বৈষম্য সম্ভব। সম্ভবত এটি ক্যাশেড ক্যোয়ারী / সম্পাদন পরিকল্পনা বা খারাপ পরিসংখ্যানের সাথে সম্পর্কিত।
অ্যারোনআউট

127

একটি গুরুত্বপূর্ণ দৃশ্য রয়েছে যা একটি বাহ্যিক যোগদানকে অভ্যন্তরীণ যোগদানের চেয়ে দ্রুত হতে পারে যা এখনও আলোচিত হয়নি।

একটি বাহ্যিক যোগদান ব্যবহার করার সময়, অপ্টিমাইজারটি সর্বদা এক্সিকিউশন প্ল্যান থেকে বহিরাগত যুক্ত টেবিলটি বাদ দিতে মুক্ত হয় যদি যোগদানের কলামগুলি বাইরের টেবিলের পিকে হয় এবং বাহ্যিক টেবিল কলামগুলির কোনওটিই বাহ্যিক যোগদানের বাইরে উল্লেখ করা হয় না। উদাহরণস্বরূপ SELECT A.* FROM A LEFT OUTER JOIN B ON A.KEY=B.KEYএবং বি কেইওয়াই হ'ল বি। এর পিকে, উভয় ওরাকল (আমি বিশ্বাস করি যে আমি মুক্তি 10 ব্যবহার করছিলাম) এবং এসকিএল সার্ভার (আমি 2008 আর 2 ব্যবহার করেছি) এক্সিকিউশন প্ল্যান থেকে ছাঁটাই সারণী বি।

অভ্যন্তরীণ যোগদানের ক্ষেত্রে এটি একইভাবে সত্য নয়: SELECT A.* FROM A INNER JOIN B ON A.KEY=B.KEYকী সীমাবদ্ধতা রয়েছে তার উপর নির্ভর করে সম্পাদন পরিকল্পনায় খ প্রয়োজন হতে পারে বা নাও পারে।

যদি এ.কে.ই.ই. বি.ই.ই.ই.ই. উল্লেখযোগ্য একটি বিদেশী কী উল্লেখ করে, তবে অপ্টিমাইজারটি পরিকল্পনা থেকে বি-কে ছাড়তে পারে না কারণ এটি অবশ্যই নিশ্চিত করতে হবে যে প্রতিটি এ-সারির জন্য একটি বি সারি রয়েছে।

যদি এ.কে.ই.ই.ওয়াই.একটি বাধ্যতামূলক বিদেশী কী, যা বি.কে.ই.ই. রেফারেন্সিং করে থাকে, তবে অপটিমাইজারটি বি থেকে পরিকল্পনা বাদ দিতে পারে কারণ সীমাবদ্ধতাগুলি সারিটির অস্তিত্বের নিশ্চয়তা দেয়। তবে কেবলমাত্র অপ্টিমাইজার পরিকল্পনা থেকে টেবিলটি ফেলে দিতে পারে, তার মানে এই নয়। এসকিউএল সার্ভার ২০০৮ আর 2 পরিকল্পনা থেকে বি বাদ দেয় না। ওরাকল 10 পরিকল্পনা থেকে বি ড্রপ করে। এক্ষেত্রে এসকিউএল সার্ভারের অভ্যন্তরীণ যোগদানটি কীভাবে বাহ্যিক সংযুক্তি সম্পাদন করবে তা দেখতে সহজ।

এটি একটি তুচ্ছ উদাহরণ এবং একা একা থাকা প্রশ্নের জন্য ব্যবহারিক নয়। আপনার প্রয়োজন না হলে কেন একটি টেবিলে যোগদান করবেন?

ভিউগুলি ডিজাইন করার সময় এটি একটি খুব গুরুত্বপূর্ণ নকশা বিবেচনা হতে পারে। প্রায়শই একটি "করণীয়" দৃশ্যটি তৈরি করা হয় যা ব্যবহারকারীর কেন্দ্রীয় টেবিলের সাথে সম্পর্কিত সমস্ত কিছুর সাথে মিলিত হয়। (বিশেষত যদি নিখুঁত ব্যবহারকারীগণ অ্যাড-হক অনুসন্ধানগুলি করে যা সম্পর্কিত সম্পর্কিত মডেলটি বুঝতে পারে না) ভিউটিতে অনেক টেবিলের সমস্ত সম্পর্কিত কলামগুলি অন্তর্ভুক্ত থাকতে পারে। তবে শেষ ব্যবহারকারীরা কেবলমাত্র দেখার মধ্যে থাকা সারণীর একটি উপসেট থেকে কলামগুলি অ্যাক্সেস করতে পারেন। যদি টেবিলগুলি বাইরের সাথে যোগ দেয়, তবে অপ্টিমাইজারটি পরিকল্পনা থেকে অ-প্রয়োজনীয় টেবিলগুলি ফেলে দিতে পারে (এবং করবে)।

এটি নিশ্চিত করা সমালোচনা করা উচিত যে বাইরের সাথে যোগদানের সাথে দেখাটি সঠিক ফলাফল দেয়। অ্যারোনআউট যেমন বলেছেন - আপনি অন্ধভাবে অন্তর্ভুক্ত হয়ে বাইরে যোগদান করতে পারবেন না এবং একই ফলাফল আশা করতে পারবেন না। তবে এমন অনেক সময় রয়েছে যখন দর্শনগুলি ব্যবহার করার সময় এটি কার্য সম্পাদনের কারণে কার্যকর হতে পারে।

একটি সর্বশেষ নোট - উপরের আলোকে আমি পারফরম্যান্সের প্রভাবটি পরীক্ষা করে দেখিনি, তবে তাত্ত্বিকভাবে মনে হচ্ছে আপনি যদি একটি শর্ত যোগ করেন তবে << বিদেশী_কিয়ায়> নন না যেখানে ক্লজ।


5
চূড়ান্ত গতিশীল কোয়েরিগুলি তৈরি করার সময় আমি আসলে এই সমস্যায় পড়েছিলাম। আমি একটি অন্তর্ভুক্ত যোগদান করে রেখেছিলাম যা আমি ব্যবহার করেছিলাম এবং যা থেকে ডেটা টানছিলাম না, এবং যখন আমি এটিকে একটি বাম জোনে স্যুইচ করি (শিয়ার কৌতূহলের বাইরে) আসলে কোয়েরিটি দ্রুত চলেছিল।
এরিক ফিলিপস

1
সম্পাদনা - কার্যকর করার পরিকল্পনা থেকে বহিরাগত যোগদানের টেবিলটি ফেলে দেওয়ার জন্য অপ্টিমাইজারের জন্য অবশ্যই বিদ্যমান শর্তাদি পরিষ্কার করে।
dbenham

2
আপনার উত্তরের একটি গৌণ স্পষ্টতা: বিদেশী কী কলামটি যখন অযোগ্য হয়, তখন অন্তর্ভুক্ত হয়ে যোগ করুন এবং বাম জয়েন্টগুলি শব্দার্থগতভাবে সমতুল্য হয়ে যায় (অর্থাত্ আপনার প্রস্তাবিত হ'ল ধারাটি অপ্রয়োজনীয়); পার্থক্য শুধুমাত্র বাস্তবায়ন পরিকল্পনা হবে।
ডগলাস

2
যদিও এটি একটি আপাতদৃষ্টিতে তুচ্ছ উদাহরণ দেখায়, এটি একটি অসাধারণ অন্তর্দৃষ্টিপূর্ণ উত্তর!
পলাগ

6
+1: আমি এখানে কয়েকটি খুব বড় টেবিলের সাথে অভ্যন্তরীণ যোগদানগুলিতে ব্যবহার করছি এমন কয়েকটি ক্যোয়ারিতে এটি চালিয়ে গেছে বলে মনে হচ্ছে। অভ্যন্তরীণ যোগদানটি ক্যোয়ারী পরিকল্পনায় টেম্পিডবিতে ছড়িয়ে পড়ছিল (আমি উপরে বর্ণিত কারণটি ধরে নিয়েছি - এবং আমার সার্ভারটিতে র্যামের অভাব রয়েছে যা মেমরির সব কিছু ধরে রাখে)। বাম জোনে স্যুইচ করার ফলে স্পিলটি টেম্পডিবির কাছে চলে যায়, ফলে আমার 20-30 সেকেন্ডের কিছু প্রশ্নের এখন একটি সেকেন্ডের ভগ্নাংশে চলে। এটি বেশ গুরুত্বপূর্ণ একটি লক্ষ্য যা দেখতে বেশিরভাগ লোকেরা কম্বলকে ধরে নিয়েছে যে অভ্যন্তরীণ সাথে যোগ দেয় দ্রুত হয়।
ফসপ্লেট

23

যদি সবকিছু যেমনটি করা উচিত ঠিক তেমন কাজ করে তবে আমরা সবাই জানি যে সবকিছু যেমন করা উচিত তেমন কাজ করে না বিশেষত যখন ক্যোরি অপটিমাইজার, ক্যোয়ারী প্ল্যান ক্যাচিং এবং পরিসংখ্যানের ক্ষেত্রে আসে।

প্রথমে আমি সূচি এবং পরিসংখ্যানগুলি পুনর্নির্মাণের পরামর্শ দেব, তারপরে ক্যোয়ারী প্ল্যান ক্যাশে সাফ করে দিচ্ছি তা নিশ্চিত করার জন্য এটি জিনিসগুলি স্ক্রু করছে না। যাইহোক আমি এটির পরেও সমস্যার সম্মুখীন হয়েছি।

আমি এমন কিছু ক্ষেত্রে অভিজ্ঞতা পেয়েছি যেখানে একটি বাম যোগদানটি অভ্যন্তরীণ যোগদানের চেয়ে দ্রুততর হয়।

অন্তর্নিহিত কারণটি হ'ল: যদি আপনার কাছে দুটি টেবিল থাকে এবং আপনি একটি কলামে একটি সূচক (উভয় টেবিলের সাথে) দিয়ে যোগদান করেন। আপনি যদি টেবিল একের সূচকে প্রবেশের তালিকাটি লুপ করেন এবং টেবিল দুটিতে সূচকের সাথে মিলে যান তবে অভ্যন্তরীণ যোগটি একই ফলাফল উত্থাপন করবে তবে টেবিল দুটিতে সূচীতে লুপ ওভার প্রবেশ করুন এবং সূচির সাথে মিল থাকবে টেবিল এক। সমস্যাটি যখন আপনার বিভ্রান্তিকর পরিসংখ্যান থাকে, ক্যোরি অপ্টিমাইজার সূচকগুলির পরিসংখ্যানগুলি কমপক্ষে মিলে যাওয়া এন্ট্রিগুলির (আপনার অন্যান্য মানদণ্ডের ভিত্তিতে) সারণী সন্ধান করতে ব্যবহার করবে। আপনার যদি প্রতিটিতে 1 মিলিয়ন দিয়ে দুটি টেবিল থাকে, টেবিলের একটিতে আপনার 10 টি সারি মিলবে এবং টেবিলের দুটিতে আপনার 100000 সারি মিলবে। সর্বোত্তম উপায় হ'ল টেবিল একের উপর একটি সূচক স্ক্যান করা এবং টেবিল টুতে 10 বার মিলানো। বিপরীতটি হবে এমন একটি সূচক স্ক্যান যা 100000 টিরও বেশি সারি লুপ করে এবং 100000 বারের সাথে মিলের চেষ্টা করে এবং কেবল 10 টি সফল হয়। সুতরাং যদি পরিসংখ্যান সঠিক না হয় তবে অপ্টিমাইজারটি ভুল সারণী এবং সূচকটি লুপ করতে বেছে নিতে পারে।

অপ্টিমাইজারটি যদি লেখা থাকে যাতে বাম জোড়টিকে অনুকূল করতে পছন্দ করে তবে এটি অভ্যন্তরীণ যোগদানের চেয়ে আরও ভাল সম্পাদন করবে।

তবে, অপ্টিমাইজারটি বাম আধে যোগদান হিসাবে উপ-অনুকূলভাবে একটি বাম জোড়াকেও অনুকূলিত করতে পারে। এটি আপনি যেটিকে চান তা চয়ন করতে আপনি ফোর্স অর্ডার ইঙ্গিতটি ব্যবহার করতে পারেন।


18

শেষে উভয় প্রশ্নের (অভ্যন্তরীণ এবং বাম যোগদানের সাথে এক) চেষ্টা OPTION (FORCE ORDER)করে ফলাফল পোস্ট করুন। OPTION (FORCE ORDER)হ'ল একটি ক্যোয়ারী ইঙ্গিত যা আপনার ক্যোয়ারীতে সরবরাহিত যোগদানের ক্রম সহ কার্যকরকরণ পরিকল্পনা তৈরি করতে অপ্টিমাইজারকে বাধ্য করে।

যদি INNER JOINহিসাবে দ্রুত সঞ্চালন শুরু করে LEFT JOIN, এটি কারণ:

  • সম্পূর্ণরূপে INNER JOINs দ্বারা রচিত একটি ক্যোয়ারিতে , যোগদানের আদেশের কোনও বিষয় নেই। এটি ক্যোয়ারী অপ্টিমাইজারটিকে উপযুক্ত দেখা হিসাবে যোগদানের আদেশ দেওয়ার স্বাধীনতা দেয়, সুতরাং সমস্যাটি অপ্টিমাইজারের উপর নির্ভর করতে পারে।
  • এর সাথে LEFT JOIN, এটি কেস নয় কারণ যোগদানের ক্রম পরিবর্তন করা কোয়েরির ফলাফলকে বদলে দেবে। এর অর্থ ইঞ্জিনটি অবশ্যই আপনার ক্যোয়ারীতে প্রদত্ত যোগদানের ক্রমটি মেনে চলবে, এটি অপটিমাইজডের চেয়ে ভাল হতে পারে।

জানেন না এটি আপনার প্রশ্নের উত্তর দেয় কিনা তবে আমি একবার এমন একটি প্রকল্পে ছিলাম যেখানে অত্যন্ত জটিল প্রশ্নগুলি গণনা করার বৈশিষ্ট্যযুক্ত, যা সম্পূর্ণরূপে অপ্টিমাইজারকে গোলমাল করে। আমাদের এমন কেস রয়েছে যেখানে কোনও FORCE ORDERপ্রশ্নের উত্সের সময়টি 5 মিনিট থেকে 10 সেকেন্ডে হ্রাস করে।


9

বাম বাহ্যিক এবং অভ্যন্তরীণ যোগদানের মধ্যে বেশ কয়েকটি তুলনা করেছেন এবং একটি সামঞ্জস্যপূর্ণ পার্থক্য খুঁজে পেতে সক্ষম হন নি। অনেকগুলি ভেরিয়েবল রয়েছে। বিপুল সংখ্যক ক্ষেত্র সহ অনেকগুলি টেবিল সহ একটি রিপোর্টিং ডাটাবেসে কাজ করছি, সময়ের সাথে সাথে অনেকগুলি পরিবর্তন (বিক্রেতার সংস্করণ এবং স্থানীয় কর্মপ্রবাহ)। এ জাতীয় বিভিন্ন ধরণের প্রশ্নের প্রয়োজন মেটাতে এবং historicalতিহাসিক ডেটা পরিচালনা করতে কভারিং ইনডেক্সের সমস্ত সংমিশ্রণ তৈরি করা সম্ভব নয়। অভ্যন্তরীণ কোয়েরিগুলি সার্ভারের কার্য সম্পাদনকে দেখেছে কারণ দুটি বৃহত (মিলিয়ন থেকে দশ লক্ষ লক্ষ সারণী) সারণী অভ্যন্তরীণভাবে উভয়ই প্রচুর পরিমাণে ক্ষেত্র টানছে এবং কোনও আচ্ছাদন সূচক বিদ্যমান নেই।

যদিও সবচেয়ে বড় বিষয়টি উপরের আলোচনায় উপস্থিত হবে বলে মনে হচ্ছে না। ভাল আপনার ডেটাবেস ট্রিগার এবং ভাল ডিজাইন লেনদেন প্রসেসিং সঙ্গে ভাল ডেটা নিশ্চিত করতে ভাল ডিজাইন করা হয়েছে। আমার ঘন ঘন নুল মান থাকে যেখানে এগুলি প্রত্যাশিত হয় না। হ্যাঁ টেবিলের সংজ্ঞাগুলি নো-নুলস প্রয়োগ করতে পারে তবে এটি আমার পরিবেশে কোনও বিকল্প নয়।

সুতরাং প্রশ্নটি ... আপনি কি আপনার ক্যোয়ারিকে কেবল গতির জন্য ডিজাইন করেন, লেনদেন প্রক্রিয়াজাতকরণের জন্য একটি উচ্চ অগ্রাধিকার যা একই কোডটি কয়েক মিনিটে কয়েক হাজার বার চালায়? বা আপনি যে নির্ভুলতার জন্য যান যা কোনও বাম বাহ্যিক জোড় সরবরাহ করবে। মনে রাখবেন যে অভ্যন্তরীণ যোগদানগুলি অবশ্যই উভয় পক্ষের ম্যাচগুলি সন্ধান করতে পারে, সুতরাং একটি অপ্রত্যাশিত NUL কেবল দুটি টেবিল থেকে ডেটা সরিয়ে ফেলবে না তবে সম্ভবত সমস্ত তথ্য সারি। এবং এটি এত সুন্দরভাবে ঘটেছিল, কোনও ত্রুটি বার্তা নেই।

90% প্রয়োজনীয় ডেটা পেয়ে আপনি খুব দ্রুত হতে পারেন এবং অভ্যন্তরীণ যোগদানগুলিতে সন্ধান না করে নীরবে তথ্য সরিয়ে ফেলেছে। কখনও কখনও অভ্যন্তরীণ যোগদান দ্রুততর হতে পারে, তবে আমি বাস্তবায়নের পরিকল্পনার পর্যালোচনা না করলে কেউ বিশ্বাস করে না যে এই ধারণাটি তৈরি করছে। গতি গুরুত্বপূর্ণ, তবে যথার্থতা আরও গুরুত্বপূর্ণ।


8

আপনার সম্পাদনার সমস্যাগুলি সম্ভবত আপনি যে সংখ্যক যোগ দিচ্ছেন এবং যে কলামগুলিতে আপনি যোগ দিচ্ছেন তাতে সূচি রয়েছে কিনা তা সম্ভবত বেশি।

সবচেয়ে খারাপ ক্ষেত্রে আপনি প্রতিটি যোগদানের জন্য খুব সহজেই 9 টি পুরো টেবিল স্ক্যান করতে পারেন।


7

বহির্মুখী যোগ দর্শনগুলিতে ব্যবহার করার সময় উচ্চতর পারফরম্যান্স সরবরাহ করতে পারে।

বলুন আপনার কাছে এমন একটি ক্যোয়ারী রয়েছে যাতে একটি ভিউ জড়িত থাকে এবং সেই ভিউটিতে 10 টি টেবিল একসাথে যোগদান করে। আপনার জিজ্ঞাসাটি কেবল 10 টি টেবিলের মধ্যে 3 টি থেকে কলামগুলি ব্যবহার করতে ঘটে বলে বলুন।

যদি এই 10 টি টেবিলগুলি একসাথে অভ্যন্তরীণভাবে যুক্ত হয়ে থাকে, তবে আপনার প্রশ্নের সারণিতে 10 টির মধ্যে 7 টির প্রয়োজন নেই সত্ত্বেও কোয়েরি অপ্টিমাইজারটিকে সেগুলিতে সমস্তটিতে যুক্ত হতে হবে। এর কারণ হল যে অভ্যন্তরীণ অংশগুলি নিজেরাই ডেটা ফিল্টার করে তাদের গণনা করার জন্য প্রয়োজনীয় করে তোলে।

যদি সেই 10 টি টেবিলগুলি এর পরিবর্তে একসাথে বাইরের সাথে যুক্ত হয়ে থাকে, তবে ক্যোয়ারী অপ্টিমাইজারটি কেবলমাত্র প্রয়োজনীয়গুলির সাথে যুক্ত হবে: এই ক্ষেত্রে 10 টির মধ্যে 3 টি। এটি কারণ যেহেতু নিজেরাই যোগ দেয় তারা আর ডেটা ফিল্টার করে না এবং এইভাবে অব্যবহৃত যোগদানগুলিকে এড়িয়ে যেতে পারে।

সূত্র: http://www.sqlservercentral.com/blogs/sql_coach/2010/07/29/poor-little-misusedised-views/


1
"বাইরের যোগদান" সম্পর্কে আপনার বিবৃতি বিভ্রান্তিমূলক এবং সম্ভাব্য ভুল incor আউটারের অর্থ অন্য পক্ষের ডেটার অস্তিত্বের প্রয়োজন নেই - এবং যদি এটি NULL এর বিকল্প না করে। নির্দিষ্ট পরিস্থিতিতে আরডিবিএমএস এগুলি "এড়িয়ে যেতে" পারে (উপরের উত্তরটি ডবেনহ্যাম থেকে দেখুন)। যাইহোক - বাইরের বনাম অভ্যন্তরীণ আপনার ক্যোয়ারীটিকে মূলত পৃথক পৃথক ফলাফল ফিরিয়ে আনতে পারে। অন্তর্নিহিত অর্থ - ফলাফল দিন যার জন্য কোনও আইটেম দু'এ এবং বিতে রয়েছে বাম আউটারের অর্থ সমস্ত এ, এবং allyচ্ছিকভাবে বি এর উপস্থিতি থাকলে। প্রথম কেস - আপনি কিছু সারি পান, দ্বিতীয়টিতে আপনি সমস্ত সারি পান।
রিপভ্লান

1
@ripvlan অবশ্যই, বাহ্যিক এবং অভ্যন্তরীণ যোগদানগুলি সর্বদা বিনিময়যোগ্য হয় না। মূল প্রশ্নটি ছিল পারফরম্যান্স সম্পর্কে, যার দ্বারা বোঝা যায় যে আমরা এমন কেসগুলির বিষয়ে কথা বলছি যাঁরা উভয় ক্ষেত্রে যোগ দিন একই ফলাফল সেটটি ফিরে আসবে।
মারেডচিজ

1
হ্যাঁ এবং - আউটর একটি পারফরম্যান্স সমস্যার কারণ হতে পারে কারণ এটি সমস্ত সারি (আরও ডেটা) ফিরিয়ে দেবে। আপনার অনুমান যে প্রশ্নগুলির ফলাফলগুলি একই আউটপুটটিতে আসে তা ন্যায্য - তবে এটি সাধারণ ক্ষেত্রে সত্য নয় এবং প্রতিটি ডিবি ডিজাইনের সাথে সুনির্দিষ্ট। এবং যাঁরা 100% আপেক্ষিক বীজগণিতের সাথে পরিচিত না তাদের জন্য তারা শোক করতে পারে। আমার বক্তব্যটি এই পরামর্শটি অনুসন্ধান করা লোকদের আরও অন্তর্দৃষ্টি দেওয়ার জন্য এবং একটি বাম / রাইট যাদুতে কোনও সমস্যার সমাধান করতে পারে না এবং আরও সমস্যার কারণ হতে পারে। এটি 300 :-) স্তরের জন্য একটি শক্তি রেখে গেছে
রিপভ্লান

2

বামে যোগ দেওয়ার চেয়ে অভ্যন্তরীণ যোগ দেয় কিনা তা পরীক্ষা করে আমি এসকিউএল সার্ভারে আকর্ষণীয় কিছু পেয়েছি।

আপনি যদি বাম যোগদানের টেবিলের আইটেমগুলি অন্তর্ভুক্ত না করেন, বাছাই বিবৃতিতে, বাম জয়েন্টটি অভ্যন্তরীণ যোগদানের সাথে একই ক্যোয়ারির চেয়ে দ্রুত হবে।

আপনি যদি নির্বাচনের বিবৃতিতে বাম যোগদানযুক্ত টেবিলটি অন্তর্ভুক্ত করেন তবে একই ক্যোয়ারির সাথে অভ্যন্তরীণ যোগটি বাম জোড়ার তুলনায় সমান বা দ্রুত ছিল।


0

আমার তুলনা থেকে, আমি দেখতে পাচ্ছি যে তাদের ঠিক একই বাস্তবায়ন পরিকল্পনা রয়েছে। তিনটি পরিস্থিতি রয়েছে:

  1. যদি এবং যখন তারা একই ফলাফল ফিরে আসে, তাদের একই গতি থাকে। তবে, আমাদের অবশ্যই মনে রাখতে হবে যে সেগুলি একই প্রশ্ন নয় এবং বাম জনগণ সম্ভবত আরও ফলাফল প্রদান করবে (যখন কিছু শর্ত পূরণ না করা হয়) --- এ কারণেই এটি সাধারণত ধীর হয়।

  2. যখন প্রধান টেবিলটি (এক্সিকিউশন পরিকল্পনায় প্রথম নন-কনস্ট্যান্ড এক) একটি সীমাবদ্ধ শর্ত থাকে (যেখানে আইডি =?) এবং সংশ্লিষ্ট অন শর্তটি নূন্যমূল্যে থাকে, তখন "ডান" টেবিলটি যুক্ত হয় না --- এটি তখন হয় বাম জয়েন্ট দ্রুত।

  3. পয়েন্ট ১-এ আলোচিত হিসাবে, সাধারণত অন্তর্ভুক্ত হওয়া বেশি নিয়ন্ত্রক এবং কম ফলাফল দেয় এবং তাই দ্রুত।

উভয়ই (একই) সূচকগুলি ব্যবহার করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.