SQL:在内部使用过滤器查看或在选择时使用过滤器查看

时间:2012-11-14 01:51:47

标签: sql

我一直在研究一个使用大量视图的数据库,而且表记录只有100万行,但是等待我的查询显示起来很痛苦。

我想复制View并在里面放一个“WHERE CLAUSE”。现在问我的问题:

在视图中放置where子句会更快吗?例如,我会把所有客户类型='BIZ'。

或者如果我只使用View“SELECT * FROM VIEW_CUSTOMER WHERE type ='BIZ'”

它会是一样的吗?

3 个答案:

答案 0 :(得分:0)

使用过滤器添加其他视图无助于您的效果。您应该将您的疑虑带给您的DBA。如果您没有DBA ...那么您必须找到知识渊博的开发人员来帮助解决您的查询性能问题。

答案 1 :(得分:0)

借助这个脚本,可以使用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

答案 2 :(得分:0)

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

请务必指定where规范可以使用的索引。