SQL:优化问题,有行吗?

     2023-04-14     295

关键词:

【中文标题】SQL:优化问题,有行吗?【英文标题】:SQL: Optimization problem, has rows? 【发布时间】:2009-07-08 12:52:24 【问题描述】:

我在一些相当大的表(最大的表是 1000 万条记录)上有一个包含五个连接的查询,我想知道行是否存在。到目前为止,我已经这样做来检查行是否存在:

SELECT TOP 1 tbl.Id
FROM table tbl
INNER JOIN ... ON ... = ... (x5)
WHERE tbl.xxx = ...

使用此查询,在存储过程中需要 22 秒,我希望它接近“即时”。这甚至可能吗?我该怎么做才能加快速度?

我获得了我要加入的字段和 WHERE 子句中的字段的索引。

有什么想法吗?

【问题讨论】:

执行计划告诉你什么?你能发布计划吗? 【参考方案1】:

切换到 EXISTS 谓词。一般来说,我发现它比选择前 1 等更快。

所以你可以这样写IF EXISTS (SELECT * FROM table tbl INNER JOIN table tbl2 .. do your stuff

【讨论】:

我认为使用 top 意味着一个序列(即使你没有指定一个),所以你仍然会检查整个集合。 Exists 可以在找到单个匹配项后立即退出。 据我所知,只要找到匹配的行,EXISTS 就会返回。 使用 EXISTS 大约需要同样的时间 这仍然是一个大连接,之后存在:它与 TOP 1 没有什么不同。【参考方案2】:

根据您的 RDBMS,您可以检查查询的哪些部分花费了很长时间以及正在使用哪些索引(这样您就可以知道它们正在被正确使用)。

在 MSSQL 中,您可以使用查看您提交的任何查询的执行路径图。

在 Oracle 和 MySQL 中,您可以使用 EXPLAIN 关键字来获取有关查询如何工作的详细信息。

但可能只是 22 秒是您可以处理查询的最佳时间。我们无法回答这个问题,只有您的 RDBMS 提供的执行细节可以。如果您告诉我们您使用的是哪个 RDBMS,我们可以告诉您如何找到您需要的信息以了解瓶颈所在。

【讨论】:

听起来很有趣。我正在使用 MSSQL 2005。 打开 SQL Server Management Studio,然后打开一个新查询。输入您的查询,单击菜单中的查询,然后单击“包括实际执行计划”。运行您的查询,底部的一个选项卡将是服务器执行的每个步骤的图表,为您提供查询结果,以及使用的表以及每个步骤花费的时间。使用它来查找哪些部分花费的时间最长,并查看是否有任何更改或您可以添加的其他索引以加快速度。 我得到了一个成本为 25% 的哈希匹配内连接和一个成本为 63% 的聚集索引扫描。两者都与单个表有关。我该怎么办? 聚集索引扫描意味着查询正在查看索引中的每个条目。您应该尝试使用 WHERE 子句将其转换为索引 seek 。至于哈希匹配,这是你能得到的最好的内连接类型,所以如果它很慢,你所能做的就是尽量减少被连接的记录数。 我刚刚按照@gbn 的建议使用了 DTA,结果证明我的索引可能会好得多。我现在知道为什么了,而且我实际上从中学到了很多东西。也非常感谢@Welbog“学习”我查看执行计划 :-) 它也帮助了我很多。我的查询现在缩短到 ~1 秒。【参考方案3】:

4 个选项

尝试 COUNT(*) 代替 TOP 1 tbl.id

每列的索引可能不够好:您可能需要使用复合索引

您使用的是 SQL Server 2005 吗?如果 som,您可以找到缺失的索引。或者试试database tuning advisor

另外,您可能不需要 5 个联接。

假设父子孙等,那么没有父行就不能存在孙行(假设你有外键)

所以你的查询可能变成

SELECT TOP 1
   tbl.Id --or count(*)
FROM
   grandchildtable tbl
   INNER JOIN
   anothertable ON ... = ...
WHERE
   tbl.xxx = ...
试试 EXISTS。

对于 5 个表或假设的层次结构

SELECT TOP 1 --or count(*)
   tbl.Id
FROM
   grandchildtable tbl
