当前位置: 首页 > 面试题库 >

如何优化此SQL查询(使用索引)?[关闭]

袁子瑜
2023-03-14
问题内容

在这里很难说出要问什么。这个问题是模棱两可,含糊不清,不完整,过于宽泛或夸张的,不能以目前的形式合理地回答。如需帮助澄清此问题以便可以重新打开,
请访问帮助中心。

8年前关闭。

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

我不是DBA,而且我已经不知道如何选择一个好的索引来加快查询速度。我可以更改表结构;没有DBA负责数据库,我拥有数据库服务器的权限。

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


问题答案:

简介: 这里有很多要讨论的内容,由于SQL的复杂性,任何人都不可能完全帮助您进行查询-
这与查询的内容,表的大小以及表的大小有关。正在使用的数据库系统是。如果您不知道什么是索引或如何使用索引,请参见此处:数据库索引如何工作?。

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

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

应该为哪些表建立索引?
用于查询的任何表(尤其是数据是静态的或仅获取新值的表)都是不错的选择。如果该表在您的查询中,并且具有join语句,则您可能希望在要连接的列上有一个索引。

应该为哪些列编制索引? 有很多关于选择最佳索引以及如何正确索引数据库的书籍。如果您不想深入研究索引,建立索引的基本经验法则是:按以下顺序进行索引:

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

还:

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

完成所有这些操作,您就可以顺利进行。 但是,如果您定期需要这些东西,请学习它!
买书,在线阅读,查找信息。那里有很多信息,这是一个很深的话题,但是如果您知道自己在做什么,则可以使查询更好。



 类似资料:
  • 我在索引此查询时遇到问题: 结果是: 我知道它显示0.00秒是执行时间,但此查询将运行多次,它显示它会减慢我的数据库,我不知道为什么! 每次我看到行检查是459448这个查询,所以它在某些原因对我的工作相当糟糕。 有人能给个建议吗?我如何为odata表制作合适的索引?或者我可以使用子查询来修复它? 这些表是: 解释odata: 并解释 wdata: 不得不说wdata.id和odata.vref已

  • 本文向大家介绍Mysql使用索引实现查询优化,包括了Mysql使用索引实现查询优化的使用技巧和注意事项,需要的朋友参考一下 索引的目的在于提高查询效率,可以类比字典,如果要查“mysql”这个单词,我们肯定需要定位到m字母,然后从下往下找到y字母,再找到剩下的sql。如果没有索引,那么你可能需要把所有单词看一遍才能找到你想要的。 1.索引的优点 假设你拥有三个未索引的表t1、t2和t3,每个表都分

  • 问题内容: 我有一个查询,使用带通配符的“ like”来搜索客户端。例如: 它还可以在“ where”子句中使用较少的参数,例如: 谁能说出优化这种查询性能的最佳方法是什么?也许我需要创建一个索引?该表在生产中最多可以有1000K条记录。 问题答案: 要在模式具有表单的位置上做很多事情,您需要查找SQL Server的全文本索引功能,并使用代替。照原样,您正在执行全表扫描,因为普通索引对搜索以通配

  • 在MySQL数据库中,我遇到了一个问题,当我在执行一个JOIN查询时,发现查询性能显著降低,特别是在两个大表之间进行JOIN操作时。我的两个表分别是orders(订单表,大约有1000万条记录)和customers(客户表,大约有500万条记录),它们通过customer_id字段相关联。我已经为这两个表的customer_id字段建立了索引,但是在执行如下JOIN查询时,耗时仍然较长: 运行环境

  • 问题内容: 我有两个表: 这是我的查询: 并为此: 它在第一个表上使用的全索引扫描进行排序,但不使用y索引进行连接(在解释中)。这对性能非常不利,并且会杀死整个数据库服务器,因为这是一个非常频繁的查询。 我尝试使用反转表顺序,但这给了,甚至更糟。 有什么办法可以使mysql同时使用索引进行连接和排序? ===更新=== 我真的很绝望。也许某种形式的非规范化可以在这里有所帮助? 问题答案: 如果您有

  • 问题内容: 我最近一直念叨如何和作品。我的理解很简单(如果有错,请纠正我): 的数据结构,其背和IS :根据索引列(或键)对数据进行物理排序。每个只能有一个。如果在创建表的过程中未指定No ,则服务器将在上自动创建一个。 问题1 :由于数据是根据索引进行物理排序的,因此这里不需要额外的空间。这样对吗?那么,当我删除创建的索引时会发生什么? :在中,树的包含列值和指向数据库中实际行的指针(行定位符)