gpt4 book ai didi

sql - 查询此数据的更有效方法?

转载 作者:行者123 更新时间:2023-12-02 07:13:25 24 4
gpt4 key购买 nike

我有一个包含一些数据的表格:

 ColA | ColB | ColC------+------+------  1   |  A   |  X  2   |  A   |  Y  3   |  B   |  Y  4   |  C   |  Y  5   |  C   |  Z  6   |  D   |  Y  7   |  D   |  Z

I want to query to get all of the rows where ColB and ColC as a pair match a condition:

SELECT * FROM [Table] 
WHERE (ColB = A AND ColC = Y)
OR (ColB = B AND ColC = Y)
OR (ColB = C AND ColC = Y)
OR (ColB = D AND ColC = Z)

这应该返回第 2、3、4 和 7 行。


(ColB, ColC) 的值对可能很大(大约 100)。除了具有大量 OR 条件的大型查询之外,是否有更有效的查询此数据的方法?

我希望有一种方法可以使用元组的等价物,这意味着我可以做类似的事情:

SELECT * FROM [Table] 
WHERE (ColB, ColC) IN ({A, Y}, {B, Y}, {C, Y}, {D, Z})

有什么想法吗?


编辑:(回答评论中的一些问题)

ColBColC 的字段存储 guid,并声明为 uniqueidentifier 类型。
这需要在 SQL Server 2005 向上(所有版本)上工作。
该表有数百万行,我不反对添加它工作所需的任何索引。

最佳答案

你可以做到这一点。 (如果您使用的是 SQL Server 2008,则可以使用 values 行构造函数而不是 union alls )

您需要检查查询计划以查看它是否更有效。

SELECT * /*But don't use star*/
FROM [Table]
JOIN
(
SELECT 'A' AS BMatch, 'Y' AS CMatch UNION ALL
SELECT 'B' AS BMatch, 'Y' AS CMatch UNION ALL
SELECT 'C' AS BMatch, 'Y' AS CMatch UNION ALL
SELECT 'D' AS BMatch, 'Z' AS CMatch UNION ALL ...
) Matches
ON ColB = BMatch AND ColC = CMatch

您在评论中说 ColB 的组合和 ColC是独一无二的(假设你的表已经有一个聚集索引)我想如果你创建一个 unique nonclustered index(colb, colc)(colc, colb)以上内容应该为您提供一个包含 100 个索引查找和 100 个书签查找的计划。如果没有,您可以尝试添加索引提示以使其使用新索引。您需要将它的 I/O 与完整扫描的 I/O 进行比较 or s 可能会给你。

通过在非聚集索引中包含额外的必需列,可以潜在地避免书签查找的成本。你用过 *尽管如此,我不知道这有多可行。您需要权衡此查询的好处与数据修改操作可能带来的不利影响。

关于sql - 查询此数据的更有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3546464/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com