Questions tagged «optimization»

在数据库的上下文中,优化是指查询优化器选择有效的物理执行计划的过程。

2
使用来自组的先前填充日期的数据值填写缺少的日期
绘制在部门之间转移的服务台票证。我们想知道开票当天每一天的部门是什么。该表包含每个票证在其打开的每一天的最后一个部门,该部门发生更改(包括最初打开票证的日期和关闭票证的日期的行)。数据表如下所示: CREATE TABLE TicketAssigment ( TicketId INT NOT NULL, AssignedDate DATE NOT NULL, DepartmentId INT NOT NULL); 我需要的是使用每个DateId的前一个TicketAssigment行中的DepartmentId填写每个TicketId的所有缺失日期。 如果我有这样的TicketAssigment行: 1, '1/1/2016', 123 -- Opened 1, '1,4,2016', 456 -- Transferred and closed 2, '1/1/2016', 25 -- Opened 2, '1/2/2016', 52 -- Transferred 2, '1/4/2016', 25 -- Transferred and closed 我想要这个输出: 1, …


1
慢查询未记录
我试图在我们的服务器上启用慢速查询日志记录,以便识别可以使用优化的任何查询。听起来很简单,但是没有写入我的文件。我没有收到任何错误或类似信息,似乎没有记录缓慢的查询。我记得配置更改后重新启动mysql。 我正在使用MySQL Ver 5.1.61。这是my.cnf中的内容: slow-query-log=1 slow-query-log-file=/var/logs/my.slow.log long_query_time=1 文件/var/logs/my.slow.log以mysql作为所有者,也是出于调试的目的,我对日志文件进行了所有读/写操作。 我在上面将long_query_time设置为1,因为我只是想看看它是否在工作。我尝试将其设置得较低(例如0.3),但仍然没有记录任何内容。我知道我的应用程序正在运行的查询需要1秒钟以上的时间,并且我还故意SELECT sleep(10);在终端中运行了查询日志()进行测试,并且该日志仍然为空。 我看了看文档,从中可以看出这应该行得通。有人对我做错了什么建议吗?任何建议将不胜感激,非常感谢! 编辑:根据评论中的要求,我运行了查询: `SELECT variable_value FROM information_schema.global_variables WHERE variable_name IN ('slow_query_log','slow_query_log_file','long_query_time');` 结果: 10.0000000 /var/run/mysqld/mysqld-slow.log OFF 显然,我的配置更改没有考虑在内,因为我相信这些是默认设置。我非常确定我正在修改的my.cnf文件已被解析,好像我输入了无效值一样mysql重启时将出错。这可能是怎么回事? 另一个编辑: 采纳@RolandoMySQLDBA的建议并将慢速查询配置行移至[mysqld]我的设置后,似乎可以节省。现在,上面的variable_value查询的结果是: 1.0000000 /var/logs/my.slow.log ON 但是我仍然没有看到文件my.slow.log被写入。我认为这不是权限问题,因为该文件由mysql拥有,并且我已为该文件上的所有用户添加了所有权限。有人能想到为什么这样不起作用的原因吗? 编辑:解决了!慢查询日志的路径不正确,应该是/var/log/my.slow.log而不是/ var / log * s * / my.slow.log。感谢大家的帮助,我学会了分配!

1
为什么这些类似的查询使用不同的优化阶段(事务处理与快速计划)?
此连接项中的示例代码 显示一个错误 SELECT COUNT(*) FROM dbo.my_splitter_1('2') L1 INNER JOIN dbo.my_splitter_1('') L2 ON L1.csv_item = L2.csv_item 返回正确的结果。但是以下内容返回的结果不正确(2014年使用新的Cardinality Estimator) SELECT (SELECT COUNT(*) FROM dbo.my_splitter_1('2') L1 INNER JOIN dbo.my_splitter_1('') L2 ON L1.csv_item = L2.csv_item) 因为它错误地将L2的结果加载到公共子表达式假脱机中,然后重播L1结果的结果。 我对为什么两个查询之间的行为差​​异感到好奇。跟踪标志8675显示工作的一个进入search(0) - transaction processing而失败的一个进入search(1) - quick plan。 因此,我认为其他转换规则的可用性是行为差异的背后原因(例如,禁用BuildGbApply或GenGbApplySimple似乎可以解决此问题)。 但是,为什么针对这些非常相似的查询的两个计划会遇到不同的优化阶段?根据我的阅读search (0),至少需要三个表,并且在第一个示例中肯定不满足该条件。


2
为什么此查询不使用我的非聚集索引,我该如何进行查询?
在跟进有关提高查询性能的这个问题之后,我想知道是否有一种方法可以使我的索引默认使用。 该查询运行大约2.5秒: SELECT TOP 1000 * FROM [CIA_WIZ].[dbo].[Heartbeats] WHERE [DateEntered] BETWEEN '2011-08-30' and '2011-08-31'; 这大约需要33毫秒: SELECT TOP 1000 * FROM [CIA_WIZ].[dbo].[Heartbeats] WHERE [DateEntered] BETWEEN '2011-08-30' and '2011-08-31' ORDER BY [DateEntered], [DeviceID]; [ID]字段(pk)上有一个聚集索引,[DateEntered],[DeviceID]上没有聚集索引。第一个查询使用聚集索引,第二个查询使用我的非聚集索引。我的问题分为两个部分: 为什么,由于两个查询在[DateEntered]字段上都有WHERE子句,服务器为什么在第一个而不是第二个上使用聚集索引? 即使没有orderby,如何使该查询默认使用非聚集索引?(或者为什么我不想要那种行为?)

