天天看點

HANA常用文法(持續更新)1.SCHEMA2.TABLE3.COLUMN4.INDEXES5.常用SQL語句

HANA常用文法梳理

  • 1.SCHEMA
  • 2.TABLE
    • 2.1 建立表
    • 2.2 修改表
      • 2.2.1 修改表名
      • 2.2.2 修改表類型
      • 2.2.3 修改表限制
      • 2.2.4 修改表分區
  • 3.COLUMN
  • 4.INDEXES
  • 5.常用SQL語句

1.SCHEMA

--建立schema:
--文法:CREATE SCHEMA <schema_name> [OWNED BY <user_name>]
/*OWNED BY:指定schema的擁有者,如果省略。目前使用者将是這個shema的擁有者*/
create schema my_schema;
create schema my_schema OWNED BY system.
--删除schema:
--文法:DROP SCHEMA <schema_name> [<drop_option>]
drop_option: CASCADE | RESTRICT
/*預設的drop_option為:RESTRICT(限制限制)
RESTRICT:直接删除沒有依賴的對象,如果對象有依賴關系,會抛出錯誤資訊。
CASCADE:直接删除所有對象。*/
CREATE SCHEMA my_schema;
CREATE TABLE my_schema.t (a INT);
DROP SCHEMA my_schema CASCADE;
select * from tables  where schema_name='P1526659201'  --查詢schema:P1526659201下的所有表
           

2.TABLE

HANA資料庫可以存儲ROW TABLE(行表)和COLUMN TABLE(清單),分别适用于不同的場景。

2.1 建立表

行存儲表适用于場景:

  • 一次處理一條記錄的情況
  • 應用需要通路完整記錄或記錄的大部分(即一條記錄中的所有字段或大多數字段)
  • 不需要壓縮率
  • 沒有或很少的聚集、分組等複雜操作
  • 表中的記錄行數不是很多

列存儲表适用場景:

  • 通常隻是在一個或少量列上執行計算操作
  • 表在進行搜尋時通常基于少量列上的值
  • 表有很多列
  • 表有很多行,并且通常進行的是列式操作(比如:聚集計算和where中字段值查找)
  • 需要很高的壓縮率
--行存儲表示例:   
--例1
CREATE TABLE accounts
    ( act_no CHAR(18), 
      act_name NVARCHAR(100),
      balance DECIMAL(15,2),
      PRIMARY KEY (act_no)
    ) ;
--例2
CREATE TABLE R 
    (A INT PRIMARY KEY, 
     B NVARCHAR(10)
    ); 
    
--列存儲表示例:
--例1
CREATE COLUMN TABLE tpch.nation
    (n_nationkey INT NOT NULL,
     n_name CHAR(25),
     n_regionkey INT,
     n_comment VARCHAR(152),
     PRIMARY KEY(n_nationkey)
    ) ;

--例2(分區,隻适用于清單,分區鍵必須是主鍵的一部分)
CREATE COLUMN TABLE tpch.lineitem
    (l_orderkey INT NOT NULL,l_partkey INT,
     l_suppkey INT,l_linenumber INT NOT NULL,
     l_quantity DECIMAL(10,2),l_extendedprice DECIMAL(10,2),
     l_discount DECIMAL(10,2),l_tax DECIMAL(10,2),
     l_returnflag CHAR(1),l_linestatus CHAR(1),
     l_shipdate DATE,l_commitdate DATE,l_receiptdate DATE,
     l_shipinstruct CHAR(25),l_shipmode CHAR(10),
     l_comment VARCHAR(44),
     PRIMARY KEY INVERTED VALUE (l_orderkey,l_linenumber)
    )
    PARTITION BY HASH (l_orderkey,l_linenumber) PARTITIONS 4,
    RANGE (l_shipdate) (    
       PARTITION '2011/01/01'<= VALUES <'2011/04/01',
       PARTITION '2011/04/01'<= VALUES <'2011/07/01',
       PARTITION '2011/07/01'<= VALUES <'2011/10/01',
       PARTITION OTHERS) ; 

--HANA檢視特定表的分區情況
select * from sys.M_CS_PARTITIONS where table_name =  'TABLE_NAME'; 
           

