在Microsoft SQL Server中,如何获取查询/存储过程的查询执行计划?
我想知道"位图堆扫描"的原理,我知道当我OR
在条件中执行查询时经常发生这种情况.
谁能解释"位图堆扫描"背后的原理?
在尝试理解SQL语句的执行方式时,有时建议您查看解释计划.在解释(理解)解释计划时应该经历的过程是什么?应该突出的是,"哦,这真的很棒吗?" 与"哦不,那不对."
在SQL Server执行计划中,索引扫描和索引搜索之间的区别是什么
我在SQL Server 2005上.
我正在尝试优化查询,但不太了解解释计划返回的一些信息.谁能告诉我OPTIONS和COST专栏的重要性?在OPTIONS列中,我只看到单词FULL.在COST专栏中,我可以推断出较低的成本意味着更快的查询.但是,成本价值究竟代表什么,可接受的阈值是多少?
在数据库方面,我是一个相对新手.我们正在使用MySQL,而我正在尝试加速似乎需要一段时间才能运行的SQL语句.我在SO上寻找类似的问题,但没找到.
目标是删除表A中表B中具有匹配id的所有行.
我目前正在做以下事情:
DELETE FROM a WHERE EXISTS (SELECT b.id FROM b WHERE b.id = a.id);
Run Code Online (Sandbox Code Playgroud)
表a中约有100K行,表b中约有22K行.列'id'是两个表的PK.
这个声明在我的测试盒上运行大约需要3分钟 - 奔腾D,XP SP3,2GB内存,MySQL 5.0.67.这对我来说似乎很慢.也许不是,但我希望加快速度.是否有更好/更快的方法来实现这一目标?
编辑:
一些可能有用的其他信息.表A和B具有与我创建表B时所做的相同的结构:
CREATE TABLE b LIKE a;
Run Code Online (Sandbox Code Playgroud)
表a(以及表b)有一些索引可以帮助加快针对它的查询.再说一遍,我是DB工作的相对新手,还在学习.我不知道这对事情有多大影响,如果有的话.我认为它确实有效,因为索引也必须清理,对吧?我还想知道是否有任何其他数据库设置可能会影响速度.
另外,我正在使用INNO DB.
以下是一些可能对您有所帮助的其他信息.
表A有一个类似于此的结构(我已经对此进行了清理):
DROP TABLE IF EXISTS `frobozz`.`a`;
CREATE TABLE `frobozz`.`a` (
`id` bigint(20) unsigned NOT NULL auto_increment,
`fk_g` varchar(30) NOT NULL,
`h` int(10) unsigned default NULL,
`i` longtext,
`j` bigint(20) NOT NULL,
`k` bigint(20) default NULL,
`l` varchar(45) NOT NULL,
`m` int(10) unsigned default NULL,
`n` varchar(20) default …
Run Code Online (Sandbox Code Playgroud) 我正在帮助维护一个程序,该程序本质上是一个大而复杂的MySQL数据库的友好只读前端 - 该程序从用户输入构建临时SELECT查询,将查询发送到DB,获取结果,对它们进行后处理,并将它们很好地显示给用户.
我想为构造的查询的预期性能添加某种形式的合理/启发式预测 - 有时用户无意中进行的查询不可避免地需要花费很长时间(因为它们将返回大量结果集,或者因为它们'重新"反对数据库索引的方式",我希望能够向用户显示一些"有些可靠"的信息/猜测查询将花多长时间.它不一定是完美的,只要它不会如此糟糕,经常与现实打成一团,导致"哭狼"效应,用户学会忽视它;-)基于这个信息,用户可能决定去喝咖啡(如果估计是5-10分钟),去吃午餐(如果是30-60分钟),杀死查询并尝试其他方式(可能对他们要求的信息有更严格的限制) )等等
我对MySQL的EXPLAIN语句不是很熟悉 - 我看到很多关于如何使用它来优化查询或数据库模式,索引等的信息,但对于如何将它用于我更有限的目的却没有太多信息 - 简单地进行预测,将DB作为给定(当然,如果预测足够可靠,我最终可能会转而使用它们来在查询可以采用的替代形式之间进行选择,但是,这是为了将来:现在,为了上述目的,我只是为了向用户展示性能猜测而感到高兴.
任何指针......?
我正在尝试确定两个不同查询的相对性能,并且有两种方法可以测量这个:
1.运行两个和每个查询的时间
2.运行两个并从实际执行计划中获取"查询成本"
这是我为查询定时运行的代码...
DBCC FREEPROCCACHE
GO
DBCC DROPCLEANBUFFERS
GO
DECLARE @start DATETIME SET @start = getDate()
EXEC test_1a
SELECT getDate() - @start AS Execution_Time
GO
DBCC FREEPROCCACHE
GO
DBCC DROPCLEANBUFFERS
GO
DECLARE @start DATETIME SET @start = getDate()
EXEC test_1b
SELECT getDate() - @start AS Execution_Time
GO
Run Code Online (Sandbox Code Playgroud)
我得到的是以下内容:
Stored_Proc Execution_Time Query Cost (Relative To Batch)
test_1a 1.673 seconds 17%
test_1b 1.033 seconds 83%
Run Code Online (Sandbox Code Playgroud)
执行时间的结果直接与查询成本的结果相矛盾,但我很难确定"查询成本"实际意味着什么.我最好的猜测是它是Reads/Writes/CPU_Time/etc的集合,所以我想我有几个问题:
有没有明确的来源来解释这项措施的含义?
人们使用什么其他"查询性能"指标,它们的相对优点是什么?
值得注意的是,这是一个中型SQL Server,在MS Server 2003 Enterprise Edition上运行MS SQL Server 2005,具有多个处理器和100多个并发用户.
编辑:
经过一番麻烦后,我设法在该SQL Server上获得了Profiler访问权限,并且可以提供额外的信息(支持查询成本与系统资源相关,而不是执行时间本身...)
Stored_Proc …
Run Code Online (Sandbox Code Playgroud) sql sql-server optimization sql-server-2005 sql-execution-plan
在explain命令的输出中,我发现了两个术语'Seq Scan'和'Bitmap heap Scan'.有人能告诉我这两种类型的扫描有什么区别吗?(我正在使用PostgreSql)
postgresql optimization query-optimization sql-execution-plan
我有几个SQL查询具有非常低的查询运行性能,我想检查此查询的查询执行计划.我试图执行以下查询,但它没有显示任何查询执行计划.它唯一的显示消息计划FOR成功.我不知道是否有任何设置我们必须在oracle sql开发人员中查找解释查询计划:
EXPLAIN PLAN FOR
Select SO.P_OPTION_ID FROM
SIMSIM
JOIN P_TYPE PT on PT.KEY=SIM.P_TYPE_KEY JOIN P_CONFIG PC ON PC.ID=PT.PRODUCT_CONFIG_ID
JOIN P_OPTION PO ON PO.OPTION_KEY=PC.DEFAULT_PRODUCT_OPTIONS JOIN S_OPTION SO ON SO.SERVICE_ID=SIM.ASSIGNED_TO_SERVICE_ID
JOIN AVV_NO AN ON SIM.ASSIGNED_ANUMBER_ID = AN.ID
where SO.STATUS_ID IN (20,40)
and SO.ID < to_char(SYSDATE - numtodsinterval ( 1,'MINUTE' ), 'YYYYMMDDHH24MISS')||'0000'
and SO.ID > to_char(SYSDATE - numtodsinterval ( 1, 'HOUR' ), 'YYYYMMDDHH24MISS')||'0000'
and NOT EXISTS(SELECT ID from TEMP_BPL T WHERE T.ID = SO.ID );
Run Code Online (Sandbox Code Playgroud) sql ×5
oracle ×3
performance ×3
sql-server ×3
mysql ×2
optimization ×2
postgresql ×2
database ×1
indexing ×1
sql-delete ×1
t-sql ×1