hints不生效问题

【 TiDB 使用环境】测试环境
【 TiDB 版本】7.1.1
【复现路径】大sql查询
【遇到的问题:我在sql里加了hint,让表A走kv引擎。但是没生效果。是什么原因呢?
EXPLAIN
SELECT

/*+ read_from_storage(tikv[tb_uhome_pay_log]) */
CONCAT(IFNULL(DATE_FORMAT(B.bill_date_start, '%Y-%m-%d'), ''), '~', IFNULL(DATE_FORMAT(B.bill_date_end, '%Y-%m-%d'), '')) AS realCycleStartAndEnd,
A.COMMUNITY_ID AS communityId,
A.PAY_CYCLE AS payCycle,
DATE_FORMAT(A.PAY_DATE, '%Y-%m-%d') AS payDate,
DATE_FORMAT(A.CREATED_DATE, '%Y-%m-%d') AS createDate,
DATE_FORMAT(A.CREATED_DATE, '%Y-%m-%d %H:%m:%s') AS operateTime,
S.STAGE_ID AS stageId,
S.STAGE_NAME AS stageName,
H.NAME AS buildName,
H.BUILD_ID AS buildId,
B.HOUSE_ID AS houseId,
C.unit_id AS unitId,
C.UNIT AS unitName,
B.HOUSE_NAME AS houseName,
B.CUST_ID AS custId,
IFNULL(B.CUST_NAME, '业主') AS custName,
E.E_CUST_CODE AS custCode,
IF(B.receivable_date = 0 OR B.receivable_date IS NULL, '', B.receivable_date) AS receivableDate,
	B.benefactor_id AS donorId,
	IFNULL(df.donor_name, '') AS donorName,
	A.PAY_METHOD AS payMethod,
	D. `NAME` AS payMethodName,
	B.BILLING_CYCLE AS billingCycle,
	B.REAL_CYCLE AS realCycle,
	B.FEE_ITEM_TYPE_ID AS feeItemTypeId,
	B.FEE_ITEM_TYPE_NAME AS feeItemTypeName,
	B.bill_rule_name AS billRuleName,
	C.acct_house_code AS houseCode,
	SUM(B.FEE) AS fee,
	SUM(B.LFREE) AS lfree,
	SUM(B.FEE) + SUM(B.LFREE) AS totalFee,
	SUM(ROUND(B.TAX_FEE, 0)) + SUM(ROUND(B.LFREE_TAX_FEE, 0)) AS taxFee,
	ROUND(SUM(B.inv_tax_fee) + SUM(B.inv_lfree_tax_fee), 0) AS invTaxFee,
	ROUND(SUM(B.FACTORAGE), 0) AS factorage,
	B.lfree_tax_rate AS lfreeTaxRate,
	SUM(ROUND(B.lfree_tax_fee, 0)) AS lfreeTaxFee,
	SUM(ROUND(B.inv_lfree_tax_fee, 0)) AS invLfreeTaxFee,
	ROUND(SUM(B.LFREE) - SUM(B.lfree_tax_fee)) AS lfreeNotTaxFee,
	ROUND(SUM(B.LFREE) - SUM(B.inv_lfree_tax_fee)) AS invLfreeNotTaxFee,
	ROUND(SUM(B.FEE) - SUM(B.TAX_FEE)) AS totalNotTaxFee,
	ROUND(SUM(B.FEE) - SUM(B.inv_tax_fee)) AS invTotalNotTaxFee,
	SUM(ROUND(B.TAX_FEE, 0)) AS taxNotLfee,
	SUM(ROUND(B.inv_tax_fee, 0)) AS invTaxNotLfee,
	A.EMPEE_ID AS empeeId,
	U. `NAME` AS empeeName,
	A.payee_name AS payeeName,
	A.TRANSACTION_NO AS transactionNo,
	B.TICKET_CODE AS ticketCode,
	A.PAY_SERIAL_NBR AS paySerialNbr,
	A.REMARK AS remark,
	A.PAYMENT_NAME AS paymentName,
	if(B.balance_type = 3, '现金账本', '赠送账本') AS balanceType,
		B.res_inst_name AS resInstName,
		B.res_inst_code AS resInstCode,
		B.tax_rate AS taxRate,
		B.HOUSE_STATUS_TYPE AS houseStatusType,
		B.HOUSE_STATUS AS houseStatus,
		IF(pt1.category_code = 50, pt1.type_name, '') AS houseStatusName,
			IF(pt2.category_code = 40, pt2.type_name, '') AS houseStatusTypeName,
				X.invoice_number1 AS invoiceNumber,
				CONCAT_WS(',', x.invoice_number2, x.src_invoice_number) AS originalInvoiceNumber,
				B.BILL_AREA AS billArea,
				B.obj_code AS contractNumber,
				cst.first_name AS firstName,
				cst.first_bus_name AS firstBusName,
				CASE WHEN A.organ_bank_name = '' OR A.organ_bank_account = '' THEN
					''
				ELSE
					CONCAT(A.organ_bank_name, '-', A.organ_bank_account)
				END AS organBankAccount,
				COUNT(DISTINCT (
						CASE WHEN b.house_id IS NOT NULL
							AND b.house_id > 0 THEN
							b.house_Id
						END)) houseCount,
				C.inner_Area AS innerArea,
				B.belong_res_type AS belongResType,
				B.belong_res_id AS belongResId,
				if(B.belong_res_type = 2, B.belong_res_name, '') AS parkingName
					
				FROM
					tb_uhome_pay_log A
					INNER JOIN tb_uhome_pay_log_detail B ON A.PAY_SERIAL_NBR = B.PAY_SERIAL_NBR
					LEFT JOIN bill_contract_inst cst ON B.obj_type = 8 AND B.obj_id = cst.contract_id AND cst.contract_id > 0
					LEFT JOIN TB_UHOME_DICTIONARY D ON D. `CODE` = 'PAY_LOG_PAY_METHOD' AND D. `VALUE` = A.PAY_METHOD
				LEFT JOIN TB_UHOME_HOUSE C ON B.HOUSE_ID = C.HOUSE_ID
				LEFT JOIN TB_UHOME_BUILD H ON C.BUILD_ID = H.BUILD_ID
				LEFT JOIN TB_UHOME_STAGE S ON S.STAGE_ID = H.STAGE_ID
				LEFT JOIN CUSTOMER E ON E.CUST_ID = B.CUST_ID
				LEFT JOIN bill_donor_file df ON df.donor_id = B.benefactor_id
				LEFT JOIN TB_UHOME_FEE_ITEM_TYPE F ON F.FEE_ITEM_TYPE_ID = B.FEE_ITEM_TYPE_ID
				LEFT JOIN TB_UHOME_ADMIN_USER U ON U.USER_ID = A.EMPEE_ID
				LEFT JOIN (
				SELECT
					category_code,
					type_code,
					type_name
				FROM
					v_profession_type) pt1 ON pt1.type_code = B.house_status
				LEFT JOIN (
				SELECT
					category_code,
					type_code,
					type_name
				FROM
					v_profession_type) pt2 ON pt2.type_code = B.house_status_type
				LEFT JOIN (
				SELECT
					X1.pay_detail_id,
					GROUP_CONCAT(DISTINCT IF(X2.invoice_status IN(10, 11), X2.invoice_number, NULL)) AS invoice_number1,
					GROUP_CONCAT(DISTINCT IF(X2.invoice_status IN(20, 21, 22), X2.invoice_number, NULL)) AS invoice_number2,
					GROUP_CONCAT(DISTINCT IF(X2.invoice_status IN(20, 21, 22), X2.src_invoice_number, NULL)) AS src_invoice_number
				FROM
					bill_invoice_log_detail X1,
					bill_invoice_log X2
				WHERE
					X1.invoice_id = X2.invoice_id AND X2.ORGAN_ID = 13931131 AND X2.invoice_status IN(10, 11, 20, 21, 22)
				GROUP BY
					X1.pay_detail_id) X ON X.pay_detail_id = B.pay_detail_id
					
			   where A.COMMUNITY_ID = 13931131 AND A.PAY_DATE >= '2023-01-01 00:00:00' AND A.PAY_DATE <= '2023-09-04 23:59:59' AND A.pay_method NOT IN(14, 98) AND A.state NOT in('COR', 'AOK')
			GROUP BY
				communityId,
				stageId,
				buildName,
				unitName,
				houseName,
				houseCode,
				billArea,
				innerArea,
				custId,
				donorId,
				billingCycle,
				feeItemTypeId,
				billRuleName,
				payMethod,
				payCycle,
				payDate,
				createDate,
				paymentName,
				empeeId,
				payeeName,
				ticketCode,
				transactionNo,
				resInstName,
				paySerialNbr,
				invoiceNumber,
				houseStatusType,
				houseStatus,
				realCycle,
				realCycleStartAndEnd,
				contractNumber,
				firstName,
				firstBusName,
				organBankAccount,
				originalInvoiceNumber,
				custCode,
				receivableDate,
				parkingName,
				taxRate
			LIMIT 50;

