SQL:内置过滤器的视图或选择过滤器的视图

SQL:内置过滤器的视图或选择过滤器的视图,sql,Sql,我一直在处理一个使用大量视图的数据库,表记录最多只有100万行,但等待我的查询出现是一件痛苦的事情 我想复制视图,并在其中添加一个“WHERE子句”。现在我的问题是: 在视图中放置where子句是否更快。例如,我会将所有客户类型设置为'BIZ' 或者,如果我只使用视图“SELECT*FROM View_CUSTOMER WHERE type='BIZ'”在过滤器中添加另一个视图将不会有助于您的性能。您应该将您的问题提交给DBA。如果您没有DBA。。。然后,您必须找到一位知识渊博的开发人员来帮助解

我一直在处理一个使用大量视图的数据库,表记录最多只有100万行,但等待我的查询出现是一件痛苦的事情

我想复制视图,并在其中添加一个“WHERE子句”。现在我的问题是:

在视图中放置where子句是否更快。例如,我会将所有客户类型设置为'BIZ'


或者,如果我只使用视图“SELECT*FROM View_CUSTOMER WHERE type='BIZ'”

在过滤器中添加另一个视图将不会有助于您的性能。您应该将您的问题提交给DBA。如果您没有DBA。。。然后,您必须找到一位知识渊博的开发人员来帮助解决查询性能问题

借助帮助,此脚本可以使用where子句创建视图

DECLARE @pref nvarchar(10) = '_type$biz',
        @where_clause nvarchar(max) = 'WHERE 1 = 1',
        @dsql nvarchar(max) = ''
IF OBJECT_ID('tempdb.dbo.#tmp') IS NOT NULL DROP TABLE dbo.#tmp 
SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS rn,
       'CREATE VIEW ' + SCHEMA_NAME(o.schema_id) + '.' + OBJECT_NAME(o.object_id) + @pref
       + ' AS SELECT * FROM ' + SCHEMA_NAME(o.schema_id) + '.' + OBJECT_NAME(o.object_id) + ' ' + @where_clause AS def
INTO dbo.#tmp       
FROM sys.sql_modules m JOIN sys.objects o ON m.object_id = o.object_id
WHERE o.type = 'V'

DECLARE @i int = (SELECT MIN(rn) FROM dbo.#tmp)

WHILE (@i IS NOT NULL)
BEGIN
  SELECT @dsql = def FROM dbo.#tmp WHERE rn = @i
  EXEC sp_executesql @dsql
  SELECT @i = MIN(rn) FROM dbo.#tmp WHERE rn > @i
END

在视图中添加where子句时,这将减少选择的行数。 默认情况下,sqlserver在调用视图时不使用索引! 要强制sqlserver使用可用索引,请在创建视图时指定“with schemabinding”(创建视图时将schemabinding设置为…)


确保指定一个可由where规范使用的索引。

我没有添加其他视图。我计划创建一个视图。让我的问题简短一点。当我在视图中放置where子句时,与选择视图并放置where子句时,是否会有速度差异。不,性能不会有差异。您可以通过查看执行计划来测试这一点,我想这应该可以。为了确保它不会中断,我可能还会使用
QUOTENAME()
来分隔动态查询中使用的每个对象名称。无论如何,这似乎根本没有解决实际问题。问题在于将条件从查询移动到视图定义是否可以/将加快查询速度,而不是如何以编程方式将条件添加到视图定义。