INTERSECT非常慢 - 有更好的解决方案吗?

时间:2017-07-25 10:49:34

标签: sql sql-server stored-procedures

我有一个包含一个主表和一些子表的数据库。为了查看数据,我创建了一个C#应用程序,它显示了一个大表。在此应用程序中,用户可以设置过滤器,以仅显示所有数据的一部分。此过滤器有20个不同的参数,每个参数都可以使用或不使用。 为了清楚这个存储过程,我组织它像这样: 对于20个参数中的每一个,我创建一个临时表:

DECLARE @tbl_parameter1 type_Int
DECLARE @tbl_Parameter2 type_Int
...

type_Int是一个用户定义的表类型,只包含一个Int。

类型的列

在下一步中,我使用适合filter-parameter的所有行的主表的ID填充这些表。如果没有设置一个参数,我会用所有ID填充它。

ID @parameter1 > 0
  BEGIN
    INSERT INTO @tbl_parameter1 SELECT ID FROM tbl_main WHERE col1 = @parameter1
  END
ELSE
  BEGIN
    INSERT INTO @tbl_parameter1 SELECT ID FROM tbl_main
  END

所以最后我需要在20个临时表中的每一个中出现所有ID: 这一步很慢。

INSERT INTO @Result 
  SELECT Value FROM @tbl_TestsequenceTags
INTERSECT
  SELECT Value FROM @tbl_Source
INTERSECT
  SELECT Value FROM @tbl_Vehicle 
... (17 more tables)

最后,我将所有另一个存储过程提供给C#应用程序并包含所有连接和联合。

EXEC Get_Data @Result  

是否有更好(更快)的解决方案来创建@ result-Table? 或者我应该以其他方式进行过滤?

1 个答案:

答案 0 :(得分:2)

为什么不使用一次传递来编写查询?

SELECT ID
FROM tbl_main
WHERE (col1 = @parameter1 OR @paramter1 IS NULL) AND
      (col2 = @parameter2 OR @paramter2 IS NULL) AND
      . . .;

这需要扫描原始表格。但是,它应该比编写20个临时表更有效 - 其中许多表包含原始数据中所有行的ID。