【发布时间】:2026-02-20 05:25:01
【问题描述】:
我有一个看起来相当简单的 SQL 查询。但是,它在生产中表现不佳。任何提高性能的建议都将不胜感激。
SELECT DISTINCT CUSTOMERS.CUST_ID,
CUSTOMERS.FNAME,
CUSTOMERS.LNAME,
CUSTOMERS.CURR_STAT,
CUSTOMERS.CREATE_TIME,
CUSTOMERS.ROUTE_NBR,
FROM CUSTOMERS
INNER JOIN
INVS
ON
CUSTOMERS.CUST_ID = INVS.CUST_ID
WHERE
CUSTOMERS.ROUTE_NBR = 'A10' AND
(
CUSTOMERS.LAST_UPD_DT >= ? OR
CUSTOMERS.CURR_STAT IN ( 'PRE' , 'POST' , 'REV')
) AND
CUSTOMERS.CURR_STAT NOT IN ( 'START' , 'END' , 'REJ') AND
(
INVS.INV_CODE = 'AVL' OR
INVS.INV_CODE = 'ONORD'
)
CUSTOMERS 表的以下列上有一个索引:
- ROUTE_NBR
- CUST_ID
- CREATE_TIME
- CURR_STAT
如果索引包含 LAST_UPD_DT 列而不是 CREATE_TIME 列来反映谓词,是否会产生显着差异?还有什么可以改进的吗?谢谢。
【问题讨论】:
-
是所有四列的索引还是每列一个索引?
-
什么数据库?表格的行数是多少?
-
还有其他
CURR_STAT不在您在查询中使用的那 6 个吗? -
@JorgeCampos 有一个由这四列组成的索引。是的,CURR_STAT 还有其他几个值。
-
@ULick 数据库是 db2。大约有 400 万条客户记录和大约 200 万条库存记录。
标签: sql optimization indexing