有一个查询运行速度比我想要的慢,但我不能分享细节。查询已经返回正确的结果,我已经重构了它,但我无法让它足够快地运行。在可能的情况下,谓词已经Sarg-able。它已经正确地使用了连接,请求没有额外的表,并且不会不必要地复制行或使用嵌套的子查询以减慢它的速度。
我不是DBA,我不知道如何选择一个好的索引来加快查询速度。我可以改变桌子结构;没有DBA负责数据库,我在数据库服务器上拥有这样做的权限。
我应该采取哪些步骤来优化我的SQL查询?
答案 0 :(得分:7)
简介:这里有很多内容可以讨论,而且由于SQL的复杂性,任何人都无法完全帮助您查询 - 重要的是查询是什么,表的大小,以及使用的数据库系统是什么。如果您不知道索引是什么或如何使用它们,请参阅此处:How does database indexing work?。
预防措施:同样,如果您的系统有DBA,请在索引任何内容之前检查它们,尤其是在实时系统上。如果你对他们好的话,他们甚至可以提供帮助。如果系统被许多其他人使用,在更改索引之类的任何内容之前要小心。如果数据用于多种查询类型,请确保您没有在它们上创建大量冲突或重叠的索引。
语法。标准(SQL92)使用:CREATE INDEX [index name] ON [table name] ( [column name] )
。此语法几乎适用于任何系统。如果表中只需要一个索引,并且还没有聚簇索引,则可以使用:CREATE [Unique] Clustered INDEX [index name] ON [table name] ( [column name] )
- 如果不能有多个具有相同值的项,则它应该是唯一的。如果您无法解决此问题,请参阅此帖子了解更多详情:How do I index a database column。
应该将哪些表编入索引?任何用于查询的表,特别是如果数据是静态的或只获取新值,都是一个很好的选择。如果表在您的查询中,并且有一个join语句,您可能希望在要连接的列上有索引。
哪些列应编入索引?有关于选择最佳索引以及如何正确索引数据库的完整书籍。如果您不想深入研究问题,索引的基本经验法则是:按以下顺序索引:
on Table1.columnA=Table2.ColumnA and Table1.columnB=Table2.ColumnQ
)where Table1.columnN=’Bob’ and Table1.columnS<20
)此外:
确保可能的列不为空。 (如果它们不能包含空值,则可以使用以下语法。
Alter table Table1
alter column columnN int not null
做到这一切,你就会顺利完成。 但如果你经常需要这些东西,那就去学习吧!买书,在线阅读,找到相关信息。那里有很多信息,这是一个很深刻的话题,但如果你知道自己在做什么,你可以更好地进行查询。