繁体   English   中英

SQL Server“ OR”查询优化

[英]SQL server 'OR' query optimization

此查询是否经过优化?

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是主键。 UI会根据用户选择生成AVID的值,因此无法使用JOINS。 我将AVID接收为逗号分隔值(csv),并且我有一个小的实用程序,可使用AVID csv生成此查询。 这些AVID数量超过1000。

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

因此,我想知道此查询是否已优化或如何进一步优化?

好吧,当您需要按大量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/zh-cn/library/ms188361.aspx

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM