使用“OR”或“UNION”优化SQL Server查询

时间:2013-08-13 09:16:59

标签: sql-server query-optimization

我们有一个名为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秒。就像我说的,我的知识有限,所以我不知道是否有其他方法来优化这样的查询。有人可以分享一些经验吗?谢谢!

0 个答案:

没有答案