主頁 > 資料庫 > ORACLE隱式型別轉換

ORACLE隱式型別轉換

2020-09-13 01:31:15 資料庫

 

隱式型別轉換簡介

 

通常ORACLE資料庫存在顯式型別轉換(Explicit Datatype Conversion和隱式型別轉換(Implicit Datatype Conversion)兩種型別轉換方式,如果進行比較或運算的兩個值的資料型別不同時(源資料的型別與目標資料的型別),而且此時又沒有轉換函式時,那么ORACLE必須將其中一個值進行型別轉換,使其能夠運算,這就是所謂的隱式型別轉換,其中隱式型別轉換是自動進行的,當然,只有在這種轉換是有意義的時候,才會自動進行,

 

Data Conversion

Generally an expression cannot contain values of different datatypes. For example, an expression cannot multiply 5 by 10 and then add 'JAMES'. However, Oracle supports both implicit and explicit conversion of values from one datatype to another.

 

 

關于隱式型別轉換,建議翻看官方檔案Data Type Comparison Rules章節,下面是官方檔案中的隱式型別轉換矩陣,從下面這個表格,我們就能對哪些資料型別能進行轉換一目了然,

 

clip_image001[4]

 

 

 

 

隱式轉換的規則:

 

 

其實隱式型別轉換發生在很多地方,只是我們很多時候沒有留意罷了,不打算一一舉例,自行翻閱官方檔案的介紹,摘抄隱式型別轉換的一些常見的規則如下:

 

The following rules govern implicit data type conversions:

  • During INSERT and UPDATE operations, Oracle converts the value to the data type of the affected column.
  • During SELECT FROM operations, Oracle converts the data from the column to the type of the target variable.
  • When manipulating numeric values, Oracle usually adjusts precision and scale to allow for maximum capacity. In such cases, the numeric data type resulting from such operations can differ from the numeric data type found in the underlying tables.
  • When comparing a character value with a numeric value, Oracle converts the character data to a numeric value.
  • Conversions between character values or NUMBER values and floating-point number values can be inexact, because the character types and NUMBER use decimal precision to represent the numeric value, and the floating-point numbers use binary precision.
  • When converting a CLOB value into a character data type such as VARCHAR2, or converting BLOB to RAW data, if the data to be converted is larger than the target data type, then the database returns an error.
  • During conversion from a timestamp value to a DATE value, the fractional seconds portion of the timestamp value is truncated. This behavior differs from earlier releases of Oracle Database, when the fractional seconds portion of the timestamp value was rounded.
  • Conversions from BINARY_FLOAT to BINARY_DOUBLE are exact.
  • Conversions from BINARY_DOUBLE to BINARY_FLOAT are inexact if the BINARY_DOUBLE value uses more bits of precision that supported by the BINARY_FLOAT.
  • When comparing a character value with a DATE value, Oracle converts the character data to DATE.
  • When you use a SQL function or operator with an argument of a data type other than the one it accepts, Oracle converts the argument to the accepted data type.
  • When making assignments, Oracle converts the value on the right side of the equal sign (=) to the data type of the target of the assignment on the left side.
  • During concatenation operations, Oracle converts from noncharacter data types to CHAR or NCHAR.
  • During arithmetic operations on and comparisons between character and noncharacter data types, Oracle converts from any character data type to a numeric, date, or rowid, as appropriate. In arithmetic operations between CHAR/VARCHAR2 and NCHAR/NVARCHAR2, Oracle converts to a NUMBER.
  • Most SQL character functions are enabled to accept CLOBs as parameters, and Oracle performs implicit conversions between CLOB and character types. Therefore, functions that are not yet enabled for CLOBs can accept CLOBs through implicit conversion. In such cases, Oracle converts the CLOBs to CHAR or VARCHAR2 before the function is invoked. If the CLOB is larger than 4000 bytes, then Oracle converts only the first 4000 bytes to CHAR.
  • When converting RAW or LONG RAW data to or from character data, the binary data is represented in hexadecimal form, with one hexadecimal character representing every four bits of RAW data. Refer to "RAW and LONG RAW Data Types" for more information.
  • Comparisons between CHAR and VARCHAR2 and between NCHAR and NVARCHAR2 types may entail different character sets. The default direction of conversion in such cases is from the database character set to the national character set. Table 2-9 shows the direction of implicit conversions between different character types.

 

對上面官方檔案資料的翻譯如下,如有不對或不夠確切的地方,敬請指出

 

1.  對于INSERTUPDATE操作,ORACLE會把插入值或者更新值隱式轉換為對應欄位的資料型別,

 

2.  對于SELECT陳述句,ORACLE會把欄位的資料型別隱式轉換為變數的資料型別,

 

3.  當處理數值時,ORACLE通常會調整精度和小數位,以實作最大容量,在這種情況下,由此類操作產生的數字資料型別可能與在基礎表中找到的數字資料型別不同,

 

4.  當比較一個字符型和數值型的值時,ORACLE會把字符型的值隱式轉換為數值型,

 

5.  字符值或NUMBER值與浮點數值之間的轉換可能不準確,因為字符型別和NUMBER使用十進制精度表示數字值,而浮點數則使用二進制精度,

 

6.  CLOB值轉換為字符資料型別(例如VARCHAR2)或將BLOB轉換為RAW資料時,如果要轉換的資料大于目標資料型別,則資料庫將回傳錯誤,

 

7.   timestamp型別轉換為DATE時(按照第三條,隱式轉換不應該把timestamp轉換為date,除非insert這樣的),timestamp后幾位會被truncated忽略,至于忽略幾位,取決于資料庫版本,

 

8.  BINARY_FLOATBINARY_DOUBLE的轉換是準確的,

 

9.  BINARY_DOUBLEBINARY_FLOAT的轉換是不精確的,因為BINARY_DOUBLE精度更高,

 

10.  當比較字符型和日期型的資料時,ORACLE會把字符型轉換為日期型,

 

11. 如果呼叫函式(程序)或運算子操作時,如果輸入引數的資料型別與函式(存盤程序)定義的引數資料型別不一致或不是可接受的資料型別時,則ORACLE會把輸入引數的資料型別轉換為函式或者程序定義的資料型別,

 

12. 當使用賦值符號(等號)時,右邊的型別轉換為左邊的型別

 

13. 當連接操作(concatenation,一般為||)時,ORACLE會隱式轉換非字符型到字符型

 

14. 如果字符型別的資料和非字符型別的資料(numberdaterowid)作算術運算,則ORACLE會將字符型別的資料轉換為合適的資料型別,這些資料型別可能是numberdaterowid等,

  如果CHAR/VARCHAR2 NCHAR/NVARCHAR2之間作算術運算,則ORACLE會將她們都轉換為number型別的資料再做比較,

 

 

15. 比較CHAR/VARCHAR2 NCHAR/NVARCHAR2時,如果兩者字符集不一樣,則默認的轉換方式是將資料編碼從資料庫字符集轉換為國家字符集

 

 

下面簡單舉兩個例子,看看隱式轉換發生的場景:

 

例子:

 

SQL> create table test(object_id varchar2(12), object_name varchar2(64));
 
Table created.
 
SQL> insert into test
  2  select object_id, object_name from dba_objects;
 
63426 rows created.
 
SQL> commit;
 
Commit complete.
 
SQL> create index ix_test_n1 on test(object_id);
 
Index created.
 
SQL> select count(*) from test where object_id=20;
 
  COUNT(*)
----------
         1
 
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR);
 
PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------
SQL_ID  4bh7yzj5ma0ks, child number 0
-------------------------------------
select count(*) from test where object_id=20
 
Plan hash value: 1950795681
 
---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |       |       |    45 (100)|          |
|   1 |  SORT AGGREGATE    |      |     1 |     8 |            |          |
 
PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------
|*  2 |   TABLE ACCESS FULL| TEST |     3 |    24 |    45  (20)| 00:00:01 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - filter(TO_NUMBER("OBJECT_ID")=20)
 
Note
-----
   - dynamic sampling used for this statement
 
PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------
 
23 rows selected.

 

如上所示,這個發生隱式轉換是因為這個規則: 當比較一個字符型和數值型的值時,ORACLE會把字符型的值隱式轉換為數值型(對于SELECT陳述句,ORACLE會把欄位的資料型別隱式轉換為變數的資料型別,似乎這個規則也對),此時由于隱式轉換發生在OBJECT_ID欄位上(TO_NUMBER("OBJECT_ID"),導致執行計劃走全表掃描,如果我們稍微修改一下SQL的寫法,就會發現執行計劃會走INDEX RANGE SCAN, 如下所示:

 

SQLselect count(*) from test where object_id='20';
 
  COUNT(*)
----------
         1
 
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR);
 
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID  7800f6da7c909, child number 0
-------------------------------------
 select count(*) from test where object_id='20'
 
