Oracle WHER条件的执行顺序是不是自右向左
突然在网上看到一种说法,ORACLE的WHERE条件执行顺序是自右向左的。理由是,当ORACLE的WHERE条件中出现多个00904表示符无效错误时
突然在网上看到一种说法,Oracle的WHERE条件执行顺序是自右向左的。
理由是,当ORACLE的WHERE条件中出现多个00904表示符无效错误时,错误是从右向左的顺序报的。
也有人提出解析顺序和执行顺序不是一码事,执行顺序要看执行计划。
于是,我特地作了个试验。
现做一个试验用表
SQL> select count(*) from dba_objects;
COUNT(*)
----------
72536
create table dba_objects2 as select * from dba_objects;
先来一次查询
SQL> select object_id,object_name from dba_objects2 where owner='HR' and object_id>500;
已选择41行。
执行计划
----------------------------------------------------------
Plan hash value: 4278809457
----------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 426 | 40896 | 283 (1)| 00:00:04 |
|* 1 | TABLE ACCESS FULL| DBA_OBJECTS2 | 426 | 40896 | 283 (1)| 00:00:04 |
----------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("OWNER"='HR' AND "OBJECT_ID">500)
Note
-----
- dynamic sampling used for this statement (level=2)
可以看出,这次Oracle是自左向右执行。那么SQL语句颠倒下会怎样?
SQL> select object_id,object_name from dba_objects2 where object_id>500 and owner='HR';
已选择41行。
执行计划
----------------------------------------------------------
Plan hash value: 4278809457
----------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 426 | 40896 | 283 (1)| 00:00:04 |
|* 1 | TABLE ACCESS FULL| DBA_OBJECTS2 | 426 | 40896 | 283 (1)| 00:00:04 |
----------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("OWNER"='HR' AND "OBJECT_ID">500)
Note
-----
- dynamic sampling used for this statement (level=2)
实际的执行顺序是自右向左。难道oracle的执行顺序是看开销的?把尽可能多缩小数据范围的条件放在前面执行。
为了证明自己的想法,我又增加了一个条件。
SQL> select object_id,object_name from dba_objects2 where object_id>500 and object_name like '%EM%' and owner='HR';
已选择14行。
执行计划
----------------------------------------------------------
Plan hash value: 4278809457
----------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 147 | 14112 | 283 (1)| 00:00:04 |
|* 1 | TABLE ACCESS FULL| DBA_OBJECTS2 | 147 | 14112 | 283 (1)| 00:00:04 |
----------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("OBJECT_NAME" IS NOT NULL AND "OWNER"='HR' AND
"OBJECT_ID">500 AND "OBJECT_NAME" LIKE '%EM%')
Note
-----
- dynamic sampling used for this statement (level=2)
ORACLE 智能的增加了"OBJECT_NAME" IS NOT NULL的条件,把放在中间的 OBJECT_NAME" LIKE '%EM%'放在了最后执行。
由此可见,,WHERE条件的执行顺序是按照开销的右小到大的顺序,智能调节的。
本文永久更新链接地址:

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









この記事では、MySQLのAlter Tableステートメントを使用して、列の追加/ドロップ、テーブル/列の名前の変更、列データ型の変更など、テーブルを変更することについて説明します。

INNODBのフルテキスト検索機能は非常に強力であり、データベースクエリの効率と大量のテキストデータを処理する能力を大幅に改善できます。 1)INNODBは、倒立インデックスを介してフルテキスト検索を実装し、基本的および高度な検索クエリをサポートします。 2)一致を使用してキーワードを使用して、ブールモードとフレーズ検索を検索、サポートします。 3)最適化方法には、単語セグメンテーションテクノロジーの使用、インデックスの定期的な再構築、およびパフォーマンスと精度を改善するためのキャッシュサイズの調整が含まれます。

記事では、証明書の生成と検証を含むMySQL用のSSL/TLS暗号化の構成について説明します。主な問題は、セルフ署名証明書のセキュリティへの影響を使用することです。[文字カウント:159]

記事では、MySQLワークベンチやPHPMyAdminなどの人気のあるMySQL GUIツールについて説明し、初心者と上級ユーザーの機能と適合性を比較します。[159文字]

記事では、MySQLで大規模なデータセットを処理するための戦略について説明します。これには、パーティション化、シャード、インデックス作成、クエリ最適化などがあります。

この記事では、ドロップテーブルステートメントを使用してMySQLのドロップテーブルについて説明し、予防策とリスクを強調しています。これは、バックアップなしでアクションが不可逆的であることを強調し、回復方法と潜在的な生産環境の危険を詳述しています。

記事では、外部キーを使用してデータベース内の関係を表すことで、ベストプラクティス、データの完全性、および避けるべき一般的な落とし穴に焦点を当てています。

この記事では、クエリパフォーマンスを強化するために、PostgreSQL、MySQL、MongoDBなどのさまざまなデータベースでJSON列にインデックスの作成について説明します。特定のJSONパスのインデックス作成の構文と利点を説明し、サポートされているデータベースシステムをリストします。
