ভাল, খারাপ বা উদাসীন: যেখানে 1 = 1


14

প্রদত্ত এই প্রশ্নের ক্রেতা উপর, আমি নির্দেশ যেখানে ইস্যু ক্যোয়ারীতে ছিল ক্যোয়ারী পরিষ্কার। আমি প্রথমে কমা ব্যবহার করি এবং WHERE 1=1কোয়েরিগুলিকে সংশোধন করা আরও সহজ করার জন্য, তাই আমার প্রশ্নগুলি সাধারণত এ জাতীয়ভাবে শেষ হয়:

SELECT 
     C.CompanyName
    ,O.ShippedDate
    ,OD.UnitPrice
    ,P.ProductName
FROM 
               Customers       as C
    INNER JOIN Orders          as O  ON C.CustomerID = O.CustomerID
    INNER JOIN [Order Details] as OD ON O.OrderID    = OD.OrderID
    INNER JOIN Products        as P  ON P.ProductID  = OD.ProductID
Where 1=1
--  AND O.ShippedDate Between '4/1/2008' And '4/30/2008'
    And P.productname = 'TOFU'
Order By C.CompanyName

কেউ মূলত বলেছিলেন যে 1 = 1 সাধারণত অলস এবং কার্য সম্পাদনের জন্য খারাপ

প্রদত্ত যে আমি "অসময়ে অপ্টিমাইজ" করতে চাই না - আমি ভাল অভ্যাসগুলি অনুসরণ করতে চাই না। আমি এর আগে ক্যোয়ারী পরিকল্পনাগুলি দেখেছি, তবে সাধারণত আমার অনুসন্ধানগুলি আরও দ্রুত চালিত করতে আমি কী সূচিপত্রগুলি যুক্ত করতে পারি (বা সামঞ্জস্য করতে পারি) তা কেবল অনুসন্ধান করতে।

প্রশ্নটি আসলেই ... Where 1=1খারাপ ঘটনা ঘটায়? এবং যদি তাই হয়, আমি কিভাবে বলতে পারি?

অপ্রাপ্তবয়স্ক সম্পাদনা: আমি সর্বদা 'ধরেই নিয়েছি' পাশাপাশি এটি 1=1অপ্টিমাইজ করা হবে, বা সবচেয়ে খারাপভাবে উপেক্ষিত হবে। "গোটোস ইভিল" বা "অকাল অপটিমাইজেশন ..." বা অন্যান্য অনুমানিত সত্যের মতো মন্ত্রকে প্রশ্ন করতে কখনই ব্যাথা দেয় না। 1=1 ANDবাস্তবিক জিজ্ঞাসা পরিকল্পনাগুলি প্রভাবিত করবে কিনা তা নিশ্চিত ছিল না affect সাবকিউরিতে কী হবে? কোটে এর? পদ্ধতি?

প্রয়োজন না হলে আমি অপ্টিমাইজ করার জন্য কেউ নই ... তবে আমি যদি এমন কিছু করছি যা আসলে "খারাপ" হয় তবে আমি প্রভাবগুলি হ্রাস করতে বা যেখানে প্রযোজ্য সেখানে পরিবর্তন করতে চাই।


2
না, এটা হবে না। অপ্রয়োজনীয় শর্তটি অপসারণের জন্য কয়েকটি মাইক্রোসেকেন্ড ছাড়াও izer আপনি আপনার তারিখের আক্ষরিক বিষয়ে অস্পষ্ট না হওয়ার বিষয়ে আরও ভাল মনোযোগ দিন।
ypercubeᵀᴹ

যেমন @ টাইপকিউব বলেছেন, এতে কোনও তফাত হয় না। ক্যোয়ারী অপ্টিমাইজারটি এমন কোনও বিষয় তৈরি করতে **** এর একটি টুকরো হতে হবে;)
ফিলি

4
আপনি reddit এ যা পড়েছেন তা বিশ্বাস করবেন না। অনুগ্রহ.
অ্যারন বারট্র্যান্ড

1
অ্যারোনবার্ট্র্যান্ড আমি লবণের দানা দিয়ে সবকিছু নিয়ে যাচ্ছি, যতক্ষণ না আমি এটি প্রথম হাতটি ব্যবহার করেছি। আমি এখনও এমন একটি প্রশ্ন নেব যা কলুষিত মনে হচ্ছে এবং এটির কোনও সত্যতা আছে কিনা তা দেখুন, বিশেষত যখন এটি আমার প্রতিদিনের কাজকে প্রভাবিত করে।
WernerCD

4
লবণের দানা আছে, তারপরে আপনার সমুদ্রের সমুদ্রের
নুনের

উত্তর:


13

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

দেখুন স্থায়ী ভাঁজ এবং এক্সপ্রেশন মূল্যায়ন Cardinality প্রাক্কলন সময় আরও তথ্যের জন্য।


এটি সম্ভবত দূরে সংকলিত হয়েছে কারণ এটি ক্ষেত্রগুলিকে একত্রিত করার জন্য একটি পরিচিত প্যাটার্ন।
jcolebrand

না, এটি সংকলিত কারণ এটি টোটোলজিকাল। এটি ২36 =36 = ২363636 এর সাথে একইভাবে কাজ করবে, যা ১ = ১ এর মতো স্বাভাবিক নয় The একই মতবিরোধেও প্রযোজ্য। সেক্ষেত্রে বৈশিষ্ট্যটিকে "বিপরীতে সনাক্তকরণ" বলা হয়।
স্প্যাগেটিডবা