Plan hash value: 4037411162
 
--------------------------------------------------------------------------------
| Id  | Operation         | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |            |       |       |     1 (100)|          |
|   1 |  SORT AGGREGATE   |            |     1 |     6 |            |          |
 
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
|*  2 |   INDEX RANGE SCAN| IX_TEST_N1 |     1 |     6 |     1   (0)| 00:00:01 |
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("OBJECT_ID"='20')
 
 
19 rows selected.

 

下面再介紹一個案例(當比較字符型和日期型的資料時,ORACLE會把字符型轉換為日期型,),這種轉換雖然大部分情況下都是正常的,但是有時候會成為一個隱藏的邏輯炸彈,當NLS_DATE_FORMAT環境變數改變時,則有可能出現錯誤或邏輯錯誤,

 

SQL> SELECT *
  2  FROM scott.emp
  3  WHERE hiredate between '01-JAN-1981' and '01-APR-1981';
 
     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30
      7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30
 
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR);
 
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------
SQL_ID  czyc76busj56d, child number 0
-------------------------------------
SELECT * FROM scott.emp WHERE hiredate between '01-JAN-1981' and
'01-APR-1981'
 
Plan hash value: 3956160932
 
--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |       |       |     2 (100)|          |
 
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------
|*  1 |  TABLE ACCESS FULL| EMP  |     2 |    74 |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter(("HIREDATE"<=TO_DATE(' 1981-04-01 00:00:00', 'syyyy-mm-dd
              hh24:mi:ss') AND "HIREDATE">=TO_DATE(' 1981-01-01 00:00:00',
              'syyyy-mm-dd hh24:mi:ss')))
 
 
21 rows selected.

 

 

 

 

隱式型別轉換問題

 

 

Implicit and Explicit Data Conversion

 

Oracle recommends that you specify explicit conversions, rather than rely on implicit or automatic conversions, for these reasons:

 

·         SQL statements are easier to understand when you use explicit datatype conversion functions.

 

·         Implicit datatype conversion can have a negative impact on performance, especially if the datatype of a column value is converted to that of a constant rather than the other way around.

 

·         Implicit conversion depends on the context in which it occurs and may not work the same way in every case. For example, implicit conversion from a datetime value to a VARCHAR2 value may return an unexpected year depending on the value of the NLS_DATE_FORMAT parameter.

 

·         Algorithms for implicit conversion are subject to change across software releases and among Oracle products. Behavior of explicit conversions is more predictable.

 

雖然隱式轉換在很多地方自動發生,但是不推薦使用隱式型別轉換,Oracle官方建議指定顯式型別轉換,而不要依賴隱式或自動轉換,主要有下面一下原因:

 

    使用顯式型別轉換函式時,SQL陳述句更易于理解,

 

    隱式型別轉換可能會對性能產生負面影響,尤其是如果將列值的資料型別轉換為常量而不是相反的資料型別轉換操作時,

 

    隱式轉換取決于發生這種轉換的背景關系,在不同的情況下,隱式轉換的作業方式可能不同,例如,從日期時間值到VARCHAR2值的隱式轉換可能會回傳錯誤(意外)的年份,具體取決于NLS_DATE_FORMAT引數的值,

 

    隱式轉換演算法可能會在軟體版本之間以及Oracle產品之間發生變化,明確轉換的行為更容易預測,否則有可能埋下一個大坑,

 

   如果在索引運算式中發生隱式型別轉換,則Oracle資料庫可能不使用索引,因為它是pre-conversion data type.,這可能會對性能產生負面影響,

 

