首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL: View with Filter inside或View with Filter on Select

SQL: View with Filter inside或View with Filter on Select
EN

Stack Overflow用户
提问于 2012-11-14 09:51:47
回答 3查看 8.3K关注 0票数 4

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

我想复制视图并在里面放一个"WHERE子句“。现在来回答我的问题:

将where子句放入视图中会更快吗?例如,我会将所有客户类型设置为'BIZ‘。

或者如果我只使用视图"SELECT * FROM VIEW_CUSTOMER WHERE type = 'BIZ'“

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-14 12:03:21

使用过滤器添加另一个视图对您的性能没有任何帮助。您应该将您的担忧带给DBA。如果您没有DBA...然后,您必须找到知识渊博的开发人员来帮助解决您的查询性能问题。

票数 -2
EN

Stack Overflow用户

发布于 2012-11-14 17:55:45

有了help这个脚本,就可以使用where子句创建视图

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2019-08-28 21:13:50

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13371912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档