私は多くのビューを使用するデータベースに取り組んでおり、テーブルレコードは最大100万行しかありませんが、クエリが表示されるのを待つのは苦痛でした。
ビューを複製して、「WHERECLAUSE」を中に入れたかったのです。今私の質問に:
ビュー内にwhere句を配置する方が高速ですか。たとえば、すべての顧客タイプ='BIZ'を設定します。
または、ビュー "SELECT * FROM VIEW_CUSTOMER WHERE type='BIZ'"を使用した場合も同じでしょうか。
私は多くのビューを使用するデータベースに取り組んでおり、テーブルレコードは最大100万行しかありませんが、クエリが表示されるのを待つのは苦痛でした。
ビューを複製して、「WHERECLAUSE」を中に入れたかったのです。今私の質問に:
ビュー内にwhere句を配置する方が高速ですか。たとえば、すべての顧客タイプ='BIZ'を設定します。
または、ビュー "SELECT * FROM VIEW_CUSTOMER WHERE type='BIZ'"を使用した場合も同じでしょうか。
このスクリプトの助けを借りて、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に使用可能なインデックスを使用させるには、ビューを作成するときに「withschemabinding」を指定します(schemabindingを使用してビューを作成します…)。
where仕様で使用できるインデックスを必ず指定してください。
フィルタを使用して別のビューを追加しても、パフォーマンスは向上しません。あなたはあなたの懸念をあなたのDBAに持ってくるべきです。DBAがない場合は、クエリのパフォーマンスのトラブルシューティングに役立つ知識のある開発者を見つける必要があります。