Tom Kyte的這篇博文On Implicit Conversions and More,還總結了隱式資料型別轉換會帶來的一些問題:

 

 

The resulting code typically has logic bombs in it. The code appears to work in certain circumstances but will not work in others.

  •  The resulting code relies on default settings. If someone changes the default settings, the way the code works will be subject to change. (A DBA     changing a setting can make your code work entirely differently from the way it does today.)
  •  The resulting code can very well be subject to SQL injection bugs.
  •  The resulting code may end up performing numerous unnecessary repeated conversions (negatively affecting performance and consuming many more resources than necessary).
  •  The implicit conversion may be precluding certain access paths from being available to the optimizer, resulting in suboptimal query plans. (In fact, this is exactly what is happening to you!)

    隱式轉換可能會阻止某些訪問路徑無法用于優化器,從而導致查詢計劃不理想, (實際上,這正是您資料庫當中正在發生的事情!)

  •  Implicit conversions may prevent partition elimination.

 

 

    其實上面已經有相關例子介紹,下面介紹一個例子,主要用來說明,隱式型別轉換不一定導致執行計劃不走索引,只有當隱式轉換函式出現在查詢條件中的索引欄位上,而且左值的型別被隱式轉為了右值的型別時才會出現嚴重性能問題,

 

SQL> drop table test;
 
Table dropped.
 
SQL> create table test
  2  as
  3  select * from dba_objects;
 
Table created.
 
SQL> create index ix_test_n1 on test(object_id);
 
Index created.
 
SQL> select count(*) from test where object_id='20';
 
  COUNT(*)
----------
         1
 
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR);
 
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID  29jmhh43kkrv4, child number 0
-------------------------------------
select count(*) from test where object_id='20'
 
Plan hash value: 4037411162
 
--------------------------------------------------------------------------------
| Id  | Operation         | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |            |       |       |     1 (100)|          |
|   1 |  SORT AGGREGATE   |            |     1 |    13 |            |          |
 
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
|*  2 |   INDEX RANGE SCAN| IX_TEST_N1 |    10 |   130 |     1   (0)| 00:00:01 |
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("OBJECT_ID"=20)
 
Note
-----
   - dynamic sampling used for this statement
 
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
 
23 rows selected.
 
SQL> 

 

clip_image002[4]

 

 

其實SQL陳述句發生了隱式轉換,而且轉換的地方在字串’20'上面,轉換為數字20,這樣的變化沒有發生在OBJECT_ID列上面,其次,這種轉換沒有發生在左值列上面,沒有影響到IX_TEST_N1的路徑,

 

所以以后,如果遇到”隱式轉換一定不走索引嗎?”或”隱式型別轉換一定導致索引失效嗎?”這類問題,你都要辯證的來分析,不能一概而論,

 

 

 

下面介紹一個系結變數發生隱式型別轉換的例子:

 

 

 

 

 

SQL> create table test
  2  as
  3  select * from dba_objects;             
 
Table created.
 
SQL> commit;
 
Commit complete.
 
SQL> create index ix_test_object_name on test(object_name);
 
Index created.
 
SQL> variables v_object_name nvarchar2(30);
SP2-0734: unknown command beginning "variables ..." - rest of line ignored.
SQL> 
SQL> variable v_object_name nvarchar2(30);
SQL> exec :v_object_name :='I_OBJ1';
 
PL/SQL procedure successfully completed.
 
SQL> select count(*) from test where object_name=:v_object_name;
 
  COUNT(*)
----------
         1
 
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR);
 
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID  ft05prnxtpk9u, child number 0
-------------------------------------
select count(*) from test where object_name=:v_object_name
 
Plan hash value: 1950795681
 
---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |       |       |   113 (100)|          |
|   1 |  SORT AGGREGATE    |      |     1 |    66 |            |          |
 
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
|*  2 |   TABLE ACCESS FULL| TEST |    10 |   660 |   113  (11)| 00:00:01 |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - filter(SYS_OP_C2C("OBJECT_NAME")=:V_OBJECT_NAME)
 
