"WHERE 1 = 1" এর সাধারণত ক্যোয়ারী পারফরম্যান্সে প্রভাব থাকে?


19

আমি সম্প্রতি "কোথায় 1 = 1 বিবৃতি" প্রশ্নটি দেখেছি ; একটি এসকিউএল কনস্ট্রাক্ট আমি ক্লিনার কোডটি লেখার প্রচেষ্টায় প্রায়শই ডায়নামিক এসকিউএল নির্মাণে ব্যবহার করি (হোস্ট ভাষার দৃষ্টিকোণ থেকে)।

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


4
আমি বিশ্বাস করি কোন অপটিমাইজার যেমন সহজ শর্ত হ্যান্ডেল করতে কেবল উপেক্ষা তাই চূড়ান্ত সঞ্চালনের পরিকল্পনা না এ সব এটা রয়েছে would সক্ষম হবে

আমিও তাই ভাবব - যৌক্তিকভাবে বলতে গেলে, এটি বোধগম্য মনে হয় যে সাধারণভাবে কোনও ক্যোয়ারী অপ্টিমাইজার কেবল এটিকে উপেক্ষা করবে।

6
আপনি মৃত্যুদন্ড কার্যকর করার পরিকল্পনার সাথে তুলনা করতে পারেন এবং ছাড়াই1=1
এম

4
@ লুক এম: এসকিউএলাইটের জন্য আমি এটিই করেছি। দেখা যাচ্ছে এটি ক্লজটি অপ্টিমাইজ করে না WHILE 1=1। তবে মৃত্যুদন্ড কার্যকর করার সময় এটির কোনও সনাক্তকারী প্রভাব আছে বলে মনে হয় না।
dan04

উত্তর:


23

যতদূর আমি জানি সমস্ত বড় বড় আরডিবিএমএস ধ্রুবক মূল্যায়নে তৈরি করেছে। এগুলির যে কোনও একটিতে এটি তাত্ক্ষণিকভাবে মূল্যায়ন করা উচিত।


+1 এটি আমার অনুমান হিসাবেও রয়েছে তবে আমি যে কারণে প্রশ্নটি জিজ্ঞাসা করেছি তা হল আরও কিছুটা বিশদ নেওয়া। আমি আরও ইনপুট পাই কিনা তা দেখার জন্য আমি এটি আরও কিছুক্ষণ খোলা রাখছি।
ট্রানজিস্টার 1

2
এটি উপেক্ষা করা হয়। এটি অপটিমাইজারের সাথে কিছুই নয়, কেবল প্রশ্নটির লিঙ্ক অনুসারে সংক্ষিপ্ত বিবরণ (আমার উত্তরও)
gbn

8

কোনও এসকিউএল সার্ভারের দৃষ্টিভঙ্গি থেকে আপনি যদি WHERE 1=1প্যারামিটারগুলির গতিশীল পাস করার জন্য এবং কোনও পরামিতিটি মূল্যায়ন করা থেকে বঞ্চিত করার জন্য করণীয় করে থাকেন, তবে আমি আপনাকে এসকিউএল সার্ভার এমভি এরল্যান্ড সোমমারস্কোগের কয়েকটি নিবন্ধ পড়ার পরামর্শ দিচ্ছি। তার পদ্ধতির গতিশীল এসকিউএল (যেমন WHERE Column = Columnকনস্ট্রাক্ট বা কনস্ট্রাক্ট ব্যবহার করে WHERE (Col = Val OR 1=1) and (Col2 = Val2 OR 1=1)) এর ভিতরে থাকা কিছু অন্যান্য কৌশল করার প্রয়োজন সরিয়ে ফেলে । @ জেএনকে উল্লিখিত হিসাবে 1 = 1 টি পারফরম্যান্সের সমস্যা সৃষ্টি করবে না (আমি সেখানে তার উত্তর +1 করেছি এবং এটিই গ্রহণযোগ্য হওয়া উচিত), আমি মনে করি আপনি এরল্যান্ডের নিবন্ধ থেকে কিছু ভাল টিপস পেয়ে যাবেন গতিশীল এসকিউএল এবং আপনি দেখতে পাবেন যে তিনি এখনও 1=1কোনও ক্ষেত্রে কোনও পরামিতি পাস না করা ক্ষেত্রে ব্যবহার করেন তবে তিনি পৃথক প্যারামিটারগুলি পাস করেন না সেগুলি এড়িয়ে যান, তিনি কেবল '