在上面的建立清單的例子中,我們指定的“UNIQUE”或“PRIMARY KEY”限制,HANA會自動建立相應的索引。這些索引分為兩種類型(僅适用于清單)

  • INVERTED VALUE 适合于範圍查詢或like查詢
  • INVERTED HASH 使用HASH對組合唯一鍵或組合主鍵進行編碼和壓縮。對于等值查詢(點查詢),這種索引類型具有更好的性能;并且能夠減少組合主鍵存儲使用的記憶體數量。

如果不指定,預設是 INVERTED VALUE。上面的INVERTED VALUE和INVERTED HASH 僅在UNIQUE和PRIMARY KEY限制中使用。下面是指定的示例

PRIMARY KEY INVERTED VALUE (l_orderkey,l_linenumber)
PRIMARY KEY INVERTED HASH (l_orderkey,l_linenumber)
           

參考連結:SAP HANA 學習系列——SQL開發(5) | SAP Blogs

HANA除了直接建表外,也可以通過已存在的表建立新表,示例如下:

/*依據某個已經存在的表建立另外的新表。HANA SQL提供了兩類方法*/
--方法一:建立的表與源表資料類型、限制完全相同。例如:
CREATE TABLE T_ACCOUNTS LIKE ACCOUNTS WITH NO DATA      
--方法二:建立的表字段類型和NULL/NOT NULL屬性相同
CREATE TABLE T_ACCOUNTS1 AS (SELECT * FROM  ACCOUNTS) WITH DATA
           

2.2 修改表

2.2.1 修改表名

--01.文法:RENAME TABLE <old_table_name> TO <new_table_name>
--02.描述:RENAME TABLE 語句在同一個Schema下,将表名修改為 new_table_name。
--03.示例:
CREATE TABLE mySchema.A (A INTPRIMARYKEY, B INT);
--顯示模式 mySchema 下表名的清單:
SELECT TABLE_NAME FROM TABLES WHERE SCHEMA_NAME = 'MYSCHEMA';
--表 mySchema.A 重命名為 B:
RENAME TABLE mySchema.A TO B;--注:修改後B還是在mySchema裡
           

2.2.2 修改表類型

HANA支援行表轉換為清單,或者清單轉換為行表。示例如下:

ALTER TABLE accounts COLUMN THREADS 10 BATCH 10000;  --行存儲表轉為列存儲表
ALTER TABLE accounts  ROW THREADS 10;                --列存儲表轉為行存儲表
           

參數說明:

  • THREADS:指定表轉換時的并行執行線程數。線程數的最佳值是系統可用 CPU 核心數。如果未提供 THREADS,将使用 indexserver 中指定的 CPU 核心數的預設值。
  • BATCH:指定批量處理的行數。如果未指定 BATCH,将使用預設值 2000000。在每次達到批量處理的行數後将立即送出到列存儲表中。BATCH 選項僅在從行轉換為列存儲時才能使用。

關于THREADS和BATCH兩個參數,官方文檔《SAP_HANA_SQL_and_System_Views_Reference_en》說明如下:

Specifies how many parallel execution threads should be used for the table conversion. The optimal value for the number of threads is the number of available CPU cores. If THREADS is not provided the default value of the number of CPU cores specified in the indexserver.ini file will be used.

Specifies the number of rows to be inserted in a batch. If BATCH is not specified the default value of 2,000,000 will be used. Inserts into column tables will be immediately committed after every <batch_size> records have been inserted. BATCH option can be used only when a table is converted from ROW to COLUMN

storage.

2.2.3 修改表限制

--删除/增加主鍵
ALTER TABLE "SCHEMA1"."TABLE1" DROP PRIMARY KEY;
ALTER TABLE "SCHEMA1"."TABLE1" ADD  PRIMARY KEY(TID, TNAME);
           

2.2.4 修改表分區

--建立非分區表
CREATE COLUMN TABLE "TEST"."TABLE1" (
  "WHENDATE" DAYDATE CS_DAYDATE,
  "COL1" VARCHAR(4),
  "COL2" VARCHAR(13),
  PRIMARY KEY ("WHENDATE","COL1")) UNLOAD PRIORITY 5 AUTO MERGE ;
   