"পরিচিত প্যাটার্ন" এর কোন অংশটি "1 = 1" হতে হবে?
jcolebrand

9

রিডানড্যান্ট প্রিডিকেটের সংযোজন এসকিউএল সার্ভারে পার্থক্য আনতে পারে।

কার্যনির্বাহী পরিকল্পনাগুলিতে দ্বিতীয় পরিকল্পনায় @1আক্ষরিক বনাম প্রথম পরিকল্পনায় বিজ্ঞপ্তিটি লক্ষ্য করুন 'foo'

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

এটি সূচিত করে যে এসকিউএল সার্ভার কার্যকর প্রয়োগের পুনর্ব্যবহারের প্রচারের জন্য সাধারণ পরামিতিগুলির জন্য প্রথম ক্যোয়ারী বিবেচনা করেছিল - তবে দুটি ধ্রুবকের তুলনা এটি দ্বিতীয় ক্ষেত্রে ঘটতে বাধা দেয়।

সাধারণ পরামিতি প্রতিরোধকারী শর্তগুলির একটি তালিকা (পূর্বে স্বতঃ-প্যারামিটারাইজেশন নামে পরিচিত) প্ল্যান ক্যাচিং মাইক্রোসফ্ট টেকনিক্যাল পেপারগুলির পরিশিষ্ট এ-তে পাওয়া যাবে:

সাধারণ প্যারামিটারাইজেশন সাধারণত এমন কিছু নয় যা আপনার যাইহোক যদিও নির্ভর করা উচিত। আপনার প্রশ্নের স্পষ্টভাবে প্যারামিটারাইজেশন করা আরও ভাল।


4

যে কোনও আধুনিক আরডিবিএমএসে (ওরাকল, মাইক্রোসফ্ট এসকিউএল সার্ভার এবং পোস্টগ্রিজ এসকিউএল সহ - আমি এগুলি সম্পর্কে নিশ্চিত) এর কার্যকারিতার উপর কোনও প্রভাব ফেলবে না।

যেমন কেউ উল্লেখ করেছেন, এটি কেবল ক্যোয়ারী পরিকল্পনার পর্যায়ে প্রভাব ফেলবে। অতএব পার্থক্যটি কেবল তখনই দৃশ্যমান হবে যখন আপনি একটি সরল জিজ্ঞাসার হাজারো পুনরাবৃত্তি চালান যা এই জাতীয় কোনও ডেটা ফেরত দেয় না:

SELECT 1 FROM empty_table; -- run this 10 000 times.

SELECT 1 FROM empty_table WHERE 1=1; -- run this 10 000 times and compare.

আমার জন্য পোস্টগ্রিজ এসকিউএল 9.0 এ, এটি কেবল 10000 পুনরাবৃত্তির সাথে দৃশ্যমান:

filip@srv:~$ pgquerybench.pl -h /var/run/postgresql/ -q "select 1 from never where 1=1" -q "select 1 from never" -i 10000
Iterations: 10000
Query:   select 1 from never where 1=1
Total:   2.952 s
Average: 0.295 ms
Query:   select 1 from never
Total:   2.850 s
Average: 0.285 ms

0

আপনি যখন ডাটাবেস প্যারামিটার কার্সার_শেয়ারিং ব্যবহার করেন তখন এটি ওরাকলের জন্য "সমস্যা" হতে পারে। এটি "বলপূর্বক" এ সেট করা থাকলে তা সমস্ত এসকিউএল স্টেটমেন্টগুলিকে সংশোধন করবে। প্রশ্নগুলিতে থাকা সমস্ত "ধ্রুবক" প্রতিস্থাপনের পরিবর্তনশীল (যেমন 1 =>: SYS_0) দ্বারা প্রতিস্থাপিত হবে।

কিছু অলস বিকাশকারীদের মোকাবেলায় এই বিকল্পটি চালু করা হয়েছিল। অন্যদিকে এটি অন্যান্য অলস বিকাশকারীদেরও ক্ষতি করতে পারে। তবে ঝুঁকি খুব বেশি নয়। ১১ জি থেকে এটিতে বাইন্ড ভেরিয়েবল পিকিং বৈশিষ্ট্য রয়েছে।


আপনি কী ব্যাখ্যা করতে পারবেন "11g যেহেতু এটিতে বেঁধে দেওয়া পরিবর্তনশীল পিকিং বৈশিষ্ট্য রয়েছে" " কারে কয়?
ypercubeᵀᴹ

@ টাইপক्यूब "বাইন্ড ভেরিয়েবল পিকিং" এর অর্থ হ'ল অপটিমাইজার বাইন্ড ভেরিয়েবলের আসল মানগুলি পর্যবেক্ষণ করবে এবং কোয়েরি এক্সিকিউশন প্ল্যানটিকে পুনরায় মূল্যায়ন করতে এবং সম্ভাব্য পুনর্জাতকরণের জন্য ডেটা পরিসংখ্যান ব্যবহার করবে। আমি সন্দেহ করি উঁকি দেওয়ার ফলে যে কনস্ট্রাক্টটি নিয়ে আলোচনা হচ্ছে তাতে কোনও প্রভাব পড়বে, কারণ এটি ডেটা পরিসংখ্যানের উপর নির্ভর করে না।
mustaccio
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.