SQL Server 'OR' 查询优化

Posted

技术标签:

【中文标题】SQL Server \'OR\' 查询优化【英文标题】:SQL server 'OR' query optimizationSQL Server 'OR' 查询优化 【发布时间】:2014-02-03 11:57:17 【问题描述】:

这个查询优化了吗?

SELECT 
        ElementID,
    AVID,
        ElementName
FROM 
    Element
WHERE  
    AVID = 36 OR  AVID = 56 OR  AVID = 57 OR  AVID = 58 OR  AVID = 59 OR  AVID = 60 
    OR  AVID = 61 OR  AVID = 74 OR  AVID = 208 OR  AVID = 220 OR  AVID = 304 
    OR  AVID = 263 OR  AVID = 416 OR  AVID = 250 OR  AVID = 335 OR  AVID = 150 
    OR  AVID = 356 OR  AVID = 362 OR  AVID = 382 OR  AVID = 404 OR  AVID = 609 
    OR  AVID = 642 OR  AVID = 643 OR  AVID = 572 OR  AVID = 656 OR  AVID = 678 
    OR  AVID = 685 OR  AVID = 697 OR  AVID = 766 OR  AVID = 786 OR  AVID = 629

AVID 是表中的外键。 ElementID 是主键。 AVID 的值由 UI 根据用户选择生成,因此无法使用 JOINS。我收到AVID 作为逗号分隔值(csv),我有一个小实用程序,它使用AVID csv 生成这个查询。这些AVID 的数量超过了 1000 个。

我使用的是 SQL Server 2008 R2,并且查询是从 Web 浏览器界面执行的,因此存储过程对我没有帮助。

所以我想知道这个查询是否经过优化或如何进一步优化?

【问题讨论】:

你为什么不用IN?它当然更具可读性,并且不应该影响性能。甚至可能更快,因为它应该使查询分析器更容易优化执行。无论如何,我的猜测是查询本身并没有太多需要优化的地方,而是索引会有所作为。 IN 在比较次数超过一定限制时有限制 【参考方案1】:

嗯,当您需要按大量 AVID 进行过滤时,性能会受到影响。

有了这笔钱,你就可以走了。

出于好奇,您还可以使用“IN”运算符,它将您的查询转换为如下内容:

SELECT * FROM Element WHERE AVID IN (1, 2, 3, ...)

此外,如果您发现由于使用的 AVID 数量而导致性能下降,则应尝试将 AVID 插入临时表中,然后使用内部连接进行最终过滤。

对于 T-SQL(Microsoft SQL Server:

CREATE TABLE #TMP_TBL (AVID_TMP INT PRIMARY KEY);

INSERT INTO #TMP_TBL (AVID_TMP) VALUES (1), (2), (3), ...

SELECT e.* 
FROM ELEMENT e
INNER JOIN #TMP_TBL t ON t.AVID_TMP = e.AVID

或者像 mysql 这样的:

CREATE TEMPORARY TABLE IF NOT EXISTS tmp_tbl AS (SELECT * FROM element)

INSERT INTO tmp_tbl VALUES (1), (2), (3)...

SELECT e.* 
FROM ELEMENT e
INNER JOIN #TMP_TBL t ON t.AVID_TMP = e.AVID

就是这样。你去就好了。 您不需要删除此表,因为它是临时的,连接关闭时会自动删除。

检查这些链接:

或运算符:http://technet.microsoft.com/en-us/library/ms188361.aspx

IN 运算符(特别注意备注部分):http://technet.microsoft.com/en-us/library/ms177682.aspx

【讨论】:

临时表#TMP_TBL应该在DB中创建还是在执行上述查询时自动创建? 嗯,该语法适用于 T-SQL (Microsoft SQL Server),我将编辑帖子以使其对 MySQL 友好 我没有使用 My-SQL...它是 T-SQL..SQL server 2008 R2 没问题。不要忘记阅读链接,因为它们提供了很好的信息

以上是关于SQL Server 'OR' 查询优化的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 'OR' 查询优化

SQL -- SQL Server 查询优化器(Query Optimizers)

sql Server 查询方法的优化

如何优化此 SQL Server 查询 - 多个子查询

优化 SQL Server 查询以提高速度

优化 SQL Server 聚合查询