Open MondayLiu opened 3 years ago
Hi, All: The execution result on psql(The difference is one more line:SET sql_mode='ANSI_QUOTES'):
2021-06-10T02:51:53.779657Z 70 Query SET sql_mode='ANSI_QUOTES'
2021-06-10T02:51:53.779950Z 70 Query SET sql_mode='ANSI_QUOTES'
2021-06-10T02:51:53.780240Z 70 Prepare SELECT `ac_date`, `ac_no`, `ccy`, `qualifier`, `dep` FROM `ocbs387`.`view_ddtinto_current2` WHERE (`qualifier` IN ('A', 'C')) AND ((`ac_date` >= 20210401)) AND ((`ac_date` <= 20210531)) AND ((`ac_no` = '403065121762')) AND ((`ccy` = 'USD'))
2021-06-10T02:51:53.780892Z 70 Close stmt
2021-06-10T02:51:53.781093Z 70 Query SET sql_mode='ANSI_QUOTES'
2021-06-10T02:51:53.781404Z 70 Prepare SELECT `ac_date`, `ac_no`, `ccy`, `qualifier`, `dep` FROM `ocbs387`.`view_ddtinto_current2` WHERE (`qualifier` IN ('A', 'C')) AND ((`ac_date` >= 20210401)) AND ((`ac_date` <= 20210531)) AND ((`ac_no` = '403065121762')) AND ((`ccy` = 'USD'))
2021-06-10T02:51:53.781766Z 70 Close stmt
2021-06-10T02:51:53.781848Z 70 Query SET sql_mode='ANSI_QUOTES'
2021-06-10T02:51:53.781996Z 70 Prepare SELECT `ac_date`, `ac_no`, `ccy`, `qualifier`, `dep` FROM `ocbs387`.`view_ddtinto_current2` WHERE (`qualifier` IN ('A', 'C')) AND ((`ac_date` >= 20210401)) AND ((`ac_date` <= 20210531)) AND ((`ac_no` = '403065121762')) AND ((`ccy` = 'USD'))
2021-06-10T02:51:53.782232Z 70 Close stmt
2021-06-10T02:51:53.782303Z 70 Query SET sql_mode='ANSI_QUOTES'
2021-06-10T02:51:53.782434Z 70 Prepare SELECT `ac_date`, `ac_no`, `ccy`, `qualifier`, `dep` FROM `ocbs387`.`view_ddtinto_current2` WHERE (`qualifier` IN ('A', 'C')) AND ((`ac_date` >= 20210401)) AND ((`ac_date` <= 20210531)) AND ((`ac_no` = '403065121762')) AND ((`ccy` = 'USD'))
2021-06-10T02:51:53.782655Z 70 Close stmt
2021-06-10T02:51:53.782722Z 70 Query SET sql_mode='ANSI_QUOTES'
2021-06-10T02:51:53.782850Z 70 Prepare SELECT `ac_date`, `ac_no`, `ccy`, `qualifier`, `dep` FROM `ocbs387`.`view_ddtinto_current2` WHERE (`qualifier` IN ('A', 'C')) AND ((`ac_date` >= 20210401)) AND ((`ac_date` <= 20210531)) AND ((`ac_no` = '403065121762')) AND ((`ccy` = 'USD'))
2021-06-10T02:51:53.783067Z 70 Close stmt
2021-06-10T02:51:53.783133Z 70 Query SET sql_mode='ANSI_QUOTES'
2021-06-10T02:51:53.783259Z 70 Prepare SELECT `ac_date`, `ac_no`, `ccy`, `qualifier`, `dep` FROM `ocbs387`.`view_ddtinto_current2` WHERE (`qualifier` IN ('A', 'C')) AND ((`ac_date` >= 20210401)) AND ((`ac_date` <= 20210531)) AND ((`ac_no` = '403065121762')) AND ((`ccy` = 'USD'))
2021-06-10T02:51:53.783476Z 70 Close stmt
2021-06-10T02:51:53.783544Z 70 Query SET sql_mode='ANSI_QUOTES'
2021-06-10T02:51:53.783725Z 70 Prepare SELECT `ac_date`, `ac_no`, `ccy`, `qualifier`, `dep` FROM `ocbs387`.`view_ddtinto_current2` WHERE (`qualifier` IN ('A', 'C')) AND ((`ac_date` >= 20210401)) AND ((`ac_date` <= 20210531)) AND ((`ac_no` = '403065121762')) AND ((`ccy` = 'USD'))
2021-06-10T02:51:53.784068Z 70 Close stmt
2021-06-10T02:51:53.784144Z 70 Query SET sql_mode='ANSI_QUOTES'
2021-06-10T02:51:53.784419Z 70 Prepare SELECT `ac_date`, `ac_no`, `ccy`, `qualifier`, `dep` FROM `ocbs387`.`view_ddtinto_current2` WHERE (`qualifier` IN ('A', 'C')) AND ((`ac_date` >= 20210401)) AND ((`ac_date` <= 20210531)) AND ((`ac_no` = '403065121762')) AND ((`ccy` = 'USD'))
2021-06-10T02:51:53.784970Z 70 Close stmt
2021-06-10T02:51:53.785172Z 70 Query SET sql_mode='ANSI_QUOTES'
2021-06-10T02:51:53.785326Z 70 Prepare SELECT `ac_date`, `ac_no`, `ccy`, `qualifier`, `dep` FROM `ocbs387`.`view_ddtinto_current2` WHERE (`qualifier` IN ('A', 'C')) AND ((`ac_date` >= 20210401)) AND ((`ac_date` <= 20210531)) AND ((`ac_no` = '403065121762')) AND ((`ccy` = 'USD'))
2021-06-10T02:51:53.785554Z 70 Close stmt
2021-06-10T02:51:53.785645Z 70 Query SET sql_mode='ANSI_QUOTES'
2021-06-10T02:51:53.785791Z 70 Prepare SELECT `ac_date`, `ac_no`, `ccy`, `qualifier`, `dep` FROM `ocbs387`.`view_ddtinto_current2` WHERE (`qualifier` IN ('A', 'C')) AND ((`ac_date` >= 20210401)) AND ((`ac_date` <= 20210531)) AND ((`ac_no` = '403065121762')) AND ((`ccy` = 'USD'))
2021-06-10T02:51:53.786008Z 70 Close stmt
Why is there an extra line of command in the application request?
Hi, Finally I found some clues.
Question: But I still can't understand why using a placeholders leads to WHERE clause partial pushdown ?
-- Original code
SELECT TRIM(AC_NO) AC_NO
, TRIM(CCY) CCY
, AC_DATE
, DEP
, QUALIFIER
FROM DDTINTO2
WHERE QUALIFIER IN ('A', 'C')
and AC_NO = #{acNo}
and CCY = #{ccy}
and AC_DATE >= #{startDate}
and AC_DATE <= #{endDate}
ORDER BY AC_DATE DESC
limit #{limitSize}
-- New Code
SELECT TRIM(AC_NO) AC_NO
, TRIM(CCY) CCY
, AC_DATE
, DEP
, QUALIFIER
FROM DDTINTO2
WHERE QUALIFIER IN ('A', 'C')
and AC_NO = '${acNo}'
and CCY = '${ccy}'
and AC_DATE >= ${startDate}
and AC_DATE <= ${endDate}
ORDER BY AC_DATE DESC
limit ${limitSize}
Thanks and Regards Monday
Hi @MondayLiu,
Thanks for providing the test case. I am able to reproduce the issue with a simple java program which uses the PreparedStatement. So, basically for the first 9 executions planner is choosing the custom plan and hence we could see exact values instead of parameters. After that planner is choosing the generic plan and hence we could see parameters instead of exact values. In case of a generic plan, if WHERE condition clause is comparing between char/varchar columns and parameters (for e.g: ac_no = $3) then those clauses are not pushing down to the MySQL remote server. I am still looking for the reason for this behavior and will update you if I find any.
Postgres has "plan_cache_mode" GUC which controls whether prepared statements can be executed using custom or generic plans. You can set it to "force_custom_plan" if you want a custom plan always which will push down complete where clause on remote server. Refer below link: https://www.postgresql.org/docs/12/runtime-config-query.html#RUNTIME-CONFIG-QUERY-OTHER
Regards, Suraj Kharage
Hi, @surajkharage19 ,
Thank you for your advice. I'll be looking forward to your 'update'!
Thanks and Regards Monday Liu
Hi, All: I'm running in JavaWeb Project , WHERE clause become partial push-down after 9 queries.
Steps for reproduce:
1. PG11.5&MySQL_FDW2.5.5&MySQL5.7.21
2. DDL (database diagram)
3.DML
4. Java web project github 4.1 project environment
5. Reproduce 5.1 Cannot be reproduce when execute the query(with exact values) on psql. 5.2 Request this GET request ten times : GET REQUEST 5.3 MySQL Slow query log(Pay special attention to the 10th query)