Note
-----
   - dynamic sampling used for this statement
 
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
 
23 rows selected.

 

clip_image003[4]

 

 

這里發生隱式型別轉換,是因為隱式型別規則:比較CHAR/VARCHAR2 NCHAR/NVARCHAR2時,如果兩者字符集不一樣,則默認的轉換方式是將資料編碼從資料庫字符集轉換為國家字符集 ,而此時是借助內部函式SYS_OP_C2C實作的

 

 

SYS_OP_C2C is an internal function which does an implicit conversion of varchar2 to national character set using TO_NCHAR function. Thus, the filter completely changes as compared to the filter using normal comparison.

 

 

如何找出存在隱式轉換的SQL?

 

有些公司可能對發布的SQL進行全面審計,能夠從源頭上杜絕大多數存在隱式型別轉換的SQL,但是大多數公司可能沒有這個能力或資源來實作這個目標,那么,最重要的就是如何找出資料庫中存在隱式轉換的SQL,關于如何找出存在隱式資料型別轉換的SQL,一般有下面兩個SQL:

 

 

SELECT

     SQL_ID,

     PLAN_HASH_VALUE

 FROM

     V$SQL_PLAN X

 WHERE

     X.FILTER_PREDICATES LIKE '%INTERNAL_FUNCTION%'

 GROUP BY

     SQL_ID,

     PLAN_HASH_VALUE;

 

 

SELECT

     SQL_ID,

     PLAN_HASH_VALUE

 FROM

     V$SQL_PLAN X

 WHERE

     X.FILTER_PREDICATES LIKE '%SYS_OP_C2C%'

 GROUP BY

     SQL_ID,

     PLAN_HASH_VALUE;

 

 

但是需要注意的是,即使執行計劃中存在INTERNAL_FUNCTION,也不一定說明SQL陳述句出現了隱式資料型別轉換,關于這個問題,參考我的博客ORACLE資料庫中執行計劃出現INTERNAL_FUNCTION一定是隱式轉換嗎?, 所以還必須對找出的相關SQL進行仔細甄別、鑒定,

 

 

另外,這篇博客ORACLE中內部函式SYS_OP_C2C和隱式型別轉換,也值得對隱式型別轉換了解不深的同學看看,

 

 

 

 

 

如何避免隱式型別轉換呢?

 

1:在資料庫設計階段和寫SQL期間,盡量遵循一致的原則,避免不必要的資料型別轉換,

 

 

   在建模時,要統一欄位型別,尤其是和其它表進行關聯的相關欄位必須保證資料型別一致,這樣可以避免不必要的隱式資料型別轉換,

 

 

   查詢SQL中條件與欄位型別保持一致,另外,確保系結變數的資料型別,使其與對應欄位的資料型別一致

 

 

2:使用轉換函式,進行顯示型別轉換,

 

 

例如有下面一些常見的型別轉換函式:

 

·         TO_CHAR:把DATENUMBER轉換成字串;

·         TO_DATE:把NUMBERCHARVARCHAR2轉換成DATE,當用到時間戳時,可以用到TO_TIMESTAMPTO_TIMESTAMP_TZ

·         TO_NUMBER:  CHARVARCHAR2轉換成NUMBER

 

 

3:創建帶有SYS_OP_C2C的函式索引,

 

 

這種方法比較少用,不過確實也是特殊場景下的一種優化方法,

 

 

 

 

參考資料:

 

https://blogs.oracle.com/oraclemagazine/on-implicit-conversions-and-more

https://docs.oracle.com/cd/E21764_01/apirefs.1111/e12048/cql_elements.htm#CQLLR290

https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/Data-Type-Comparison-Rules.html#GUID-98BE3A78-6E33-4181-B5CB-D96FD9DC1694

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/18431.html

標籤:Oracle

上一篇:Oracle匯出警告&ldquo;EXP-00003: 未找到段 (0,0) 的存盤定義&rdquo;解決

下一篇:Oracle11以后的行列轉換

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more