分析结果:全是走了tiflash

【资源配置】3台8核,16G

1、 MySQL 命令行客户端在 5.7.7 版本之前默认清除了 Optimizer Hints。如果需要在这些早期版本的客户端中使用 Hint 语法,需要在启动客户端时加上 --comments 选项。
2、用Set tidb_isolation_read_engines='tidb,tikv’ 用这个变量测试下
3、 show variables like ‘tidb_capture_plan_baselines’ 看下这个变量值


目前是关闭的。跟它有关系吗

执行sql 有 warning吗?如果有的话 show warning 看下具体是什么呢?

感谢帮助哈。我把这两个同时打开的时候,它可能按hint去走了。但是如果我把它强制mpp的关掉。优化器全部走的是mpp。然后比较好奇。走kv索引竟然没有mpp的快。都没有信心能搞定这种复杂sql的性能了

主要还是要看你扫数据量具体有多少,走 kv 索引 如果扫的数据量特别大的情况下,没有走tiflash mpp 效率高是预期现象,本身kv就更偏向点查以及小数据量的索引范围扫,tiflash 则是更偏向ap类的全表扫

我上面贴的sql最每个表有一个亿左右。最大的B表有3个亿。每个表都根据sql查询创建了索引。也差不多按预期的走索引。但是我发现在root层和kv层之间来回切换的计算变得比用MPP还慢。这个情况。不知道是不是部署拓扑有没有关。目前db-server是跟kv-server部署在同机器上的

索引扫描回表时都会先把索引记录返回tidb然后再去tikv扫描表将数据返回tidb后,在和另一个表关联

这个你可以把走tikv 和 走 tiflash 的执行计划都发出来看下,看下索引扫描的具体扫描数据量和回表多少

内存动不动就爆。我先清点数据量。几个T的数据可能有点大了。对于目前的环境配置

此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。