永发信息网

Mybatis 执行sql

答案:1  悬赏:60  手机版
解决时间 2021-01-31 13:22
-- 定义自增变量
SET @i = -1;
-- 创建指定日期间记录数天数需要 加 1
SET @SQL = REPEAT(" select 1 union all",-DATEDIFF('2015-06-22','2015-06-22')+1);
-- 将最后一个union all 去掉,这里前边加1个空格,就不用在减1了
SET @SQL = LEFt(@SQL,LENGTH(@SQL)-LENGTH(" union all"));
-- 拼接sql
SET @SQL = CONCAt("

select t5.date as currentDate,count(t5.title) as plugMsgCount from(
select t.*,t1.title from (select date_add('2015-06-22',interval @i:=@i+1 day) as date from (",@SQL,") as tmp ) t
left join plug_sign t1 on t1.start_date < t.date and t1.end_date > t.date and t1.user_id = 1589 AND t1.is_del <> '-1'
) t5 group by t5.date
");

PREPARE stmt FROM @SQL;
EXECUTE stmt;

请问在Mybatis 如何才能执行上面的sql

这是打印的日志
2015-07-13 15:43:50,419 DEBUG [org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.logTranslation(397)] -### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SET @SQL = REPEAT(" select 1 union all",-DATEDIFF('2015-06-13','2015-07-13')+1);' at line 2
最佳答案
oracle 10g的DBMS_XPLAN包中display_cursor函数不同于display函数,display_cursor用于显示SQL语句的真实的执行计划,在大多数情况下,
显示真实的执行计划有助于更好的分析SQL语句的全过程,尤其是运行此SQL语句实时的I/O开销。通过对比预估的I/O与真实的I/O开销来判断
SQL语句所存在问题,如缺少统计信息,SQL语句执行的次数,根据实际中间结果集的大小来选择合适的连接方式等。本文仅仅讲述
display_cursor函数的使用。

一、display_cursor函数用法
1、display_cursor函数语法

DBMS_XPLAN.DISPLAY_CURSOR(
sql_id IN VARCHAR2 DEFAULT NULL,
cursor_child_no IN NUMBER DEFAULT NULL,
format IN VARCHAR2 DEFAULT 'TYPICAL');

2、display_cursor函数参数描述
sql_id
指定位于库缓存执行计划中SQL语句的父游标。默认值为null。当使用默认值时当前会话的最后一条SQL语句的执行计划将被返回
可以通过查询V$SQL 或V$SQLAREA的SQL_ID列来获得SQL语句的SQL_ID。
cursor_child_no
指定父游标下子游标的序号。即指定被返回执行计划的SQL语句的子游标。默认值为0。如果为null,则sql_id所指父游标下所有子游标
的执行计划都将被返回。
format
控制SQL语句执行计划的输出部分,即哪些可以显示哪些不显示。使用与display函数的format参数与修饰符在这里同样适用。
除此之外当在开启statistics_level=all时或使用gather_plan_statistics提示可以获得执行计划中实时的统计信息
有关详细的format格式描述请参考:dbms_xplan之display函数的使用 中format参数的描述

下面给出启用统计信息时format新增的修饰符
iostats 控制I/O统计的显示
last 默认,显示所有执行计算过的统计。如果指定该值,则只显示最后一次执行的统计信息
memstats 控制pga相关统计的显示
allstats 此为iostats memstats的快捷方式,即allstats包含了iostats和memstats
run_stats_last 等同于iostats last。只能用于oracle 10g R1
run_stats_tot 等同于iostats。只能用于oracle 10g R1

抓一个最近一小时最消耗IO的SQL:
SELECt sql_id, COUNT(*)
FROM gv$active_session_history ash, gv$event_name evt
WHERe ash.sample_time > SYSDATE - 1 / 24
AND ash.session_state = 'WAITING'
AND ash.event_id = evt.event_id
AND evt.wait_class = 'User I/O'
GROUP BY sql_id
ORDER BY COUNT(*) DESC;

执行上面的SQL:
SQL> SELECt sql_id, COUNT(*)
FROM gv$active_session_history ash, gv$event_name evt
2 3 WHERe ash.sample_time > SYSDATE - 1 / 24
4 AND ash.session_state = 'WAITING'
5 AND ash.event_id = evt.event_id
6 AND evt.wait_class = 'User I/O'
7 GROUP BY sql_id
8 ORDER BY COUNT(*) DESC;

SQL_ID COUNT(*)
------------- ----------
g7fu6qba82m6b 668
63r47zyphdk06 526
9f5m4wd88nc1h 514
593p47drw5fhk 232
br91w16jzy4fu 120
4fvwyjpnh6tp7 78
gm0nrbfuj8kzr 70
2184k363hw4xd 68
gc4dajs7g5myy 46
8vrk9sfuwfdgq 42
ccpnb4dwdmq21 40

查看SQL的执行计划:
SELECt * FROM TABLE(dbms_xplan.display_cursor('g7fu6qba82m6b'));

在SQLPLUS中执行:
SQL> set pagesize 2000
SQL> SELECt * FROM TABLE(dbms_xplan.display_cursor('g7fu6qba82m6b'));

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------
SQL_ID g7fu6qba82m6b, child number 0
-------------------------------------
UPDATE "CPDDS_PDATA"."CDM_LEDGER" SET "CSTM_NAME" = :a1,"CSTM_NO" =
:a2,"PAPER_TYPE" = :a3,"PAPER_NO" = :a4,"CURR_TYPE" = :a5,"SVT_NO" =
:a6,"BAL_DIR" = :a7,"BAL" = :a8,"AVAL_BAL" = :a9,"NORM_FRATIO" =
:a10,"PK_BAL" = :a11,"DR_ACCU" = :a12,"CR_ACCU" = :a13,"LAST_TRAN_DATE" =
:a14,"LAST_TRAN_TIME" = :a15,"PRT_LINE_NUM" = :a16,"NOREG_PK_REC_NUM" =
:a17,"PK_NO" = :a18,"PWD" = :a19,"FLAG" = :a20,"FRZ_FLAG" =
:a21,"CARD_HOLD_FLAG" = :a22,"PK_HOLD_FLAG" = :a23,"BGN_INT_DATE" =
:a24,"OPEN_DATE" = :a25,"ACC_HOLD_FLAG" = :a26,"CLS_DATE" =
:a27,"OPEN_TLR" = :a28,"CLS_TLR" = :a29,"CLS_INT" = :a30,"OPEN_INST" =
:a31,"ADD_NUM" = :a32,"DAC" = :a33,"FRZ_TIMES1" = :a34,"FRZ_TIMES2" =
:a35,"HOST_SEQNO" = :a36,"D_UPDATE_DATE" = :a37 WHERe "ACC" = :b0

Plan hash value: 319441092

-----------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------
| 0 | UPDATE STATEMENT | | | | 3 (100)| |
| 1 | UPDATE | CDM_LEDGER | | | | |
|* 2 | INDEX UNIQUE SCAN| I_CDM_LEDGER | 1 | 269 | 2 (0)| 00:00:01 |
-----------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

2 - access("ACC"=:B0)

29 rows selected.

总结
1、与display函数不同,display_cursor显示的为真实的执行计划
2、对于format参数,使用与display函数的各个值,同样适用于display_cursor函数
3、当statistics_level为all或使用gather_plan_statistics提示可以获得执行时的统计信息
4、根据真实与预估的统计信息可以初步判断SQL效率低下的原因,如统计信息的准确性、主要的开销位于那些步骤等
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
百家讲坛那一级讲刘姓的啊!
百立电玩城地址在什么地方,我要处理点事
三星手机s7 edge相册在哪
求一部电影,一个咖啡屋后来进来一个人然后一
荒诞离奇的意思
时代嘉年华动漫城地址在什么地方,我要处理点
天龙八部 黄纸
【dress的复数是什么?】
5D动感立体影院地址在什么地方,我要处理点事
形容人不忠不孝的成语
【催人奋进的文章】一本催人奋进的书作文
是不是只有唱吧会员才能录合唱mv
本田飞度两厢自动挡起步加油左前有响声
贝酷5D影院地址有知道的么?有点事想过去
单身比结了婚有什么好处?
推荐资讯
对心理测验的理解正确的是()。A.心理测验的作
《狼图腾》的作者是少数民族吗?
【墨守成规的故事】历史上因为墨守陈规而遭受
蒸鸡蛋里能放果汁吗
欧曼6.8米高栏报价180马力多少钱如题 谢谢了
2013年12月27日,我国南极科考船“雪龙号”因
有什么软件可以拼心
克拉玛依的雪有多大??
耐克板鞋染上颜色怎么弄掉?
台安聚宾楼招待所地址有知道的么?有点事想过
美国航空公司也就是AA从上海飞到美国,飞机上
化工建设项目经济评价数据的计算
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?