优化接受表参数作为针对视图的过滤器的存储过程

时间:2015-03-10 18:30:30

标签: sql sql-server query-optimization

我正在寻找一种使用可选表参数过滤视图的有效方法。

示例最好,所以这里是一个示例情况:

-- database would contain a view that I want to be able to filter
CREATE VIEW [dbo].[MyView]
AS
BEGIN
     -- maybe 20-40 columns
    SELECT Column1, Column2, Column3, ...
END

我有这样的用户定义的表类型:

-- single id table for joining purposes (passed from code)
CREATE TYPE [dbo].[SingleIdTable] AS TABLE (
    [Id] INT NOT NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC) WITH (IGNORE_DUP_KEY = OFF));

-- double id table for joining purposes (passed from code)
CREATE TYPE [dbo].[DoubleIdTable] AS TABLE (
    [Id1] INT NOT NULL,
    [Id2] INT NOT NULL,
    PRIMARY KEY CLUSTERED ([Id1] ASC, [Id2] ASC) WITH (IGNORE_DUP_KEY = OFF));

我想创建一个基本上如下的存储过程:

CREATE PROCEDURE [dbo].[FilterMyView]
    @Parameter1 dbo.SingleIdTable READONLY, 
    @Parameter2 dbo.DoubleIdTable READONLY, 
    @Parameter3 dbo.SingleIdTable READONLY
AS
BEGIN
    SELECT *
    FROM MyView
    INNER-JOIN-IF-NOT-EMPTY @Parameter1 p1 ON p1.Id  = MyView.Column1 AND
    INNER-JOIN-IF-NOT-EMPTY @Parameter2 p2 ON p2.Id1 = MyView.Column5 AND
                                              p2.Id2 = MyView.Column6 AND
    INNER-JOIN-IF-NOT-EMPTY @Parameter3 p3 ON p3.Id  = MyView.Column8
END

现在我相信我可以使用WHERE EXISTS执行此操作,但我想确保以最有效的方式为SQL引擎执行此操作。我个人觉得INNER JOIN语义创建了最优化的执行计划,但我实际上并不知道。

我也知道我可以使用动态SQL来做到这一点,但我总是将其作为最后一个选项。

0 个答案:

没有答案