1

有一个查询运行得比我想要的慢,但我无法分享详细信息。该查询已经返回了正确的结果,并且我已经对其进行了重构,但我无法让它足够快地运行。谓词在可能的情况下已经是Sarg-able的。它已经正确地使用了连接,不请求额外的表,并且不会不必要地复制行或使用嵌套子查询来减慢它的速度。

我不是 DBA,我还不知道如何选择一个好的索引来使我的查询更快。我可以改变表结构;没有负责数据库的 DBA,我在数据库服务器上拥有这样做的权限。

我应该采取哪些步骤来优化我的 SQL 查询?

4

1 回答 1

8

简介:这里有很多要讨论的内容,而且由于 SQL 的复杂性,任何人都无法完全帮助您完成查询——重要的是您的查询是什么、表有多大以及数据库是什么正在使用的系统是。如果您不知道什么是索引或如何使用它们,请参阅此处:数据库索引如何工作?.

注意事项:同样,如果您的系统有 DBA,请在索引任何内容之前与他们核实,尤其是在实时系统上。如果你对他们好,他们甚至可以提供帮助。如果系统被许多其他人使用,在更改索引等任何内容之前要小心。如果数据被用于多种查询类型,请确保您没有在它们上创建大量冲突或重叠的索引。

句法。标准 (SQL92) 使用:CREATE INDEX [index name] ON [table name] ( [column name] ). 这种语法几乎适用于任何系统。如果表上只需要一个索引,并且还没有聚集索引,则可以使用:CREATE [Unique] Clustered INDEX [index name] ON [table name] ( [column name] )- 如果不能有多个具有相同值的项,则它应该是唯一的。如果您不能让它工作,请参阅这篇文章了解更多详细信息:如何索引数据库列

哪些表应该被索引?任何用于查询的表,尤其是当数据是静态的或只获取新值时,都是很好的候选者。如果该表在您的查询中,并且有一个连接语句,您可能希望在被连接的列上有一个索引。

应该索引哪些列?有关于选择最佳索引以及如何正确索引数据库的完整书籍。如果您不想深入研究问题,索引的基本经验法则是:按以下顺序索引:

  1. 连接谓词 ( on Table1.columnA=Table2.ColumnA and Table1.columnB=Table2.ColumnQ)
  2. 过滤列 ( where Table1.columnN=’Bob’ and Table1.columnS<20)
  3. 排序方式/分组方式/等(如果可能,任何用于排序/分组的列都应该在索引中。)

还:

  • 使用有意义的数据类型 - 如果它是整数或日期,则不将任何内容存储为 varchar。(列宽很重要。尽可能使用最小的数据类型。)
  • 确保您的联接是相同的数据类型 - int 到 int,varchar 到 varchar,等等。
  • 如果可能,请在每个表中的每个连接谓词上使用唯一的非空索引。
  • 确保任何可能的列都是非空的。(如果它们不能包含空值,您可以使用以下语法。

     Alter table Table1 
        alter column columnN int not null
    

做这一切,你就会一路走好。但是,如果您经常需要这些东西,请学习它!买一本书,在线阅读,查找信息。那里有很多信息,而且这是一个很深的话题,但是如果您知道自己在做什么,就可以更好地进行查询。

于 2012-07-02T18:31:43.200 回答