我们有一个名为Deals
的SQL Server表,它是一个包含所有金融交易条目的通用表,其数量可能是数十万甚至数百万。 Deals
中的每一行都有一个名为Product
的列,其类型为varchar,对应于不同的交易类型:债券交易,股票交易,期货或期权交易,有些是简单的,有些则更复杂。现在我们要搜索整个表格以获得所有未成熟的交易。根据交易的类型,术语“成熟”具有不同的含义。例如,对于产品类型“BOND”和其他一些产品,我们检查MaturityDate
表中列Deals
的值,大于给定日期,即MaturityDate> @日期。对于交易类型“FUTURE”,我们在同一个表格中的列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秒(在Deals
表中少于100,000个项目),而后者需要3秒。就像我说的,我的知识有限,所以我不知道是否有其他方法来优化这样的查询。有人可以分享一些经验吗?谢谢!