代码之家  ›  专栏  ›  技术社区  ›  Abu Aqil

SQL:选择更快和最佳实践?

sql
  •  3
  • Abu Aqil  · 技术社区  · 15 年前

    如果我使用两个查询:

    第一:查询所需的所有密钥/ID

    第二:从tab1中选择*,其中tab1.id in(…ids list….,,)

    ID列表可以是几千…

    这样做是明智的还是最佳实践,还是推荐的?

    2 回复  |  直到 15 年前
        1
  •  7
  •   p.campbell    15 年前

    作为一般规则,在语句中使用in子句是完全可以接受的最佳实践…假设对较大的值集使用子查询。

    答案应该是: 它取决于 !从你的问题中还不清楚你的价值清单是一个选择,还是你将它们硬编码。如果这几千个值在另一个表(临时表或表变量)中,并且您对它们进行了子查询,那么性能肯定会更好。即

        SELECT * FROM Customer 
        WHERE CustomerID IN (SELECT ID FROM MyOtherLargeTableOfCustomers)
    
    • 您正在执行的列的索引有多好 IN 条款?
    • 数据类型是什么?如果是数字数据类型,那么您不应该有任何性能问题。
    • 确保你 STATISTICS (如果是SQL Server)会定期更新。
    • 如果数据类型是基于字符或guid的,则可能会遇到一些性能问题,特别是当您同时运行多个查询时,并且列表如您所描述的那样以千为单位。
    • 考虑 JOIN 相反,应该生成更快的查询。
    SELECT * FROM Customer AS C 
    INNER JOIN MyOtherLargeTableOfCustomers AS M
    ON C.CustomerID = M.CustomerID
    
        2
  •  1
  •   Jason    15 年前

    如果您的ID可以在可联接表中查询,那么使用内部联接应该可以提供最快的查询,并提供一个要发送到数据库的非常小的查询。