【发布时间】:2010-04-24 05:03:05
【问题描述】:
我有一个 100 万行的事务表。该表有一个字段名称“代码”来保存客户的 ID。大约有 10,000 个不同的客户代码。
我有一个 GUI 界面允许用户从事务表中呈现报告。用户可以选择任意数量的客户进行渲染。
我首先使用 IN 运算符,它适用于少数客户:
SELECT * FROM TRANS_TABLE WHERE CODE IN ('...', '...', '...')
如果我选择几千名客户,我很快就会遇到问题。使用 IN 运算符有限制。
另一种方法是创建一个只有一个 CODE 字段的临时表,并使用 INSERT 语句将选定的客户代码注入到临时表中。然后我可以使用
SELECT A.* FROM TRANS_TABLE A INNER JOIN TEMP B ON (A.CODE=B.CODE)
这适用于大量选择。但是,临时表的创建、INSERT 注入和临时表的删除都会产生性能开销。
您知道处理这种情况的更好解决方案吗?
【问题讨论】:
-
这是一个典型的问题。第一个问题是,用户会选择这么多客户吗?什么是常规用例?
-
常规用例是选择 1 个客户。但总是有人要求选择任意客户。我希望找到一个银弹解决方案,可以满足所有要求,而无需做太多 if..then..else 来满足每个要求。
标签: sql performance implementation