[英]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.