Questions tagged «query-performance»

有关改善数据库查询的性能和/或效率的问题。

3
PostgreSQL顺序扫描而不是索引扫描为什么?
大家好我的PostgreSQL数据库查询有问题,想知道是否有人可以提供帮助。在某些情况下,我的查询似乎忽略了我创建的用于连接两个表data和的索引data_area。发生这种情况时,它将使用顺序扫描并导致查询慢得多。 顺序扫描(约5分钟) Unique (cost=15368261.82..15369053.96 rows=200 width=1942) (actual time=301266.832..301346.936 rows=153812 loops=1) CTE data -> Bitmap Heap Scan on data (cost=6086.77..610089.54 rows=321976 width=297) (actual time=26.286..197.625 rows=335130 loops=1) Recheck Cond: (datasetid = 1) Filter: ((readingdatetime >= '1920-01-01 00:00:00'::timestamp without time zone) AND (readingdatetime <= '2013-03-11 00:00:00'::timestamp without time zone) AND (depth >= 0::double …

1
寻求谓词与谓词之间的区别
我正在尝试性能调整SQL Server 2014 Enterprise中的查询。 我已经在SQL Sentry Plan Explorer中打开了实际的查询计划,并且可以在一个节点上看到它具有Seek谓词和Predicate。 Seek谓词和Predicate有什么区别? 注意:我可以看到此节点存在很多问题(例如,估计行与实际行,剩余IO),但问题与任何这些都不相关。

3
如何在一个查询中进行多个计数?
我用类似的查询来计数记录 SELECT COUNT(col1) FROM table1 WHERE col1 LIKE '%something%' SELECT COUNT(col1) FROM table1 WHERE col1 LIKE '%another%' SELECT COUNT(col1) FROM table1 WHERE col1 LIKE '%word%' 对于每个计数,mysql需要遍历整个表,如果表很长且有许多查询,这将是一个大问题。 我想知道是否有一种方法可以在一个查询中进行所有计数。在这种情况下,当mysql遍历每一行时,它将处理所有计数,而无需一遍又一遍地扫描整个表。

2
为什么DELETE查询以一种格式运行的时间要长于另一种格式?
我有特定的清理代码,试图删除一些重复项。 它可以在许多客户站点上完美运行。日志告诉我,此查询至少消耗1秒到45秒: DELETE FROM [tbl] WHERE [Id] NOT IN ( SELECT MIN([Id]) FROM [tbl] GROUP BY [IdProject], [IdRepresentative], [TimeStart] ) 但是我有一个客户,该查询运行了4个多小时(到现在为止还没有结束)!我检查了数据库(DBCC CHECKDB),我已经更新了统计信息(sp_updatestats),也UPDATE STATISTICS [tbl] WITH FULLSCAN没有显示任何更改。 我有客户的数据库原始备份。我在SQL Server 14.0.2002.14上运行它。我有标准版,客户使用Express Edition。 我可以在活动监视器中看到没有其他人正在使用该数据库。无需等待,CPU使用率达到25%(恰好是我4个CPU中的1个)。同样在这个测试用例中,没有其他人正在使用数据库。 我重新设计了查询并检查了以下语句: DELETE FROM [tbl] FROM [tbl] AS t LEFT OUTER JOIN ( SELECT MIN([Id]) AS [IdMin] FROM [tbl] GROUP …

1
分区约束不适用于涉及按时间戳进行分区的表的联接
我有一个分区表结构,如: CREATE TABLE measurements ( sensor_id bigint, tx timestamp, measurement int ); CREATE TABLE measurements_201201( CHECK (tx >= '2012-01-01 00:00:00'::timestamp without time zone AND tx < ('2012-01-01 00:00:00'::timestamp without time zone + '1 mon'::interval)) )INHERITS (measurements); CREATE INDEX ON measurements_201201(sensor_id); CREATE INDEX ON measurements_201201(tx); CREATE INDEX ON measurements_201201(sensor_id, tx); .... …

2
用于有效范围聚合查询的数据库?
作为一个简化的示例,假设我有一个像这样的表: seq | value ----+------ 102 | 11954 211 | 43292 278 | 19222 499 | 3843 该表可能包含数亿条记录,我需要经常执行以下查询: SELECT sum(value) WHERE seq > $a and seq < $b 即使seq已建立索引,典型的数据库实现也将遍历每一行以计算最佳情况下的总和O(n),其中n范围的大小是。 是否有任何数据库可以像在O(log(n))每个查询中一样有效地做到这一点? 我所遇到的数据结构称为段树所描述这里。尽管所有这些名称通常都被描述为数据结构略有不同的变体,但有时也称为范围树或间隔树。 但是,我还没有遇到任何实现这种数据结构的数据库。对于内存结构,从头开始实现它很容易,但是如果必须持久或太大而无法容纳到内存中,则变得棘手。如果有一个有效的模式可以在现有数据库之上实施,那也可能会有所帮助。 旁注:这不是仅追加表,因此在这种情况下,诸如保留累计和之类的解决方案将不起作用。

2
SARG基数估计,为什么不进行全扫描?
为什么没有全扫描(在SQL 2008 R2和2012上)? 测试数据: DROP TABLE dbo.TestTable GO CREATE TABLE dbo.TestTable ( TestTableID INT IDENTITY PRIMARY KEY, VeryRandomText VarChar(50), VeryRandomText2 VarChar(50) ) Go Set NoCount ON Declare @i int Set @i = 0 While @i < 10000 Begin Insert Into dbo.TestTable(VeryRandomText, VeryRandomText2) Values(Cast(Rand()*10000000 as VarChar(50)), Cast(Rand()*10000000 as VarChar(50))); Set @i …

3
改善STIntersects的性能
表格T_PIN有300,000个图钉和T_POLYGON36,000个多边形。T_PIN具有此索引: CREATE SPATIAL INDEX [T_PIN_COORD] ON [dbo].[T_PIN] ( [Coord] )USING GEOGRAPHY_GRID WITH (GRIDS =(LEVEL_1 = HIGH,LEVEL_2 = HIGH,LEVEL_3 = HIGH,LEVEL_4 = HIGH), CELLS_PER_OBJECT = 128, PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]; T_POLYGON 有: …

2
查找最长前缀的算法
我有两张桌子。 第一个是带有前缀的表 code name price 343 ek1 10 3435 nt 4 3432 ek2 2 其次是带有电话号码的通话记录 number time 834353212 10 834321242 20 834312345 30 我需要编写一个脚本,该脚本从每个记录的前缀中找到最长的前缀,并将所有这些数据写入第三张表,如下所示: number code .... 834353212 3435 834321242 3432 834312345 343 对于数字834353212,我们必须修剪“ 8”,然后从前缀表3435中找到最长的代码。 我们必须始终删除第一个“ 8”,并且前缀必须在开头。 我很久以前用非常糟糕的方式解决了这个任务。这是可怕的perl脚本,它对每个记录进行很多查询。该脚本: 从调用表中获取一个数字,在循环中从length(number)到1 => $ prefix做子字符串 进行查询:从前缀中选择count(*),例如“ $ prefix”之类的代码 如果count> 0,则使用第一个前缀并写入表 第一个问题是查询计数-是call_records * length(number)。第二个问题是LIKE表达式。恐怕这些很慢。 …

3
RESTful API的SQL数据库结构
我正在创建一个RESTful API。我正在努力决定围绕我的资源设计数据库表的最佳方法。 最初,尽管每个资源一个表都是一个不错的方法,但是现在我担心这会导致在资源链越远的地方,表成指数增长。 例如,假设我有三个资源-用户,客户,销售。用户是我api的订阅者,客户是用户客户,销售是每个客户对用户帐户的购买。 如下访问销售资源 GET /users/{userID}/clients/{clientID}/sales/{salesID} 因此,如果有10个用户,每个用户有10个客户,并且每个客户有10个销售量,那么随着我们走的资源链越远,表的大小就越大。 我相当有信心SQL可以应付大表,但是我不确定读写会如何减慢速度。上面的示例可能没有说明,但是我的api会在我们走的资源链中越来越多地进行更多的写入和读取。因此,在这种情况下,数据库中最大的表的读取和写入次数要比较小的表更多。 在运行查询之前,也有必要联接表。原因是我允许每个用户拥有一个具有相同名称的客户端。为避免获取错误的客户端数据,{userID}将users表和clients表连接在一起。销售情况也是如此。联接大表并运行会进一步降低读写速度吗?

4
SQL Server上的CPU使用率高-查询速度慢
这个问题不太可能对将来的访客有所帮助;它仅与较小的地理区域,特定的时间段或极为狭窄的情况(通常不适用于Internet的全球受众)有关。要获得使该问题更广泛适用的帮助,请访问帮助中心。 6年前关闭。 我们的MS SQL Server使用了大约95%的CPU能力。 重新启动服务器(硬件)或重新启动SQL-Service后,使用率为0%,并且在1-3天的过程中缓慢增加。取决于使用了多少。 当超过80%时,每个查询都会非常慢。 我们的网站正在处理大量重大查询,因此其中一些需要45-60秒。重新启动后(CPU使用率低于80%),相同的查询需要11到20秒的时间。 我怎样才能解决这个问题?我已经在线阅读了亲和力掩码可以调整CPU使用率的信息,但亲和力设置已禁用。我不能改变他们。这是因为我只有1个处理器吗? 与查询本身有关的技巧很多,但我们的网站和服务相当庞大,而且变化太多。 它们中的大多数已经非常优化。 即使只花了2秒钟,我也无法继续重启SQL服务,因为我们有一个警报服务,允许人们拨入并记录一条消息,然后将呼叫选定的组并听到记录的消息。 数百个Search and Rescue团队都使用此系统,如果SQL-Service在警报期间重新启动,它将终止,并且不会通知调用它的人员。 我搜索了整个地方,但是除了“亲和力面具”以外,什么都找不到,我无法更改。 必须有一种在不终止当前查询的情况下清除CPU缓存的方法...对吗? SQL: Microsoft SQL Server 11.0.2100.60 OS: Windows Server 2012 x64 Processor: 2.30 GHz RAM: 4.00 GB

1
使用Join和Window函数获取超前和滞后值之间的性能比较
我有20M行的表,每一行有3列:time,id,和value。对于每个id和time,value状态为。我想知道的超前滞后一定的值,time为特定的id。 我使用了两种方法来实现此目的。一种方法是使用连接,另一种方法是使用窗口函数超前/滞后以及在time和上的聚集索引id。 我按执行时间比较了这两种方法的性能。join方法需要16.3秒,而window函数方法需要20秒,这不包括创建索引的时间。这使我感到惊讶,因为在join方法是蛮力的情况下,窗口功能似乎已被改进。 这是这两种方法的代码: 创建索引 create clustered index id_time on tab1 (id,time) 加盟方法 select a1.id,a1.time a1.value as value, b1.value as value_lag, c1.value as value_lead into tab2 from tab1 a1 left join tab1 b1 on a1.id = b1.id and a1.time-1= b1.time left join tab1 c1 on a1.id = c1.id and a1.time+1 …

3
将标量函数转换为TVF函数以并行执行-仍在串行模式下运行
发布后,我的一个查询正在串行执行模式下运行,我注意到在视图中使用了两个新功能,该视图在从应用程序生成的LINQ to SQL Query中引用。因此,我将那些SCALAR函数转换为TVF函数,但查询仍在串行模式下运行。 早些时候,我在其他一些查询中将标量转换为TVF,它解决了强制串行执行的问题。 这是标量函数: CREATE FUNCTION [dbo].[FindEventReviewDueDate] ( @EventNumber VARCHAR(20), @EventID VARCHAR(25), @EventIDDate BIT ) RETURNS DateTime AS BEGIN DECLARE @CurrentEventStatus VARCHAR(20) DECLARE @EventDateTime DateTime DECLARE @ReviewDueDate DateTime SELECT @CurrentEventStatus = (SELECT cis.EventStatus FROM CurrentEventStatus cis INNER JOIN Event1 r WITH (NOLOCK) ON (cis.Event1Id = r.Id) WHERE (r.EventNumber …

1
什么规则确定何时SQL Server使用CTE作为“优化围栏”?
不久前,Brent Ozar发表了一篇文章,详细介绍了SQL Server和PostgreSQL之间的一些区别: SQL Server与PostgreSQL之间的两个重要区别 第一点(“ CTE是优化栅栏”)引起了我的注意,因为很明显,在所提供的示例中,SQL Server将CTE和主查询组合在一起,并将其优化为单个查询(与之相反的行为是, PostgreSQL)。 但是,此行为似乎与我在其他博客和培训课程中看到的示例相反,在这些示例中,SQL Server确实将CTE视为优化围栏,从而可以更好地使用索引,提高性能等。例如: 选择星号的更好方法 因此,似乎SQL Server有时会“荣誉” CTE作为优化的围栏。是否有可用的良好资源来记录已知情况的特定列表,在这些情况下,SQL Server将可靠地认可CTE作为优化范围(或相反的行为)?

3
由于varchar(max),将溢出溢出排序到tempdb
在具有32GB的服务器上,我们正在运行SQL Server 2014 SP2,最大内存为25GB,我们有两个表,在这里您可以找到两个表的简化结构: CREATE TABLE [dbo].[Settings]( [id] [int] IDENTITY(1,1) NOT NULL, [resourceId] [int] NULL, [typeID] [int] NULL, [remark] [varchar](max) NULL, CONSTRAINT [PK_Settings] PRIMARY KEY CLUSTERED ([id] ASC) ) ON [PRIMARY] GO CREATE TABLE [dbo].[Resources]( [id] [int] IDENTITY(1,1) NOT NULL, [resourceUID] [int] NULL, CONSTRAINT [PK_Resources] PRIMARY KEY CLUSTERED ([id] ASC) …

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.