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' 查询优化的主要内容,如果未能解决你的问题,请参考以下文章