簡單對比MySQL和Oracle中的一個sql解析細節
SQL的語法解析器是一個很強大的內建工具集,裡面會涉及到很多的編譯原理的相關知識,語法分析,詞法分析。。一大堆看起來很理論的東東,不過看起來枯燥之餘,它們的價值也更加明顯。
借用一下網路中的原話:如果我們考究一下歷史,就會發現很多被稱為程式設計大師的人都是編譯領域的高手.寫出第一個微型機上執行的Basic語言的比爾蓋茲,設計出Delphi的Borland的”世界上最厲害的程式設計師”, Sun的JAVA之父, 貝爾實驗室的C++之父
起點提得有些高了,今天和大家分享的案例是一個很簡單的sql語句,在MySQL中能夠解析出問題,但在Oracle中就可以成功解析,透過這一個細節也能夠看出一些Oracle和MySQL中的一些差別。
需要執行的語句如下:
SELECT THREAD_ID, threads.NAME, SUM (COUNT_STAR) AS Totalcount, SUM(SUM_TIMER_WAIT) AS Totaltime
FROM performance_schema.events_waits_summary_by_thread_by_event_name
INNER JOIN performance_schema.threads USING (THREAD_ID)
WHERE threads.NAME LIKE 'thread/sql/slave\-%'
GROUP BY THREAD_ID, threads.NAME;
ERROR 1630 (42000): FUNCTION performance.sum does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual
乍一看這個錯誤,感覺一定是哪裡出了問題,自己找了一會沒發現明顯的語句問題,但是從錯誤來看問題似乎發生在sum字眼的附近。
簡單把第1行中的
SUM (COUNT_STAR) AS Totalcount 改為SUM(COUNT_STAR) AS Totalcount 問題就引刃而解了。可以看出問題是一個很細小的問題,嚴格來說,確實是語句寫得不夠嚴謹。但在我的印象中Oracle似乎對這鐘情況也是手到擒來,印象中沒有出現過此類問題。
我們來簡單在MySQL和Oracle中模擬一下這個問題,看看結果如何。
在MySQL中
create table parse_test ( id int, name varchar(30));
insert into parse_test values(1,'aa');
insert into parse_test values(2,'bb');
commit;
mysql> select count(id) from parse_test;
+-----------+
| count(id) |
+-----------+
| 2 |
+-----------+
1 row in set (0.00 sec)
mysql> select count (id) from parse_test;
ERROR 1630 (42000): FUNCTION test.count does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual
在Oracle中就沒有任何問題了。
create table parse_test( id number, name varchar2(30));
insert into parse_test values(1,'aa');
insert into parse_test values(2,'bb');
commit;
select count(id)from parse_test;
COUNT(ID)
----------
2
select count (id) from parse_test;
COUNT(ID)
----------
2
借用一下網路中的原話:如果我們考究一下歷史,就會發現很多被稱為程式設計大師的人都是編譯領域的高手.寫出第一個微型機上執行的Basic語言的比爾蓋茲,設計出Delphi的Borland的”世界上最厲害的程式設計師”, Sun的JAVA之父, 貝爾實驗室的C++之父
起點提得有些高了,今天和大家分享的案例是一個很簡單的sql語句,在MySQL中能夠解析出問題,但在Oracle中就可以成功解析,透過這一個細節也能夠看出一些Oracle和MySQL中的一些差別。
需要執行的語句如下:
SELECT THREAD_ID, threads.NAME, SUM (COUNT_STAR) AS Totalcount, SUM(SUM_TIMER_WAIT) AS Totaltime
FROM performance_schema.events_waits_summary_by_thread_by_event_name
INNER JOIN performance_schema.threads USING (THREAD_ID)
WHERE threads.NAME LIKE 'thread/sql/slave\-%'
GROUP BY THREAD_ID, threads.NAME;
ERROR 1630 (42000): FUNCTION performance.sum does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual
乍一看這個錯誤,感覺一定是哪裡出了問題,自己找了一會沒發現明顯的語句問題,但是從錯誤來看問題似乎發生在sum字眼的附近。
簡單把第1行中的
SUM (COUNT_STAR) AS Totalcount 改為SUM(COUNT_STAR) AS Totalcount 問題就引刃而解了。可以看出問題是一個很細小的問題,嚴格來說,確實是語句寫得不夠嚴謹。但在我的印象中Oracle似乎對這鐘情況也是手到擒來,印象中沒有出現過此類問題。
我們來簡單在MySQL和Oracle中模擬一下這個問題,看看結果如何。
在MySQL中
create table parse_test ( id int, name varchar(30));
insert into parse_test values(1,'aa');
insert into parse_test values(2,'bb');
commit;
mysql> select count(id) from parse_test;
+-----------+
| count(id) |
+-----------+
| 2 |
+-----------+
1 row in set (0.00 sec)
mysql> select count (id) from parse_test;
ERROR 1630 (42000): FUNCTION test.count does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual
在Oracle中就沒有任何問題了。
create table parse_test( id number, name varchar2(30));
insert into parse_test values(1,'aa');
insert into parse_test values(2,'bb');
commit;
select count(id)from parse_test;
COUNT(ID)
----------
2
select count (id) from parse_test;
COUNT(ID)
----------
2
拋開Oracle解析複雜sql語句的優勢,可以看出Oracle在這種細節方面確實支援的力度要高一些。
不過最開始在MySQL出錯的語句在放到Oracle裡面(如果假設表結構資料都存在),也一定執行不了。原因就在於Oracle中定義的表明長度最大是30位,但是在MySQL中支援的要多不少,達64位。
不過最開始在MySQL出錯的語句在放到Oracle裡面(如果假設表結構資料都存在),也一定執行不了。原因就在於Oracle中定義的表明長度最大是30位,但是在MySQL中支援的要多不少,達64位。
mysql> create table events_waits_summary_by_thread_by_event_name567890123456789012345 ( id int, name varchar(30));
ERROR 1059 (42000): Identifier name 'events_waits_summary_by_thread_by_event_name567890123456789012345' is too long
mysql> select length('events_waits_summary_by_thread_by_event_name567890123456789012345');
+-----------------------------------------------------------------------------+
| length('events_waits_summary_by_thread_by_event_name567890123456789012345') |
+-----------------------------------------------------------------------------+
| 65 |
+-----------------------------------------------------------------------------+
1 row in set (0.01 sec)
當然了我也是到此為止我也是撿個小石頭,弄點兒水花,對於sql解析器更深入的問題,如果細究,從MySQL程式碼層面能夠分析出問題來就一個基本目標了。
ERROR 1059 (42000): Identifier name 'events_waits_summary_by_thread_by_event_name567890123456789012345' is too long
mysql> select length('events_waits_summary_by_thread_by_event_name567890123456789012345');
+-----------------------------------------------------------------------------+
| length('events_waits_summary_by_thread_by_event_name567890123456789012345') |
+-----------------------------------------------------------------------------+
| 65 |
+-----------------------------------------------------------------------------+
1 row in set (0.01 sec)
當然了我也是到此為止我也是撿個小石頭,弄點兒水花,對於sql解析器更深入的問題,如果細究,從MySQL程式碼層面能夠分析出問題來就一個基本目標了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-1661215/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- PG和MySQL詳細的一些特性對比MySql
- MySql和簡單的sql語句MySql
- Kotlin和Java的簡單對比KotlinJava
- 簡單解析MySQL中的cardinality異常MySql
- ORACLE PL/SQL 物件、表資料對比功能儲存過程簡單實現OracleSQL物件儲存過程
- ORACLE SQL解析之硬解析和軟解析OracleSQL
- Oracle和MySQL資料庫CTAS等操作對比OracleMySql資料庫
- EasyReact的簡單試用及和RAC的對比React
- oracle Mysql PostgreSQL 資料庫的對比OracleMySql資料庫
- 對比SQL中簡單巢狀查詢與非巢狀查詢CFSQL巢狀
- C++寫一個簡單的JSON解析C++JSON
- spring 簡單的使用 Hikari連線池 和 jdbc連線mysql 的一個簡單例子SpringJDBCMySql單例
- 解析SwiftUI佈局細節(一)SwiftUI
- 【SQL】Oracle資料庫變更後sql效能對比SQLOracle資料庫
- MySql/Oracle和SQL Server的分頁查MySqlOracleServer
- SQL2017 安裝教程圖解(詳細到每一個細節)SQL圖解
- C++中單例模式和static的對比C++單例模式
- SQL 和 SPL 的有序運算對比SQL
- 對一條基於分割槽的簡單SQL的優化SQL優化
- TCP 中的兩個細節點TCP
- 記一個簡單的sql題:思維擴散SQL
- 一個left join SQL 簡單優化分析SQL優化
- 簡單對比測試了幾個基於 swoole 的框架框架
- ListView 與 RecyclerView 簡單對比View
- Laravel 的一個命名細節分享Laravel
- 一個小的技術細節
- TIDB和MySQL效能對比TiDBMySql
- MySQL:一個簡單insert語句的大概流程MySql
- mongodb和hbase的簡單比較MongoDB
- [MATLAB] plot畫圖簡單細節隨記Matlab
- 實現一個簡單版本的Vue及原始碼解析(一)Vue原始碼
- Node 中如何引入一個模組及其細節
- Oracle、NoSQL和NewSQL 資料庫技術對比(一)OracleSQL資料庫
- 使用一個Oracle MySQL的理念OracleMySql
- Python實現簡單的excel對比工具PythonExcel
- 【SQL】Oracle sql語句 minus函式執行效率與join對比SQLOracle函式
- 日誌收集工具簡單對比
- 【postgresl】PG資料庫sql特性簡單解析資料庫SQL
- 簡單分析Go語言中陣列的這些細節Go陣列