--修改為分區表(使用WHENDATE作為分區) 
alter table TEST.TABLE1 partition by range (month(WHENDATE))(
  PARTITION '190001'<= values < '201801' ,
  PARTITION '201801'<= values < '201802' ,
  PARTITION '201802'<= values < '201803' ,
  PARTITION '201803'<= values < '201804' ,
  PARTITION '201804'<= values < '201805' ,
  PARTITION '201805'<= values < '201806' ,
  PARTITION '201806'<= values < '201807' ,
  PARTITION '201807'<= values < '201808' ,
  PARTITION OTHERS)
           

最後需要帶PARTITION OTHERS,否則會出現如下報錯資訊:

Could not execute 'alter table ******* PARTITION BY ‘RANGE month(WHENDATE) …’ in 162 ms 210 µs .

SAP DBTech JDBC: [2048]: column store error: fail to alter partition: [2593] Error during split/merge operation;A specified Range partitioning does not have a rest part.,object=********Een

--增加分區
ALTER TABLE TEST.TABLE1 ADD PARTITION (month(WHENDATE)) '201808' <= VALUES < '201809';
ALTER TABLE TEST.TABLE1 ADD PARTITION (month(WHENDATE)) '201809' <= VALUES < '201810';
           

3.COLUMN

--增加或删除字段
ALTER TABLE "SCHEMA1"."TABLE1" ADD("CREATETIME" DATE NULL) ;
ALTER TABLE "SCHEMA1"."TABLE1" DROP (COL1);
--修改字段類型
ALTER TABLE "SCHEMA1"."TABLE1" ALTER ("TYPE" NVARCHAR (10) NULL); 

--修改字段名稱
RENAME COLUMN <table_name>.<old_column_name> TO <new_column_name>;
--查詢小寫字段名資訊
select schema_name,table_name,column_name from table_columns where column_name like_regexpr '[[:lower:]]';
           

4.INDEXES

--SAP HANA的索引都是儲存在記憶體中。
--建立索引:
--文法:
CREATE [UNIQUE] [BTREE | CPBTREE] INDEX <index_name> 
       ON <table_name> (<column_name_order>, ...) [ASC | DESC]
--建立測試表:
create row table test_index (id INT,name nvarchar(10), remark nvarchar(10));
create index indextest1 on test_index(name);
CREATE CPBTREE INDEX indextest2 ON test_index(id, name DESC);

--建立唯一鍵索引:
create unique index indextest4 on test_index(id);
create unique index indextest3 on test_index(name,remark);

--删除索引:DROP INDEX <index_name>
drop index indextest2;--删除索引indextest2
--查詢索引:
select * from indexes where table_name ='EMP';  --查詢員工表中使用的索引
select * from index_columns  where table_name ='EMP'; --查詢索引列
select * from m_rs_indexes  where table_name = 'EMP'; --查詢索引的統計資訊(B-tree and CPB-tree)
select * from fulltext_indexes where table_name = 'EMP'; --查詢Fulltext 索引
select * from m_fulltext_queues; --檢視fulltext 索引隊列的狀态

--修改索引名稱
RENAME INDEX <old_index_name> TO <new_index_name>;
           

5.常用SQL語句

--1.時間相關
--檢視目前日期和時間
select current_date "date",current_time "time" from dummy; 
--檢視目前日期零時零分
select to_timestamp(to_char(CURRENT_TIMESTAMP,'yyyy-mm-dd')) from dummy;

--2.查找雇員的姓名及雇員的年薪
select ename,sal*12 from emp;  
--3.像oracle一樣任何含空值的數學表達式是空值:
select ename,sal*12+comm  from emp;
--4.其中||相當于把sal全部轉換成字元串
select ename||sal from emp; 
--5.表示字元串的方法
select ename||' ename' from  emp; 
--6.如果字元串中包含有' 用''替換它
select ename||''' ename' from emp; 
--7.取出emp表的前5條記錄
select top 5 * from emp; 
--8.取出emp表的全部記錄
select all * from emp; 
--9.去除兩個字段重複的資料
select distinct deptno,job from emp;
--10.取ASCII碼
SELECT ASCII('Ant') "ascii" FROM DUMMY;
           

繼續閱讀