これは、問題を説明するための一時的なテーブルで作成されたテストシナリオです。最初のインデックスを使用することができませんでし選択されるのはなぜ テーブル@userdataは、ユーザーID とテーブル@users上のインデックスは、IDインデックスを使用していないTSQL
にインデックスを持っているふりを、私はそれが2つの副選択よりも1つの副選択でより良い実行することになり仮定しましたか?
バージョン - のMicrosoft SQL Server 2008 R2の(RTM) 互換性レベル - SQL Serverの2000
-- test tables
DECLARE @userdata TABLE(info VARCHAR(50), userid INT)
DECLARE @users TABLE(id INT, username VARCHAR(20), superuser BIT)
-- test data
INSERT @users VALUES(1, 'superuser', 1)
INSERT @users VALUES(2, 'testuser1', 0)
INSERT @users VALUES(3, 'testuser2', 0)
INSERT @userdata VALUES('secret information', 1)
INSERT @userdata VALUES('testuser1''s data', 2)
INSERT @userdata VALUES('testuser2''s data', 3)
INSERT @userdata VALUES('testuser2''s data',3)
DECLARE @username VARCHAR(50)
SET @username = 'superuser'
--SET @username = 'testuser1'
--The superuser can read all data
--The testusers can only read own data
-- This sql can't use indexes and is very slow
SELECT *
FROM @userdata d
WHERE EXISTS
(SELECT 1 FROM @users u
WHERE u.username = @username AND u.superuser = 1 OR
u.id = d.userid AND u.username = @username)
-- This sql uses indexes and performs well
SELECT *
FROM @userdata d
WHERE EXISTS
(SELECT 1 FROM @users u
WHERE u.username = @username AND u.superuser = 1)
OR EXISTS (SELECT 1 FROM @users u
WHERE u.ID = d.userid
AND u.username = @username)
使用しているSQL Serverのバージョンは? –
私の質問にバージョンが含まれています –
テーブル(およびユーザーあたりの行)に含まれる行の数はどのくらいですか?SELECT * FROM @userdata d WHERE EXISTS(SELECT * FROM @users u WHERE u.username = @username AND (u.superuser = 1 OR u.id = d.userid)) 'は他の2つのクエリに対して相対的に実行されますか? –