2
有多少存储过程参数太多?
我刚刚开始在SQL Server 2008中编写存储过程,并且有30多个参数。我从来没有写过超过10个参数,而这让我开始思考...什么时候有太多参数? 对于背景...这个程序基本上将INSERT单列成一个单一的表。也将有一个非常相似的地方。尽管稍小;对同一张表执行UPDATE的版本。大多数列相对较小,混合使用int和字符串(varchar(200))。 有什么问题;是好是坏; 一个具有大量参数的程序,我应该开始考虑其他模式的门槛是什么?

2
与索引相关的NOT逻辑的使用
根据Microsoft的有关数据库开发的书,考试70-433:Microsoft SQL Server 2008数据库开发: 前导通配符和NOT逻辑都不允许查询优化器使用索引来优化搜索。为了获得最佳性能,应避免使用NOT关键字和前导通配符。 所以我认为是NOT IN,NOT EXISTS等等 现在关于这个SO问题,我认为@GBN选择的解决方案将违反上面给出的声明。 显然,事实并非如此。 所以我的问题是:为什么?


2
大表中索引扫描缓慢
使用PostgreSQL 9.2时,我在相对较大的表(200+百万行)上的慢查询遇到了麻烦。我没有尝试任何疯狂的事情,只是增加了历史价值。以下是查询和查询计划输出。 我的表格布局: Table "public.energy_energyentry" Column | Type | Modifiers -----------+--------------------------+----------------------------------------------------------------- id | integer | not null default nextval('energy_energyentry_id_seq'::regclass) prop_id | integer | not null timestamp | timestamp with time zone | not null value | double precision | not null Indexes: "energy_energyentry_pkey" PRIMARY KEY, btree (id) "energy_energyentry_prop_id" btree (prop_id) …

2
Postgres JOIN条件与WHERE条件
Postgres新手在这里。 我想知道此查询是否已优化?我尝试仅加入100%必需的值,并将所有动态条件保留在WHERE子句中。见下文。 SELECT * FROM myapp_employees JOIN myapp_users ON myapp_users.user_id=myapp_employees.user_id JOIN myapp_contacts_assoc ON myapp_contacts_assoc.user_id=myapp_users.user_id JOIN myapp_contacts ON myapp_contacts.contact_id=myapp_contacts_assoc.contact_id WHERE myapp_contacts.value='test@gmail.com' AND myapp_contacts.type=(1)::INT2 AND myapp_contacts.is_primary=(1)::INT2 AND myapp_contacts.expired_at IS NULL AND myapp_employees.status=(1)::INT2 AND myapp_users.status=(1)::INT2 LIMIT 1; 注意:对于上下文,此proc正在检查用户是否也是雇员(特权/不同用户类型)。 无论如何,这是正确的方法吗?例如,JOIN ON是否应该包含更多的语句,例如检查是否为expired_at IS NULL?为什么或为什么这没有道理?

2
MAXDOP = 1,并行查询提示和成本阈值
如果实例MAXDOP设置为1,并且查询提示用于允许特定查询并行进行,那么SQL仍然使用“并行成本阈值”来决定是否实际并行吗? 尽管此链接建议CTFP如果MAXDOP为1 ,则将其忽略。尽管有任何查询,无论成本如何,在没有查询提示的情况下,当MAXDOP值为1 时,它都将并行进行。 谁能让我知道这两个请求的预期行为? 范例1: Instance Maxdop: 1 CTFP: 50 Query hint: Maxdop=2 Query cost: 30 范例2: Instance Maxdop: 1 CTFP: 50 Query hint: Maxdop=2 Query cost: 70

2
如何减少行估计以减少溢出到tempdb的机会
我注意到,当tempdb事件大量溢出(导致查询缓慢)时,对于特定的联接,行估计常常会偏离。我已经看到溢出事件是通过合并和哈希联接发生的,它们通常会将运行时间增加3倍至10倍。这个问题涉及如何在减少溢漏事件机会的假设下改进行估计。 实际行数40k。 对于此查询,计划显示错误的行估计(11.3行): select Value from Oav.ValueArray where ObjectId = (select convert(bigint, Value) NodeId from Oav.ValueArray where PropertyId = 3331 and ObjectId = 3540233 and Sequence = 2) and PropertyId = 2840 option (recompile); 对于此查询,该计划显示了良好的行估计(56k行): declare @a bigint = (select convert(bigint, Value) NodeId from Oav.ValueArray where PropertyId = 3331 and …

1
Postgres:count(*)vs count(id)
我在文档中看到了count(*)和之间的区别count(pk)。我一直在使用count(pk)(这里pk是SERIAL PRIMARY KEY)不知道约的存在count(*)。 我的问题是关于Postgres的内部优化。是否足够聪明地知道SERIAL PRIMARY KEY每行中都会存在一个a ,并且永远不会为假,仅对行进行计数?还是会对每行进行多余的谓词检查?我同意这可能是毫无意义的优化,但我很好奇。 我看了看输出EXPLAIN和EXPLAIN VERBOSE为count(*),count(id)并count(id > 50)看看是否EXPLAIN提到检查其输出的断言。没有。

1
为什么CTE比内联子查询差很多
我试图更好地了解查询计划程序在postgresql中的工作方式。 我有这个查询: select id from users where id <> 2 and gender = (select gender from users where id = 2) order by latest_location::geometry <-> (select latest_location from users where id = 2) ASC limit 50 它在我的数据库上运行的时间不到10ms,在users表中有大约500k条目。 然后,我认为为避免重复的子选择,我可以将查询重写为CTE,如下所示: with me as ( select * from users where id = 2 …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.