1
私が働く会社はサードパーティ製のソフトウェアを使用しており、アプリケーションコードにさらされていないため、DBオブジェクトをあまり変更することはできません。 Sargではないビューでいくつかの回避策を実行しようとしています。ビュー内でnullを0に置き換え、ビューがアプリケーションで呼び出されると、同じ列にフィルタがあります。 SARG問題Coalesce vs Sargability
--drop view vw_test
CREATE VIEW vw_test
AS
SELECT tmp1.ID as ParentID
, tmp1.Parent
, COALESCE(tmp2.ID, 0) as UserID
, tmp2.UserName
FROM test01 tmp1
LEFT JOIN test02 tmp2
on tmp1.ID = tmp2.ID
------------------------
-- An index scan is performed
SELECT ParentID
, Parent
, UserID
, UserName
FROM vw_test
WHERE UserID = 1
セカンドテスト - - いいえ、SARGの問題
IF OBJECT_ID('test01' , 'U') IS NOT NULL
DROP TABLE test01;
CREATE TABLE test01 (ID INT IDENTITY(1,1) PRIMARY KEY
, Parent NVARCHAR(100)
);
GO
IF OBJECT_ID('test02' , 'U') IS NOT NULL
DROP TABLE test02;
CREATE TABLE test02 (ID INT IDENTITY(1,1) PRIMARY KEY
, ParentID INT
, UserName NVARCHAR(100)
);
GO
ALTER TABLE test02 ADD CONSTRAINT FK_test02_ParentID FOREIGN KEY (ParentID) REFERENCES test02(ID);
INSERT INTO test01
SELECT 'DGN010101'
UNION ALL SELECT 'DGN020202'
UNION ALL SELECT 'DGN030303'
UNION ALL SELECT 'DGN040404'
GO
INSERT INTO test02 (ParentID, UserName)
SELECT 1, 'DGN010101'
UNION ALL SELECT 2, 'DGN020202'
UNION ALL SELECT NULL, 'DGN030303'
GO
まずテスト:
- SQL Serverのバージョン:2005
シナリオは以下のとおりです。 覚えておくべき
もの:
- 私はまだ私はビューが呼び出される方法を変更することはできません0
- でNULLを交換する必要があります。
私は君たちのいずれかの考えを感謝しています。
美しいを!私はさまざまなことを試みたが、これについては考えなかった。クエリは今より速く実行されています。 多くのありがとうDan! –