【发布时间】:2019-01-08 13:40:34
【问题描述】:
我有一个表 Table1,其中包含 1 - 150 万行带有主键的行。
这是我的表结构
CREATE TABLE [dbo].[Table1]
(
[Id] [INT] NOT NULL,
[allow_public] [BIT] NULL,
[average_frequency] [DECIMAL](18, 4) NULL,
[category_id] [INT] NULL,
-- a few more columns
--
--
--
[member_id] [INT] NULL
CONSTRAINT [PK_Table1_Id]
PRIMARY KEY CLUSTERED ([Id] ASC)
)
在member_id 上添加了一个非聚集索引,如下所示:
CREATE NONCLUSTERED INDEX non_cluster_index_member_table1
ON dbo.Table1 (member_id)
WHERE member_id IS NOT NULL;
GO
当我像
这样执行查询时SELECT
[id],
[accurate_grams],
[allow_public],
[average_frequency],
[category_id]
FROM
dbo.Table1
WHERE
member_id = @memberid;
它会在几毫秒内返回一些行。但是当我执行类似的查询时
SET @OrgMemberId = ISNULL(@OrgMemberId, -1);
SELECT
[id],
[accurate_grams],
[allow_public],
[average_frequency],
[category_id]
FROM
dbo.Table1 f
WHERE
ISNULL(f.member_id, -1) = CASE
WHEN @MemberId = -1
THEN ISNULL(f.member_id, -1)
ELSE @MemberId
END
完成执行需要很长时间。
注意:member_id 列包含空值。而且它没有被映射为外键
ISNULL(f.member_id, -1) = CASE
WHEN @MemberId = -1
THEN ISNULL(f.member_id, -1)
ELSE @MemberId
END
写上一行的原因是 - 有时用户将空值发送到@MemberId。为了处理这种情况,我在 where 子句中使用了这一行。在单个查询中,我可以获取两个不同的结果。当member_id is null 然后查询选择所有记录,当member_id is not null 然后查询选择那些与Member_id 匹配的记录。所以没有必要使用if else。
有没有其他解决方案来解决这个问题?
【问题讨论】:
-
为什么需要这张支票?我不明白这一点:如果你已经知道你不会找到任何结果,为什么要运行查询?无论如何,您可以改用
coalesce,这会有所帮助。但也许我误解了你的编辑。请解释并发布完整的声明(可以像以前一样跳过确切的列)
标签: sql-server-2012