HANA数据库常用SQL汇集

1、前言

今天准备轻松一下,列一些HANA中常用SQL。

2、详情

2.1、查找表的索引及主键信息

SELECT IFNULL(CONSTRAINT,'NUNIQUE'),
INDEX_NAME,COLUMN_NAME 
FROM INDEX_COLUMNS WHERE SCHEMA_NAME = '8EE9F72C2CE44899850DBE1986F5683B'
AND TABLE_NAME = 'ML_SHARED_ITEM' 
ORDER BY INDEX_OID,POSITION;

查询表ML_SHARED_ITEM中的索引以及主键信息:

|           |INDEX_NAME                 |COLUMN_NAME|
|-----------|---------------------------|-----------|
|PRIMARY KEY|_SYS_TREE_RS_#321809_#0_#P0|INSTANCE_ID|
|PRIMARY KEY|_SYS_TREE_RS_#321809_#0_#P0|REQUEST_ID |
|PRIMARY KEY|_SYS_TREE_RS_#321809_#0_#P0|CHANGE_ID  |

2.2、查询当前使用的SCHEMA

SELECT CURRENT_SCHEMA FROM dummy;
|CURRENT_SCHEMA                                               |
|-------------------------------------------------------------|
|8EE9F72C2CE448998*************************AV7DSJ1YCBT8Z7RU_RT|

2.3、设置当前默认的SCHEMA

设置完之后,可以避免输入长长的schema。HANA在安全性上非常苛刻,无论是shema名或是用户名,都很长(默认情况下要求)。

SET SCHEMA 8EE9F72C2CE44899850DBE198*******SJ1YCBT8Z7RU_RT;
CREATE TABLE t123(id int);

2.4、查询登录用户信息

select * from "SYS"."USERS"
where "LAST_SUCCESSFUL_CONNECT" is not null
order by 9 desc;
-- 结果
{
"select * from \"SYS\".\"USERS\"\r\nwhere \"LAST_SUCCESSFUL_CONNECT\" is not null\r\norder by 9 desc": [
    {
        "USER_NAME" : "8EE9F72C2CE44899850D*****YCBT8Z7RU_RT",
        "USER_ID" : 320825,
        "USERGROUP_NAME" : "BROKER_UG_HDISHARED",
        "USER_MODE" : "LOCAL",
        "EXTERNAL_IDENTITY" : null,
        "CREATOR" : "BROKER_PO_USER",
        "CREATE_TIME" : "2023-04-11T00:39:25.434Z",
        "VALID_FROM" : "2023-04-11T00:39:25.434Z",
        "VALID_UNTIL" : null,
        "LAST_SUCCESSFUL_CONNECT" : "2023-04-13T11:41:14.882Z",
        "LAST_INVALID_CONNECT_ATTEMPT" : null,
        "INVALID_CONNECT_ATTEMPTS" : 0,
        "ADMIN_GIVEN_PASSWORD" : "TRUE",
        "LAST_PASSWORD_CHANGE_TIME" : "2023-04-11T00:39:25.434Z",
        "PASSWORD_CHANGE_NEEDED" : "FALSE",
        "IS_PASSWORD_LIFETIME_CHECK_ENABLED" : "FALSE",
        "USER_DEACTIVATED" : "FALSE",
        "DEACTIVATION_TIME" : null,
        "IS_PASSWORD_ENABLED" : "TRUE",
        "IS_KERBEROS_ENABLED" : "FALSE",
        "IS_SAML_ENABLED" : "FALSE",
        "IS_JWT_ENABLED" : "FALSE",
        "IS_LDAP_ENABLED" : "FALSE",
        "IS_X509_ENABLED" : "FALSE",
        "IS_RESTRICTED" : "FALSE",
        "IS_RESTRICTED_DETAILS" : null,
        "IS_CLIENT_CONNECT_ENABLED" : "TRUE",
        "HAS_REMOTE_USERS" : "FALSE",
        "AUTHORIZATION_MODE" : "LOCAL",
        "COMMENTS" : null,
        "CREATE_PROVIDER_TYPE" : null,
        "CREATE_PROVIDER_NAME" : null
    }
]}

2.5、获取所有的库

