我正在考虑以下情况:我有两根高密度色谱柱,但这些色谱柱不是独立的。
定义
这是我出于测试目的而创建的表的定义。
CREATE TABLE [dbo].[StatsTest](
[col1] [int] NOT NULL, --can take values 1 and 2 only
[col2] [int] NOT NULL, --can take integer values from 1 to 4 only
[col3] [int] NOT NULL, --integer. it has not relevance just to ensure that each row is different
[col4] AS ((10)*[col1]+[col2]) --a computed column ensuring that if two rows have different values in col1 or col2 have different values in col4
) ON [PRIMARY]
数据
实验数据如下
col1 col2 col3 col4
1 1 1 11
1 2 2 12
1 2 3 12
1 3 4 13
1 3 5 13
1 3 6 13
1 4 7 14
1 4 8 14
1 4 9 14
1 4 10 14
2 1 11 21
2 1 12 21
2 1 13 21
2 1 14 21
2 2 15 22
2 2 16 22
2 2 17 22
2 3 18 23
2 3 19 23
2 4 20 24
步骤1:按col1过滤
SELECT * FROM StatsTest WHERE col1=1
正如预期的那样,查询优化器会猜测确切的行数。
步骤2:按col2过滤
SELECT * FROM StatsTest WHERE col2=1
同样,我们有一个完美的估计。
步骤3:按col1和col2进行过滤
SELECT * FROM StatsTest WHERE col1=1 AND col2=1
在此,估计远非接近实际的行数。
问题是查询分析器隐式地假定col1和col2是独立的,但它们不是独立的。
步骤4:按col4过滤
SELECT * FROM StatsTest WHERE col4 = 11
我可以通过COL4 = 11过滤,以获得相同的结果,在步骤3中的查询,因为COL4是计算列并根据该方式,它已被定义COL1 = 1和COL2 = 1相当于COL4 = 11 但是在这里, ,正如预期的那样,估算是完美的。
结论/问题
在处理两个或多个非独立列的过滤时,这种人工的,不雅致的解决方案是否是实现准确估计的唯一可用选择?为了获得实际精度,计算列和计算列的过滤器是否严格必要?