কেন অনুসন্ধানটি অপ্টিমাইজার দ্বারা নির্বাচিত হয় না
টিএল: ডিআর প্রসারিত গণিত কলাম সংজ্ঞাটি পুনরায় অর্ডার করার অপ্টিমাইজারের দক্ষতায় প্রথমদিকে যোগদান করে। ভিন্ন প্রারম্ভিক পয়েন্টের সাথে, ব্যয়-ভিত্তিক অপ্টিমাইজেশানটি অপ্টিমাইজারের মাধ্যমে একটি পৃথক পথ নেয়, এবং একটি পৃথক চূড়ান্ত পরিকল্পনা চয়ন করে শেষ হয়।
বিস্তারিত
খুব সহজ প্রশ্নগুলির ব্যতীত, অপ্টিমাইজার সম্ভাব্য পরিকল্পনার পুরো জায়গার মতো কিছু অন্বেষণ করার চেষ্টা করে না। পরিবর্তে, এটি একটি যুক্তিসঙ্গত-দর্শনীয় প্রারম্ভিক পয়েন্টটি ধরে রাখে , তারপরে যুক্তিসঙ্গত এবং শারীরিক প্রকরণগুলি অনুসন্ধানের এক বা একাধিক অনুসন্ধান পর্যায়ে ব্যয় করা পরিমাণ ব্যয় করে, যতক্ষণ না এটি যুক্তিসঙ্গত পরিকল্পনা না পায়।
দুটি ক্ষেত্রে আপনি বিভিন্ন পরিকল্পনা (বিভিন্ন চূড়ান্ত ব্যয়ের প্রাক্কলন সহ) পাওয়ার মূল কারণ হ'ল বিভিন্ন প্রারম্ভিক পয়েন্ট রয়েছে। অন্য কোনও জায়গা থেকে শুরু করে, অপ্টিমাইজেশানটি অন্য কোনও স্থানে শেষ হয় (এর সীমিত সংখ্যক অন্বেষণ এবং প্রয়োগের পুনরাবৃত্তির পরে)। আমি আশা করি এটি যুক্তিসঙ্গত স্বজ্ঞাত।
আমি যে শুরুর পয়েন্টটি উল্লেখ করেছি, তা কিছুটা ক্যোয়ারের পাঠ্য উপস্থাপনার উপর ভিত্তি করে, তবে কোয়েরি সংকলনের পার্সিং, বাইন্ডিং, নরমালাইজেশন এবং সরলকরণের পর্যায়ে যাওয়ার সাথে সাথে অভ্যন্তরীণ বৃক্ষের উপস্থাপনায় পরিবর্তনগুলি করা হয়।
গুরুত্বপূর্ণভাবে, সঠিক প্রারম্ভিক পয়েন্টটি অপ্টিমাইজার দ্বারা নির্বাচিত প্রাথমিক যোগদানের ক্রমের উপর নির্ভর করে । এই পছন্দটি পরিসংখ্যানগুলি লোড হওয়ার আগে এবং কোনও কার্ডিনালিটির অনুমানের আগে নেওয়া হয়েছিল। প্রতিটি টেবিলের মোট কার্ডিনালিটি (সারি সংখ্যা) তবে সিস্টেম মেটাটাটা থেকে প্রাপ্ত হয়ে জানা যায়।
প্রাথমিক যোগদানের ক্রমটি তাই হুরিস্টিকের উপর ভিত্তি করে । উদাহরণস্বরূপ, অপ্টিমাইজারটি গাছটি পুনরায় লেখার চেষ্টা করে যাতে বড় টেবিলগুলি বড় আকারের আগে যুক্ত হয় এবং অভ্যন্তরীণ সাথে যোগ দেয় বাইরের সাথে যোগদানের আগে (এবং ক্রস যোগ দেয়)।
গণিত কলামের উপস্থিতি এই প্রক্রিয়াটির সাথে হস্তক্ষেপ করে, বিশেষত অপ্টিমাইজারের ক্যোরি ট্রিটিতে বাইরের সাথে ধাক্কা দেওয়ার ক্ষমতা দিয়ে। এর কারণ হ'ল যোগদানের পুনরায় অর্ডারিংয়ের আগে গণিত কলামটি তার অন্তর্নিহিত অভিব্যক্তিতে প্রসারিত হয় এবং একটি জটিল এক্সপ্রেশনের অতীতের একটি জোড়কে সরানো একটি সাধারণ কলামের রেফারেন্সকে ছাড়িয়ে যাওয়ার চেয়ে অনেক বেশি কঠিন।
জড়িত গাছগুলি বেশ বড়, তবে উদাহরণস্বরূপ, অ-গণিত কলামের প্রাথমিক কোয়েরি ট্রিটি শুরু হয়: (শীর্ষে দুটি বাহ্যিক যোগদানের বিষয়টি নোট করুন)
LogOp_Select
লগঅপ_অ্যাপ্লি (x_jtLeftOuter)
লগঅপ_ লেফট আউটজার জয়ন
LogOp_NAryJoin
LogOp_LeftAntiSemiJoin
LogOp_NAryJoin
লগঅপ_গীত টিবিএল: dbo.table1 (ওরফে টিবিএল: a4)
LogOp_Select
লগঅপ_গীত টিবিএল: dbo.table6 (ওরফে টিবিএল: a3)
ScaOp_Comp x_cmpEq
ScaOp_Identifier QCOL: [a3] .col18
ScaOp_Const টিআই (বর্ণের কোলেট 53566, ভার, ট্রিম, এমএল = 16)
LogOp_Select
লগঅপ_গীত টিবিএল: dbo.table1 (ওরফে টিবিএল: এ 1)
ScaOp_Comp x_cmpEq
ScaOp_Identifier QCOL: [a1] .col2
ScaOp_Const টিআই (বর্ণের কোলেট 53566, ভার, ট্রিম, এমএল = 16)
LogOp_Select
লগঅপ_গীত টিবিএল: dbo.table5 (ওরফে টিবিএল: a2)
ScaOp_Comp x_cmpEq
ScaOp_Identifier QCOL: [a2] .col2
ScaOp_Const টিআই (বর্ণের কোলেট 53566, ভার, ট্রিম, এমএল = 16)
ScaOp_Comp x_cmpEq
ScaOp_Identifier QCOL: [a4] .col2
ScaOp_Identifier QCOL: [a3] .col19
LogOp_Select
লগঅপ_গীত টিবিএল: dbo.table7 (ওরফে টিবিএল: a7)
ScaOp_Comp x_cmpEq
ScaOp_Identifier QCOL: [a7] .col22
ScaOp_Const টিআই (বর্ণের কোলেট 53566, ভার, ট্রিম, এমএল = 16)
ScaOp_Comp x_cmpEq
ScaOp_Identifier QCOL: [a4] .col2
ScaOp_Identifier QCOL: [a7] .col23
LogOp_Select
লগঅপ_গীত টিবিএল: টেবিল 1 (ওরফে টিবিএল: সিডিসি)
ScaOp_Comp x_cmpEq
ScaOp_Identifier QCOL: [cdc] .col6
ScaOp_Const টিআই (ছোট্ট, এমএল = 2) এক্সভিএআর (ছোট্ট, মালিকানাধীন নয়, মান = 4)
লগঅপ_গীত টিবিএল: dbo.table5 (ওরফে টিবিএল: a5)
লগঅপ_গীত টিবিএল: টেবিল 2 (ওরফে টিবিএল: সিডিটি)
ScaOp_Logical x_lopAnd
ScaOp_Comp x_cmpEq
ScaOp_Identifier QCOL: [a5] .col2
ScaOp_Identifier QCOL: [cdc] .col2
ScaOp_Comp x_cmpEq
ScaOp_Identifier QCOL: [a4] .col2
ScaOp_Identifier QCOL: [cdc] .col2
ScaOp_Comp x_cmpEq
ScaOp_Identifier QCOL: [cdt] .col1
ScaOp_Identifier QCOL: [cdc] .col1
লগঅপ_গঠন টিবিএল: টেবিল 3 (ওরফে টিবিএল: এইচসিআর)
ScaOp_Comp x_cmpEq
ScaOp_Identifier QCOL: [ahcr] .col9
ScaOp_Identifier QCOL: [cdt] .col1
গণিত কলামের ক্যোয়ারির একই অংশটি হ'ল: (বহিরাগতের যোগটিকে অনেক নীচে, প্রসারিত গণিত কলাম সংজ্ঞা এবং কিছু অভ্যন্তরীণ) অর্ডার ক্রমে কিছু সূক্ষ্ম পার্থক্য নোট করুন)
LogOp_Select
লগঅপ_অ্যাপ্লি (x_jtLeftOuter)
LogOp_NAryJoin
LogOp_LeftAntiSemiJoin
LogOp_NAryJoin
লগঅপ_গীত টিবিএল: dbo.table1 (ওরফে টিবিএল: a4)
LogOp_Select
লগঅপ_গীত টিবিএল: dbo.table6 (ওরফে টিবিএল: a3)
ScaOp_Comp x_cmpEq
ScaOp_Identifier QCOL: [a3] .col18
ScaOp_Const টিআই (বর্ণের কোলেট 53566, ভার, ট্রিম, এমএল = 16)
LogOp_Select
লগঅপ_গীত টিবিএল: dbo.table1 (ওরফে টিবিএল: এ 1)
ScaOp_Comp x_cmpEq
ScaOp_Identifier QCOL: [a1] .col2
ScaOp_Const টিআই (বর্ণের কোলেট 53566, ভার, ট্রিম, এমএল = 16)
LogOp_Select
লগঅপ_গীত টিবিএল: dbo.table5 (ওরফে টিবিএল: a2)
ScaOp_Comp x_cmpEq
ScaOp_Identifier QCOL: [a2] .col2
ScaOp_Const টিআই (বর্ণের কোলেট 53566, ভার, ট্রিম, এমএল = 16)
ScaOp_Comp x_cmpEq
ScaOp_Identifier QCOL: [a4] .col2
ScaOp_Identifier QCOL: [a3] .col19
LogOp_Select
লগঅপ_গীত টিবিএল: dbo.table7 (ওরফে টিবিএল: a7)
ScaOp_Comp x_cmpEq
ScaOp_Identifier QCOL: [a7] .col22
ScaOp_Const টিআই (বর্ণের কোলেট 53566, ভার, ট্রিম, এমএল = 16)
ScaOp_Comp x_cmpEq
ScaOp_Identifier QCOL: [a4] .col2
ScaOp_Identifier QCOL: [a7] .col23
LogOp_Project
LogOp_LeftOuterJoin
LogOp_Join
LogOp_Select
লগঅপ_গীত টিবিএল: টেবিল 1 (ওরফে টিবিএল: সিডিসি)
ScaOp_Comp x_cmpEq
ScaOp_Identifier QCOL: [cdc] .col6
ScaOp_Const টিআই (ছোট্ট, এমএল = 2) এক্সভিএআর (ছোট্ট, মালিকানাধীন নয়, মান = 4)
লগঅপ_গীত টিবিএল: টেবিল 2 (ওরফে টিবিএল: সিডিটি)
ScaOp_Comp x_cmpEq
ScaOp_Identifier QCOL: [cdc] .col1
ScaOp_Identifier QCOL: [cdt] .col1
লগঅপ_গঠন টিবিএল: টেবিল 3 (ওরফে টিবিএল: এইচসিআর)
ScaOp_Comp x_cmpEq
ScaOp_Identifier QCOL: [ahcr] .col9
ScaOp_Identifier QCOL: [cdt] .col1
AncOp_PrjList
AncOp_PrjEl QCOL: [cdc] .col7
ScaOp_Convers চর সমষ্টি 53256, নাল, ছাঁটাই, এমএল = 6
ScaOp_IIF বার্চার কোলেট 53256, নাল, ভার, ট্রিম, এমএল = 6
ScaOp_Comp x_cmpEq
ScaOp_Intrinsic isnumeric
ScaOp_Intrinsic ঠিক আছে
ScaOp_Identifier QCOL: [cdc] .col4
ScaOp_Const TI (int, ML = 4) XVAR (int, মালিকানাধীন নয়, মান = 4)
ScaOp_Const TI (int, ML = 4) XVAR (int, মালিকানাধীন নয়, মান = 0)
ScaOp_Const টিআই (বারচার কোলিট 53256, বর্ণ, ছাঁটাই, এমএল = 1) এক্সভিএআর (বারচার, মালিকানাধীন, মান = লেন, ডেটা = (0,))
ScaOp_Intrinsic সাবস্ট্রিং
ScaOp_Const TI (int, ML = 4) XVAR (int, মালিকানাধীন নয়, মান = 6)
ScaOp_Const TI (int, ML = 4) XVAR (int, মালিকানাধীন নয়, মান = 1)
ScaOp_Identifier QCOL: [cdc] .col4
লগঅপ_গীত টিবিএল: dbo.table5 (ওরফে টিবিএল: a5)
ScaOp_Logical x_lopAnd
ScaOp_Comp x_cmpEq
ScaOp_Identifier QCOL: [a5] .col2
ScaOp_Identifier QCOL: [cdc] .col2
ScaOp_Comp x_cmpEq
ScaOp_Identifier QCOL: [a4] .col2
ScaOp_Identifier QCOL: [cdc] .col2
পরিসংখ্যানগুলি লোড করা হয় এবং প্রাথমিক যোগদানের আদেশ সেট হওয়ার ঠিক পরে গাছে একটি প্রাথমিক কার্ডিনালিটি অনুমান করা হয়। বিভিন্ন অর্ডারে যোগদানের ফলে এই অনুমানগুলিও প্রভাবিত হয় এবং পরবর্তী ব্যয়ভিত্তিক অপ্টিমাইজেশনের সময় নক-অন প্রভাব পড়ে।
অবশেষে এই বিভাগটির জন্য, গাছের মাঝখানে আটকে থাকা বাইরের অংশ আটকে রাখা ব্যয়ভিত্তিক অপ্টিমাইজেশনের সময় মিলে যাওয়া পুনর্নির্মাণের আরও কিছু কিছু রোধ করতে পারে।
একটি পরিকল্পনা গাইড (বা সমতুল্যভাবে একটি USE PLAN
ইঙ্গিত - আপনার ক্যোয়ারির উদাহরণ ) ব্যবহার করে অনুসন্ধান কৌশলটিকে আরও লক্ষ্য-ভিত্তিক দৃষ্টিভঙ্গিতে পরিবর্তন করে , সরবরাহিত টেমপ্লেটের সাধারণ আকার এবং বৈশিষ্ট্য দ্বারা পরিচালিত । এটি ব্যাখ্যা করে যে অপ্টিমাইজার কেন কোনও পরিকল্পনার নির্দেশিকা বা ইঙ্গিত ব্যবহার করা হয়, যখন গণ্য এবং অ-গণিত কলাম স্কিমার বিপরীতে একই অনুসন্ধান পরিকল্পনাটি খুঁজে পেতে পারেtable1
।
আমরা চেষ্টাটি ঘটানোর জন্য আলাদাভাবে কিছু করতে পারি কিনা
এটি কেবলমাত্র আপনাকে চিন্তিত করতে হবে যদি অপ্টিমাইজারটি তার নিজস্ব হিসাবে গ্রহণযোগ্য পারফরম্যান্স বৈশিষ্ট্য সহ কোনও পরিকল্পনা না পায়।
সমস্ত সাধারণ টিউনিং সরঞ্জামগুলি সম্ভাব্যভাবে প্রযোজ্য। আপনি উদাহরণস্বরূপ, ক্যোয়ারীটিকে আরও সহজ অংশে বিভক্ত করতে পারেন, উপলব্ধ ইনডেক্সিং পর্যালোচনা ও উন্নত করতে পারেন, নতুন পরিসংখ্যান আপডেট করতে বা তৈরি করতে পারেন ... ইত্যাদি।
এই সমস্ত জিনিস কার্ডিনালিটির অনুমান, অপ্টিমাইজারের মাধ্যমে নেওয়া কোড পাথ এবং সূক্ষ্ম উপায়ে ব্যয়ভিত্তিক সিদ্ধান্তগুলিকে প্রভাবিত করতে পারে।
আপনি শেষ পর্যন্ত ইঙ্গিতগুলি ব্যবহার করতে (বা কোনও পরিকল্পনার গাইড) অবলম্বন করতে পারেন, তবে এটি সাধারণত আদর্শ সমাধান নয়।
মন্তব্য থেকে অতিরিক্ত প্রশ্ন
আমি সম্মত হই যে ক্যোয়ারী ইত্যাদি সহজতর করা সর্বোত্তম, তবে অপটিমাইজারটি অপ্টিমাইজেশান অবিরত রাখতে এবং একই ফলাফলটিতে পৌঁছানোর জন্য কি কোনও উপায় আছে (পতাকা চিহ্নিত করা)?
না, একটি বিস্তৃত অনুসন্ধান সম্পাদনের জন্য কোনও ট্রেস পতাকা নেই, এবং আপনি এটি চান না। সম্ভাব্য অনুসন্ধানের স্থানটি বিস্তৃত এবং মহাবিশ্বের বয়স অতিক্রমকারী সংকলনের সময়গুলি ভালভাবে গ্রহণযোগ্য হবে না। এছাড়াও, অপ্টিমাইজারটি প্রতিটি সম্ভাব্য লজিকাল ট্রান্সফর্মটি জানেন না (কেউ তা করেন না)।
এছাড়াও, কলামটি অবিচ্ছিন্ন থাকায় জটিল সম্প্রসারণ কেন প্রয়োজন? কেন অপ্টিমাইজার এটিকে প্রসারিত করতে, এটিকে নিয়মিত কলামের মতো আচরণ করতে এবং একই সূচনা পয়েন্টে পৌঁছাতে পারে না?
অতিরিক্ত অপ্টিমাইজেশনের সুযোগগুলি সক্ষম করতে গণনাকৃত কলামগুলি প্রসারিত (মতামতগুলির মত) রয়েছে। প্রসারণটি পরবর্তী প্রক্রিয়াতে যেমন একটি স্থায়ী কলাম বা সূচীর সাথে আবার মিলানো যেতে পারে তবে প্রাথমিক যোগদানের আদেশ স্থির হওয়ার পরে এটি ঘটে ।