select to_char(definitionfrom public.libraries 
where schema_name
='';

2.6、获取表定义

call get_object_definition(current_schema,'T123');

|SCHEMA_NAME                                                  |OBJECT_NAME|OBJECT_TYPE|OBJECT_OID|OBJECT_CREATION_STATEMENT                                                                                                               |
|-------------------------------------------------------------|-----------|-----------|----------|----------------------------------------------------------------------------------------------------------------------------------------|
|8EE9F72C2CE44899850DBE1986F5683B_BKXQ0I40HAV7DSJ1YCBT8Z7RU_RT|T123       |TABLE      |330413    |CREATE COLUMN TABLE "8EE9F72C2CE44899850DBE1986F5683B_BKXQ0I40HAV7DSJ1YCBT8Z7RU_RT"."T123" ("ID" INTEGER) UNLOAD PRIORITY 5  AUTO MERGE |

-- 同一张表T123, 如果上边你输入的是't123',看看结果是啥?
等同于'"T123"', 默认视同于大写。

ALTER TABLE schema.table ADD PRIMARY KEY (column1,column2); // 略

2.7、检查无效的视图

select * from "SYS"."VIEWS"
where schema_name not like 'SAP%' and is_valid = 'FALSE';

2.8、检查无效的对象

select * from "_SYS_REPO"."INACTIVE_OBJECT"
where "PACKAGE_ID" not like 'sap%';

2.9、检查当前用户使用的是哪种语言

select session_context('LOCALE_SAP'),
session_context('LOCALE'
from dummy;

|SESSION_CONTEXT('LOCALE_SAP')|SESSION_CONTEXT('LOCALE')|
|-----------------------------|-------------------------|
|E                            |en_US                    |


## Search executed SQL statements, 
e.g. 找出谁执行了DROP TABLE操作
select * from "SYS"."M_EXECUTED_STATEMENTS" 
where "STATEMENT_STRING" LIKE 'DROP TABLE%';

{
"select * from \"SYS\".\"M_EXECUTED_STATEMENTS\" \r\nwhere \"STATEMENT_STRING\" LIKE 'DROP TABLE%'": [
    {
        "HOST" : "8a4af3a7-19dd-4b51-b9f5-*****",
        "PORT" : 30040,
        "CONNECTION_ID" : 261446,
        "TRANSACTION_ID" : 1528,
        "UPDATE_TRANSACTION_ID" : 0,
        "STATEMENT_ID" : "1122902028586105",
        "STATEMENT_HASH" : "ea4879ef6b72ea1c03737c8745de41b8",
        "DB_USER" : "8EE9F72C2CE448*****************",
        "SCHEMA_NAME" : "8EE9F72C2CE44899850DBE198*********************",
        "APP_USER" : "Administrator",
        "CLIENT_IP" : "130.214.230.44",
        "CLIENT_PID" : 26592,
        "START_TIME" : "2023-04-13T11:52:05.066Z",
        "DURATION_MICROSEC" : 1018,
        "OBJECT_NAME" : "8EE9F72C2CE44899850DBE198*********************_RT.T123",
        "STATEMENT_STRING" : "DROP TABLE t123",
        "ERROR_CODE" : 0,
        "ERROR_TEXT" : "",
        "PASSPORT_ROOT_CONTEXT_ID" : null,
        "PASSPORT_ROOTCONTEXT_ID" : null,
        "PASSPORT_TRANSACTION_ID" : "",
        "PASSPORT_CONNECTION_ID" : "",
        "PASSPORT_CONNECTION_COUNTER" : 0,
        "PASSPORT_COMPONENT_NAME" : "",
        "PASSPORT_COMPONENT_TYPE" : 0,
        "PASSPORT_ACTION" : "",
        "PASSPORT_ACTION_TYPE" : 0,
        "PASSPORT_PREVIOUS_COMPONENT_NAME" : "",
        "PASSPORT_SERVICE" : 0,
        "PASSPORT_USER_ID" : "",
        "PASSPORT_CLIENT" : "",
        "PASSPORT_TRACE_FLAGS" : 0,
        "APPLICATION_SOURCE" : "",
        "APPLICATION_NAME" : "DBeaver 22.3.1 - SQLEditor "
    }
]}
-- 内容很详细

2.10、查询global.ini and indexserver.ini 中的自定义设置

select * from "SYS"."M_INIFILE_CONTENTS"
where ("LAYER_NAME" = 'SYSTEM' or "HOST" <> ''
and ("FILE_NAME" = 'global.ini' 
or "FILE_NAME" = 'indexserver.ini');

这个得用dbadmin用户,有权限才行。不然可能都查不到结果。

2.11、查询权限角色相关

1、查询用户得到的角色

select * from "SYS"."GRANTED_ROLES"
where "GRANTEE_TYPE" = 'USER';
|GRANTEE                                                      |GRANTEE_TYPE|ROLE_SCHEMA_NAME|ROLE_NAME         |
|
-------------------------------------------------------------|------------|----------------|------------------|
|8EE9F72C2CE4489985*********YCBT8Z7RU_RT|USER        |                |PUBLIC            |
|
8EE9F72C2CE4489985*********YCBT8Z7RU_RT|USER        |BROKER_USER     |STUDIO_ACCESS_ROLE|
|8EE9F72C2CE4489985*********YCBT8Z7RU_RT|USER        |BROKER_USER     |ODATA_ACCESS_ROLE |
|
8EE9F72C2CE4489985*********YCBT8Z7RU_RT|USER        |BROKER_USER     |CDS_ACCESS_ROLE   |

2、查询得到的仓库(rep)的权限

select * from "SYS"."GRANTED_PRIVILEGES"
where object_type = 'REPO';

3、查询非系统用户拥有的对象

select SCHEMA_NAME ,OWNER_NAME , OBJECT_NAME , OBJECT_TYPE  from "SYS"."OWNERSHIP"
where owner_name not like 'SAP%' and owner_name not like '%SYS%'
order by 1,2;

|SCHEMA_NAME                     |OWNER_NAME                         |OBJECT_NAME                     |OBJECT_TYPE|
|--------------------------------|-----------------------------------|--------------------------------|-----------|
|8EE9F72C2CE44899850DBE1986F5683B|8EE9F72C2CE44899850DBE1986F5683B#OO|_SYS_TREE_RS_#323715_#0_#P0     |INDEX      |
|8EE9F72C2CE44899850DBE1986F5683B|8EE9F72C2CE44899850DBE1986F5683B#OO|IDX_MAPP_TEN_CONT_BV            |INDEX      |
|8EE9F72C2CE44899850DBE1986F5683B|8EE9F72C2CE44899850DBE1986F5683B#OO|IDX_MAPP_TEN_CONUUID            |INDEX      |

2.12、获取引用一个schema的表

SELECT BASE_SCHEMA_NAME, BASE_OBJECT_NAME,DEPENDENT_SCHEMA_NAME,
DEPENDENT_OBJECT_NAME,DEPENDENT_OBJECT_TYPE
FROM "SYS"."OBJECT_DEPENDENCIES"
WHERE BASE_SCHEMA_NAME = 'TCMP' /* <== Schema Name */
AND BASE_OBJECT_NAME = 'CS_SALESORDER' /* <== Table Name */

2.13、分析SQL语句并TRACE

select
to_varchar("STATEMENT_START_TIME",'DD.MM.YYYY'"EXEC_DATE",
to_varchar("STATEMENT_START_TIME",'HH24:MI:SS'"EXEC_TIME",
to_int("DURATION_MICROSEC"/1000000"DURATION_S",
to_decimal("MEMORY_SIZE"/1073741824,10,1"MEM_GB",
"RECORDS",
"DB_USER",
"APP_USER",
"APPLICATION_NAME",
"STATEMENT_STRING",
length("STATEMENT_STRING""SQL_LENGTH",
OCCURRENCES_REGEXPR('JOIN' FLAG 'i' IN "STATEMENT_STRING""JOIN",
OCCURRENCES_REGEXPR('CASE' FLAG 'i' IN "STATEMENT_STRING""DISTINCT",
"ERROR_TEXT",
"PARAMETERS"
from "SYS"."M_EXPENSIVE_STATEMENTS"
where "OPERATION" in 
('INSERT','SELECT','AGGREGATED_EXECUTION') –exclude background activity
and "RECORDS" > 0
and to_varchar("STATEMENT_START_TIME"'YYYYMMDD') = current_date
and to_int(to_varchar("STATEMENT_START_TIME",'HH24′)) 
between 8 and 17 –business hours
order by 3 desc;

2.14、空间大小相关

1、回收存储空间

 ALTER SYSTEM RECLAIM DATAVOLUME 105 DEFRAGMENT.

2、列列表内存总和

select round(sum(MEMORY_SIZE_IN_TOTAL)/1024/1024as "Column Tables MB Used" from M_CS_TABLE

3、列列表内存占用

SELECT table_name, memory_size_in_total FROM M_CS_TABLES ORDER BY memory_size_in_total DESC;

4、各个行表的内存占用

SELECT table_name, (USED_FIXED_PART_SIZE + USED_VARIABLE_PART_SIZE) AS disk_size FROM M_RS_TABLES ORDER BY disk_size DESC;

5、行表内存总和

select round(sum(USED_FIXED_PART_SIZE + USED_VARIABLE_PART_SIZE)/1024/1024as "Row Tables MB Used" from M_RS_TABLES;

6、所有表占用磁盘总和

SELECT SUM(disk_size)/1024/1024/1024 FROM m_table_persistence_statistics;

7、各个表的磁盘占用情况

SELECT table_name, disk_size FROM m_table_persistence_statistics ORDER BY disk_size DESC;

2.15、开发过程中常用的一些语句示例

SELECT SESSION_USER "session user" FROM DUMMY;  //会话用户

SELECT TO_DATE('2010-01-12''YYYY-MM-DD'"to date" 
FROM DUMMY;

SELECT DAYS_BETWEEN (TO_DATE ('2009-12-05''YYYY-MM-DD'), TO_DATE('2010-01-05''YYYY-MM-DD')) "days between" FROM DUMMY;

SELECT CURRENT_DATE "current date" FROM DUMMY;
SELECT ISOWEEK (TO_DATE('2011-05-30''YYYY-MM-DD')) "isoweek" FROM DUMMY;
SELECT DAYNAME ('2011-05-30'"dayname" FROM DUMMY;
SELECT WEEK ('2017-01-02'FROM DUMMY; SELECT LENGTH ('length in char'"length" FROM DUMMY; 

SELECT WEEKDAY (TO_DATE ('2010-12-31''YYYY-MM-DD')) "week day" FROM DUMMY; 
SELECT DAYOFYEAR ('2021-05-30'"dayofyear" FROM DUMMY;

SELECT YEARS_BETWEEN(TO_DATE('2001-01-01'), TO_DATE('2003-03-14')) "years_between" FROM DUMMY; 

SELECT YEAR (TO_DATE ('2011-05-30''YYYY-MM-DD')) "year" FROM DUMMY; 

SELECT MONTH ('2011-05-30'"month" FROM DUMMY; SELECT NOW () "now" FROM DUMMY;

 SELECT LAST_DAY (TO_DATE('2010-01-04''YYYY-MM-DD')) "last day" FROM DUMMY;
SELECT SUBSTRING ('1234567890',4,2"substring" FROM DUMMY; 
SELECT TO_VARCHAR (TO_DATE('2009-12-31'), 'YYYY/MM/DD'"to varchar" FROM DUMMY; 

SELECT TRIM ('a' FROM 'aaa123456789aa'"trim both" FROM DUMMY;
SELECT REPLACE ('DOWNGRADE DOWNWARD','DOWN''UP'"replace" FROM DUMMY;
SELECT RTRIM ('endabAabbabab','ab'"rtrim" FROM DUMMY; 
SELECT RIGHT('HI0123456789'20"right" FROM DUMMY;

SELECT UPPER ('Ant'"uppercase" FROM DUMMY; 
SELECT CONCAT ('C''at'"concat" FROM DUMMY; 

SELECT FLOOR (14.5"floor" FROM DUMMY; 
SELECT TO_DECIMAL(7654321.888888103"to decimal" FROM DUMMY; 
SELECT LANGUAGE(CONTENTFROM TABLE;

Windows函数

SELECT ProdName, Type, Sales,
RANK() OVER ( PARTITION BY ProdName ORDER BY Sales DESC ) AS Rank
FROM ProductSales
ORDER BY ProdName, Type;

建表示例:

SET SCHEMA "SAPABC"
CREATE TABLE MY_DATES (FCID NVARCHAR(2), STARTDATE DATE, ENDDATE DATE); 
INSERT INTO MY_DATES VALUES ('01''2014-01-01''2014-02-14'); 
INSERT INTO MY_DATES VALUES ('01''2014-04-01''2014-05-14'); 
INSERT INTO MY_DATES VALUES ('01''2014-07-01''2014-08-05'); 
INSERT INTO MY_DATES VALUES ('01''2014-10-01''2014-10-30'); 
SELECT WORKDAYS_BETWEEN(FCID, STARTDATE, ENDDATE) "production duration" 
FROM MY_DATES;

Json的:

SELECT JSON_VALUE('{"item1":10}''$.item1'AS "value" FROM DUMMY;

简单的函数:

CREATE FUNCTION func_add_mul(x Double, y Double
RETURNS result_add Double, result_mul Double 
LANGUAGE SQLSCRIPT READS SQL DATA AS
BEGIN
result_add := :x + :y;
result_mul := :x * :y;
END;

结束语

今天一位朋友建议我把内存那块儿,捡重点再展开来说一说,建议非常好,后边争取花些时间整理出来。


请使用浏览器的分享功能分享到微信等