0

我们有一个名为 SQL Server 的表Deals,它是一个包含所有金融交易条目的通用表,其数量可能是数十万甚至数百万。每一行Deals都有一列叫做Productvarchar 类型,对应不同的交易类型:债券交易、股票交易、期货或期权交易,有些简单,有些复杂。现在我们要搜索整个表以获取所有未成熟的交易。根据交易的类型,“成熟”一词具有不同的含义。例如,对于产品类型“BOND”和其他一些,我们检查表中列的值MaturityDate是否Deals大于给定日期,即 MaturityDate > @DATE。对于交易类型“未来”,我们有列ValueDate在同一个表中大于给定日期和MaturityDate大于给定日期。所以我的查询初稿如下所示:

SELECT * FROM Deals
WHERE
(
 (Product IN ('ProdA', 'ProdB') AND MaturityDate > @CD) OR
 (Product IN ('ProdC', 'ProdD') AND (MaturityDate > @CD AND ValueDate > @CD)) OR
 (Product IN ('ProdE', 'ProdF', SOME_OTHER_PRODUCT_TYPE) AND (MaturityDate > @CD AND ValueDate > @CD) AND SOME_OTHER_CRITERIA) OR
 ...
)

我们有超过 30 个Product值和至少 8 组标准(最常见的标准集可能适用于 7 或 8 个Product值,而最不常见的标准集仅适用于一或两个Product值)。该列Product已编入索引,例如,条件中的某些列(但不是全部)MaturityDate也已编入索引。大多数标准集只检查表中的列值Deals,但确实有一些标准集涉及与其他一些表的 JOIN 并检查那里的值。

所以现在我的问题是,如何优化这样的查询(作为一个软件开发人员,我真的不是数据库专家,很少编写数据访问代码)?因为我从某个地方读到,用 UNION 替换 OR 子句可能是个好主意。但是,当我使用 UNION 和 OR 执行查询时,前者在我的开发机器上用了 5 秒(表中的项目少于 100,000 个Deals),而后者用了 3 秒。就像我说的,我的知识有限,所以我不知道是否有其他方法可以优化此类查询。有人可以分享一些经验吗?谢谢!

4

0 回答 0