আমি কেবল দ্বিতীয় নিবন্ধটি ব্রাউজ করছি (কারণ আমি এই মুহুর্তে এসপি 1 এর জন্য কোডটি লিখছি না) তবে আমি দেখতে পাচ্ছি যে তিনি তার কোডটিতে 1 = 1 ব্যবহার করছেন। আমি ইতিমধ্যে sp_executesql এর সাথে পরিচিত, তবে এটি নিজের মধ্যে এবং 1 = 1 ব্যবহার করার ধাক্কাটি সরিয়ে দেয় না। আমি কি কিছু মিস করছি?
ট্রানজিস্টার 1

2
+1 - এরল্যান্ড হ'ল এই ধরণের জিনিসটিতে যাওয়ার সুযোগসুবিধা।
জেএনকে

মাত্র দ্বিতীয় লিঙ্কটি থেকে উদ্ধৃত করে: "লাইনে ১৯-২৯-তে, আমি বেসিক এসকিউএল স্ট্রিংটি রচনা করি line লাইন ২৯ এ যেখানে 1 = 1 শর্তটি সেখানে কোনও পরামিতি নির্দিষ্ট না করেই পদ্ধতিটি কল করার অনুমতি দেয়" "
ট্রানজিস্টার 1

2
দুঃখিত। আমি আমার বক্তব্য ভুল টাইপ করেছি। সম্পাদনা করবে। আমি বোঝাতে চাইনি যে যেখানে 1 = 1 নির্মাণের ক্ষেত্রে সমস্যা আছে, কেবল পঠনযোগ্যতার জন্য অন্যান্য টিপস প্রস্তাব করছি এবং আশা করি WHERE (কলাম = মান বা 1 = 1) এবং (কলাম 1 = মান 1 বা 1 = 1) এড়িয়ে যাওয়া এড়ানো হবে 1), ইত্যাদি।
মাইক ওয়ালশ

6

মাইএসকিউএল দিয়ে আপনি পরীক্ষা করতে পারেন, এক্সটেন্ডেড এক্সটেন্ডেড চালাচ্ছেন এবং পরে প্রকৃত ক্যোয়ারী দেখতে সতর্কতাগুলি দেখান। tl; dr: এটি অপ্টিমাইজড হয়ে যায়।

mysql> use test
Database changed
mysql> create table test1(val int);
Query OK, 0 rows affected (0.19 sec)

mysql> explain extended select * from test1 where val > 11 and 1 = 1;
+----+-------------+-------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------+------+---------------+------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | test1 | ALL  | NULL          | NULL | NULL    | NULL |    1 |   100.00 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)

mysql> show warnings;
+-------+------+--------------------------------------------------------------------------------------------+
| Level | Code | Message                                                                                    |
+-------+------+--------------------------------------------------------------------------------------------+
| Note  | 1003 | select `test`.`test1`.`val` AS `val` from `test`.`test1` where (`test`.`test1`.`val` > 11) |
+-------+------+--------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

1
দুর্দান্ত উত্তর। বিটিডাব্লু মাইএসকিউএল সার্ভার v5.7.18 বলছে 'এক্সটেন্ডেড' অবমূল্যায়ন করা হয়েছে এবং ভবিষ্যতের প্রকাশে সরানো হবে। মাইএসকিএল ডক থেকে: In older MySQL releases, extended information was produced using EXPLAIN EXTENDED. That syntax is still recognized for backward compatibility but extended output is now enabled by default, so the EXTENDED keyword is superfluous and deprecated. Its use results in a warning, and it will be removed from EXPLAIN syntax in a future MySQL release.এটি মাইএসকিউএল বনাম ৮.০ এ সরানো হয়েছে।
মাইকেপ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.