2017-05-17 6 views
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を交換する必要があります。

私は君たちのいずれかの考えを感謝しています。

答えて

2

TEST02テーブルのID列(ユーザーID)はNULLを許可しない場合は、このバージョン試してみてください。

CREATE VIEW vw_test2 
AS 
SELECT tmp1.ID as ParentID 
    , tmp1.Parent 
    , tmp2.ID as UserID 
    , tmp2.UserName 
FROM test01 tmp1 
JOIN test02 tmp2 
     on tmp1.ID = tmp2.ID 
UNION ALL 
SELECT tmp1.ID as ParentID 
    , tmp1.Parent 
    , 0 as UserID 
    , tmp2.UserName 
FROM test01 tmp1 
LEFT JOIN test02 tmp2 
     on tmp1.ID = tmp2.ID 
WHERE tmp2.ID IS NULL; 
GO 
+0

美しいを!私はさまざまなことを試みたが、これについては考えなかった。クエリは今より速く実行されています。 多くのありがとうDan! –