WHERE
   tbl.xxx = ...
   AND
   EXISTS (SELECT *
       FROM
           anothertable T2
       WHERE
           tbl.key = T2.key /* AND T2 condition*/)
-- or
SELECT TOP 1 --or count(*)
   tbl.Id
FROM
   mytable tbl
WHERE
   tbl.xxx = ...
   AND
   EXISTS (SELECT *
       FROM
           anothertable T2
       WHERE
           tbl.key = T2.key /* AND T2 condition*/)
   AND
   EXISTS (SELECT *
       FROM
           yetanothertable T3
       WHERE
           tbl.key = T3.key /* AND T3 condition*/)

【讨论】:

如何找到缺失的索引? 更好的是,我在某处阅读然后使用 dmv 缺少索引脚本。 google.co.uk/… DTA 帮助了我很多。谢谢@gbn!【参考方案4】:

如果你能做到的话,在你第一次选择的早期进行过滤会有所帮助;当您在第一个实例中过滤数据时,所有连接都将连接到减少的数据。

Select top 1 tbl.id
From 
(
Select top 1 * from 
table tbl1
Where Key = Key
) tbl1
inner join ... 

之后,您可能需要提供更多查询以了解其工作原理。

【讨论】:

【参考方案5】:

也许您可以卸载/缓存这个事实调查任务。就像它不需要动态或在运行时完成一样,只需将结果缓存到一个小得多的表中,然后查询它。此外,请确保您要查询的所有表都具有适当的聚集索引。当然,您可能会将这些表用于其他类型的查询,但要获得绝对最快的方法,您可以针对这一查询调整所有聚集索引。

编辑:是的,其他人说的。测量,测量,测量!您的查询计划估计可以显示您的瓶颈是什么。

【讨论】:

【参考方案6】:

在每个连接中首先使用最大行表,如果有多个条件使用 在 where then where is 条件的顺序很重要 使用条件 这会给你最大的行数。

非常谨慎地使用过滤器来优化查询。

【讨论】:

如果满足条件,SQL Count 函数计算所有行

...tioncountallrowsifaconditionismet【发布时间】:2015-06-1406:55:40【问题描述】:我有一个客户表、一个项目表和一个包含以下列的交易表:客户-ID、姓名项目-ID、描述Transaction-ID,CustID(外键Customer(ID)),ItemID(外键Item(ID))使用这个查询,谁能... 查看详情

SQL Server NOLOCK 提示会返回部分写入的行吗?

...CKhintreturnpartiallywrittenrows?【发布时间】:2009-10-0219:25:58【问题描述】:首先,我不是在问是否应该使用NOLOCK。让我们过去吧。我想问题归结为sqlserver如何写入数据?是一次写入一整行还是一次写入一列?我问是因为正在考虑NOLOCK... 查看详情

可以有一个与数据库无关的 SQL 查询来获取前 N 行吗?

...-agnosticSQLquerytofetchtopNrows?【发布时间】:2010-10-2322:05:56【问题描述】:我们希望能够使用SQL查询选择前N行。目标数据库可以是Oracle或MySQL。有没有一种优雅的方法?(不用说,我们在这里处理已排序的数据。)【问题讨论】:【... 查看详情

我可以使用 SQL 将存储为 CSV(逗号分隔值)的表列的内容拆分为新表中的单独行吗?

...es)intoindividualrowsinanewtable?【发布时间】:2015-03-1318:26:03【问题描述】:我看到有几个相关问题的答案,但不完全是我需要的,所以我会问一个新问题。我有这 查看详情

检查哪些视图有行

...题】:Checkwhichviewshaverows【发布时间】:2018-08-1614:29:57【问题描述】:我有一个包含300多个视图的数据库,其中大部分视图都是空的。我需要知道哪些视图有行。是否有查询来检查这些视图中的哪些有行?【问题讨论】:视图实... 查看详情

sql里用concat连接的字符串可以输出换行吗?

比如concat('ABC','efg'),能不能输出成ABC和efg各一行?参考技术A中间加一个换行符试试concat('ABC',"\n",'efg')追问不行的,报错,试过换行符加单引号、双引号和不加引号都不行,列名\n无效 查看详情

SQL 查询优化 - 性能问题

