রানটাইম-এ ক্লোজ-ক্লজটিতে কি কোনও যোগদানের উপযুক্ততা রয়েছে?


14

যখন আমি এই জাতীয় একটি কোয়েরি লিখি ...

select *
from table1 t1
join table2 t2
on t1.id = t2.id

এসকিউএল অপ্টিমাইজার, এটি সঠিক শব্দ কিনা তা নিশ্চিত নয়, এটি অনুবাদ করুন ...

select *
from table1 t1, table2 t2
where t1.id = t2.id

মূলত, এসকিউএল সার্ভারে যোগদানের বিবৃতিটি কি এসকিউএল লেখার সহজ উপায়? নাকি এটি আসলে রান-টাইমে ব্যবহৃত হয়?

সম্পাদনা করুন: আমি প্রায় সর্বদা, এবং প্রায় সর্বদা থাকব, যোগ সিনট্যাক্সটি ব্যবহার করব। আমি কি কৌতুহল করছি কি হয়।


1
আপনি "প্রায়" বিস্তারিত ব্যাখ্যা করতে পারেন? আপনি কখন পুরানো স্টাইলের সিনট্যাক্স ব্যবহার করবেন এবং কেন?
অ্যারন বারট্রান্ড

2
একটি প্রান্তের ক্ষেত্রে এটির কোনও পার্থক্য রয়েছে যদি আপনি এর মধ্যে একটি (অবনমিত) যুক্ত GROUP BY ALLকরেন
মার্টিন স্মিথ

@ মার্টিনস্মিথ কেউ GROUP BY ALLউদ্দেশ্য নিয়ে ব্যবহার করেন? :-)
অ্যারন বারট্র্যান্ড

@ অ্যারোনবার্ট্র্যান্ড - আমি সন্দেহ করছি! ভাববেন না যে আমি কখনও কাউকে এটি ব্যবহার করতে দেখেছি।
মার্টিন স্মিথ

উত্তর:


20

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

অ্যাডভেঞ্চার ওয়ার্কস ব্যবহার করে প্রমাণ রয়েছে যে এখানে নেই CROSS JOINএবং filterচলছে।


সুস্পষ্ট যোগদান:

এখানে চিত্র বর্ণনা লিখুন


অন্তর্ভুক্ত যোগদান:

এখানে চিত্র বর্ণনা লিখুন


দেখো মা! একই পরিকল্পনা, অভিন্ন ফলাফল, কোনও ক্রস যোগ দেয় না বা কোথাও দেখা যায় না।

(স্পষ্টতার জন্য, SELECTউভয় ক্ষেত্রে অপারেটরের উপর সতর্কতা হ'ল একটি কার্ডিনালিটি-প্রভাবিত করে এমন রূপান্তরিত রূপান্তর, উভয় ক্ষেত্রে যোগদানের সাথে কিছুই করার নয়))


20

কড়া কথায় বলতে গেলে, দুটি ফর্মের মধ্যে ক্যোয়ারী অপ্টিমাইজারের ইনপুটটিতে পার্থক্য রয়েছে:

-- Input tree (ISO-89)
SELECT
    p.Name,
    Total = SUM(inv.Quantity)
FROM 
    Production.Product AS p,
    Production.ProductInventory AS inv
WHERE
    inv.ProductID = p.ProductID
GROUP BY
    p.Name
OPTION (RECOMPILE, QUERYTRACEON 8605, QUERYTRACEON 3604);

আইএসও -৯৯ ইনপুট ট্রি

-- Input tree (ISO-92)
SELECT
    p.Name,
    Total = SUM(inv.Quantity)
FROM Production.Product AS p
JOIN Production.ProductInventory AS inv ON
    inv.ProductID = p.ProductID
GROUP BY
    p.Name
OPTION (RECOMPILE, QUERYTRACEON 8605, QUERYTRACEON 3604);

আইএসও -২২ ইনপুট ট্রি

আপনি দেখতে পাচ্ছেন, ONক্লজ প্রিকেটটি আধুনিক সিনট্যাক্স ব্যবহার করে জোড় করে দৃ .়ভাবে আবদ্ধ। পুরানো সিনট্যাক্সের সাথে, এখানে একটি লজিকাল ক্রস জোড় হয় যার পরে একটি সম্পর্কিত নির্বাচন (একটি সারি ফিল্টার) থাকে।

ক্যোয়ারী অপ্টিমাইজারটি প্রায়শই অপটিমাইজেশনের সময় যোগদানের ক্ষেত্রে সম্পর্কিত নির্বাচনকে ভেঙে দেয়, অর্থাত্ দুটি ফর্মটি সম্ভবত সমতুল্য ক্যোয়ারী প্ল্যানগুলি তৈরি করবে, তবে এর কোনও গ্যারান্টি নেই।


4

অভ্যন্তরীণ যোগদানের জন্য এগুলি বিনিময়যোগ্য, তবে বহিরাগত যোগদানের জন্য তাদের আলাদা অর্থ রয়েছে - ওএনটি মিলছে এবং যেখানে সরল ফিল্টারিং। সুতরাং এটিতে সঠিকভাবে যুক্ত জোড় সিনট্যাক্সের সাথে মিলে যাওয়া আরও ভাল।


4

ঠিক আছে, আমি কৌতূহলী ছিলাম তাই আমি একটি পরীক্ষা করেছি। আমি নিম্নলিখিতগুলির জন্য বাস্তব বাস্তবায়ন পরিকল্পনা পেয়েছি।

select * 
from sys.database_principals prin, sys.database_permissions perm
WHERE prin.principal_id = perm.grantee_principal_id

এবং

select * 
from sys.database_principals prin
JOIN sys.database_permissions perm
    ON prin.principal_id = perm.grantee_principal_id

আমি তাদেরকে বস্তুর দ্বারা বস্তুর সাথে তুলনা করেছি এবং তারা অভিন্ন ছিল। কমপক্ষে একটি খুব সাধারণ উদাহরণের জন্য, তারা একই জিনিস থেকে আসে। আমি পরিসংখ্যান IO এবং সময়ও পরীক্ষা করেছিলাম এবং তারা একই জিনিস হওয়ার জন্য যথেষ্ট কাছে ছিল।

বলা হচ্ছে, আপনার JOINসিনট্যাক্সটি ব্যবহার করা উচিত কারণ এটি পড়া সহজ এবং আপনার ভুল হওয়ার সম্ভাবনা কম, বিশেষত জটিল প্রশ্নগুলিতে। এবং যোগদানের জন্য *=/ =*সিনট্যাক্সটি OUTERএসকিউএল-সার্ভার ২০০৫ হিসাবে ইতিমধ্যে সরানো হয়েছে।

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