【问题标题】:SQL Server putting Index on left joinSQL Server 将索引放在左连接上
【发布时间】:2014-09-11 17:16:28
【问题描述】:

我有大约 50.000 条记录的数据库。假设我在存储过程中有这个查询(它只是一部分)(使用 c# + sqlserver):

SELECT .... 
FROM
Table1 t1
LEFT JOIN Table2 t2 ON t1.ID=t2.ID
LEFT JOIN Table3 t3 ON t2.ColumnName=t3.ColumnName
WHERE 
ISNULL(t1.ColumnName,'') LIKE @arg1 //FAST
ISNULL(t2.ColumnName2,'') LIKE @arg2//SLOW
ISNULL(t3.ColumnName,'') LIKE @arg3 //SLOW

如果我在 t3.Column2 之后搜索,查询速度很慢。 如果我照顾一些 t1 列(其中没有左连接),那么它就像一个魅力,非常快。问题是什么?我怎样才能加快这个速度?我试图不使用连接,但这是不可能的。 我可以在表格上放一些索引吗?在这种特殊情况下是哪一个?

【问题讨论】:

  • 了解您要搜索的内容会有所帮助 - @arg1 是什么? t1.ColumnName 或 t3.ColumnName2 上是否有任何索引?
  • 这是文本框的值 - 搜索参数,比如说人名。
  • 是的,索引位于 t1.Id(集群)上。我认为它是自动生成的。
  • 首先,您不需要ISNULL。第二,在使用LIKE 时搜索文本列可能需要很多时间,您需要告诉我们更多信息。
  • 是的,我需要 ISNULL,因为该列也可以为空,但我需要显示其他不为空的列。我需要 Like 因为他可以只输入整个单词的一部分,结果也应该显示出来。

标签: c# sql-server performance indexing


【解决方案1】:

我会尝试以下选项,看看性能是否有所提高。对于任何索引建议,您也可以尝试“执行计划”。

创建一个索引,

  • t2 中的列名和 t3 中的列名
  • 如果上述方法无法在 t2 中为 ColumnName2 添加一个索引

附:索引会影响更新/插入/删除,更多信息here

编辑 - 根据编辑后的问题更新

【讨论】:

  • 那么如果我只使用 Select 语句就不会提高性能?因为我从不更新或插入任何东西(只读)。
  • 如果大部分是只读的,那么添加索引肯定会提高select语句的性能。
  • 我错过了一些东西,抱歉。你能重写你的说明,因为我重写了代码(我错过了一些东西)吗?在我的帖子中查看当前代码。感谢您的宝贵时间,我真的很感激。
  • 谢谢,但没有显着变化。你说的是创建非聚集索引,对吧?
  • 是的,非聚集索引。正如@Tzah 所建议的那样,您的情况不需要 ISNULL 。您可以尝试删除它,例如t1.ColumnName LIKE @arg1 OR t2.ColumnName2 LIKE @arg2...
猜你喜欢
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-25
  • 1970-01-01
相关资源
最近更新 更多