】SQL查询优化-性能问题【英文标题】:SQLQueryoptimization-performanceissues【发布时间】:2019-01-2214:18:50【问题描述】:我有以下要优化的SQL查询:selecttable1.tiersascol1,table1.id_itemascol2fromitemstable1where(table1.tiersisnotnull)andtable1.tiers<>\'\... 查看详情

DBReader 有行但 Read() 返回 false

】DBReader有行但Read()返回false【英文标题】:DBReaderhasrowsbutRead()returnsfalse【发布时间】:2016-11-0318:56:19【问题描述】:using(varconn=newSqlConnection(connectionString))varcmd=newSqlCommand("SELECT*FROMmySchema.MyTable",conn);conn.Open();va 查看详情

sql查询优化(代码片段)

                      SQL查询优化一、获取有性能问题SQL的三种方法  通过用户反馈获取存在性能问题的SQL  通过慢查询日志获取存在性能问题的SQL  实时获取存在性能问题的SQL二、慢查询日志介绍  1、使用慢查... 查看详情

JOIN 中的 Sql 查询优化问题

】JOIN中的Sql查询优化问题【英文标题】:SqlQueryoptimizationIssueinJOIN【发布时间】:2016-06-2807:20:28【问题描述】:我在一个查询中有多个JOIN语句,我必须检查JOIN中的两个设置。如何以最好的方式做到这一点?table:WebSettings------------... 查看详情

SQL Server 查询优化器问题

】SQLServer查询优化器问题【英文标题】:SQLServerQueryoptimiserproblem【发布时间】:2011-03-0916:38:38【问题描述】:SQLServer优化查询的方式似乎导致它中断。下面用两个例子来说明这一点:SELECTdistinctET.ElementName,ET.Shared,CONVERT(float,ED.Valu... 查看详情

Sql优化技巧

】Sql优化技巧【英文标题】:SqloptimizationTechniques【发布时间】:2010-11-1015:10:01【问题描述】:我想了解拥有近80,000条记录的数据库的优化技术,优化的可能性列表我在android平台上用于我的移动项目我使用sqlite,我需要很多时间... 查看详情

sql优化方法论

...甚至找不出哪些SQL影响了系统。即便找到也不知如何动手优化。SOL优化是一个复杂的工程。指导SQL优化的方法论是什么?您好,这个微课重点讲解SQL优化方法论。假如你已经知道系统的问题出在数据库。那请问,是SQL... 查看详情

从没有行的计数中获取 0 值

...:Get0valuefromacountwithnorows【发布时间】:2011-06-1911:10:34【问题描述】:我有选择:SELECTcFROM(SELECT"candidate_id"asid,count("candidate_id")ascFROM"Applicaions"GROUPBY"candidate_id")assWHEREid=_SOME_ID_;但这只会在count&am 查看详情

sql连接优化[关闭]

】sql连接优化[关闭]【英文标题】:sqlconnectionoptimization[closed]【发布时间】:2017-09-1606:54:15【问题描述】:我有两个关于在c#中使用sqlserver2008的问题。问题1:c#中连接sqlserver2005的同时查询数是多少?我的连接字符串是:DataSource=l... 查看详情

您如何有效地确定 Postgres 表是不是有行

...地确定Postgres表是否有行【发布时间】:2010-09-1901:07:56【问题描述】:我做了这个测试,结果似乎计数函数是线性缩放的。我有另一个函数非常依赖效率来知道是否有任何数据,所以我想知道如何用另一个更有效的(可能是常数... 查看详情

SQL查询优化

】SQL查询优化【英文标题】:SQLqueryoptimisation【发布时间】:2011-05-1410:43:29【问题描述】:我想优化以下语句,如果可能的话,最好是单个查询:SELECT*FROMaWHEREstatus=\'x\'ANDa_date只有当第一个语句返回NULL时才应评估第二个语句。我... 查看详情

查询优化的 SQL 提示 [关闭]

】查询优化的SQL提示[关闭]【英文标题】:SQLTipsforQueryOptimization[closed]【发布时间】:2021-02-0507:11:22【问题描述】:我是SQL新手,有一个关于优化的一般性问题。根据您的个人经验,为了编写优化查询,我应该考虑哪些事项?是... 查看详情