【发布时间】:2011-10-03 15:07:50
【问题描述】:
这是一个测试场景,使用临时表来说明问题。 假装表 @userdata 在用户 ID 上有索引 并且表 @users 在 id 上有索引
为什么第一个选择不能使用索引,我认为它在 1 个子选择中比在 2 个子选择中表现更好?
版本 - 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))相对于其他两个查询的执行情况如何? -
第一个 WHERE EXISTS 中的选择看起来不合适。那里不应该有一些额外的括号,也许是:WHERE (u.username = @username AND u.superuser = 1) OR (u.id = d.userid AND u.username = @username)?
-
@rsbarro -
AND的优先级高于OR- 您显示的括号是服务器如何解释它。
标签: tsql sql-server-2008 indexing