Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 可选列上的SQL Server索引_Sql Server_Indexing_Query Optimization - Fatal编程技术网

Sql server 可选列上的SQL Server索引

Sql server 可选列上的SQL Server索引,sql-server,indexing,query-optimization,Sql Server,Indexing,Query Optimization,在我的场景中,我有一个包含许多可选列的表(总共20列,比如从col00到col19,每列包含一个不可为null的整数)。 当列包含0时,它被认为是空的,任何其他值都有意义。 这20列中的任何一个子集都可以查询,所以我应该查询col01=int1和col17=int2 我需要改进此类查询的性能,但我不知道如何创建具有代表性的索引。 当然,我可以监视表一段时间,看看哪些列是最容易搜索的,但这对我来说不是一个令人满意的解决方案(表每隔几个月定期重新生成一次..并且以这种方式编码的“标记”可能会更改)我

在我的场景中,我有一个包含许多可选列的表(总共20列,比如从col00到col19,每列包含一个不可为null的整数)。 当列包含0时,它被认为是空的,任何其他值都有意义。 这20列中的任何一个子集都可以查询,所以我应该查询col01=int1和col17=int2

我需要改进此类查询的性能,但我不知道如何创建具有代表性的索引。
当然,我可以监视表一段时间,看看哪些列是最容易搜索的,但这对我来说不是一个令人满意的解决方案(表每隔几个月定期重新生成一次..并且以这种方式编码的“标记”可能会更改)

我想你最好能做的就是自己索引每一列,然后使用集合运算符INTERSECT。。。在where子句的子查询中

INTERSECT返回由“左输入查询”和“右输入查询”操作符输出的不同行。因此,如果在INTERSECT中选择表的主键,那么应该有一个好的子查询,可以在where子句中使用。但是,这需要您重新编写查询

例如:

SELECT * 
  FROM tablename
 WHERE primary_key = (
SELECT primary_key FROM tablename WHERE col01 = int1 
INTERSECT 
SELECT primary_key FROM tablename WHERE col17 = int2
)

如果col01和col17有自己的索引,这应该是可以接受的。

是否有任何列总是被传递?否,每个列可能(不是每个客户都使用所有列)绑定到一个标记集,标记集是该列中可用作标记的允许值范围。第一列是颜色标签,第二列是尺寸标签。。等等如果有人要查询一个大小为n英寸的红色项目,我必须检查第一列和第二列