Questions tagged «optimization»

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


2
使用索引日期时间列的MySQL性能问题
我试图解决以下问题大约一个小时,但仍然没有解决任何问题。 好的,我有一张桌子(MyISAM): +---------+-------------+------+-----+-------------------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+-------------------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | http | smallint(3) | YES | MUL | 200 | | | elapsed | float(6,3) | NO | | …

6
存储过程的突然执行计划
我试图了解SQL Server 2000所遇到的问题。我们是一个中等交易量的网站,我们有一个存储的proc调用sp_GetCurrentTransactions,它接受一个customerID和两个日期。 现在,根据日期和客户,此查询可以返回从零到1000s的行。 问题是:我们经历过的是,突然之间Execution Timeout Expired,当特定客户端尝试执行该存储的proc时,我们将获得许多错误(通常是类似错误)。因此,我们检查了查询,在SSMS中运行该查询,发现它花费了30秒。因此,我们重新编译存储的proc,然后-bang-它现在可以在300ms内运行。 我已经与我们的DBA谈过此事。他告诉我,当我们创建存储的proc时,数据库创建了一个查询计划。他说这对那组参数来说是一个很好的计划,但是如果您向它扔一些参数,那么该计划将不是该数据的最佳计划,因此您会发现它运行缓慢。 呈现给我的选项是将问题查询从存储的proc转移回动态SQL,该SQL具有每次运行时创建的执行计划。 这感觉就像是退后了一步,我觉得必须有一种解决方法。还有其他方法可以解决此问题吗? 任何和所有答复表示赞赏。

5
如何在大表上使用LEFT JOIN优化非常慢的SELECT
我正在谷歌搜索,自我教育和寻找解决方案数小时,但没有运气。我在这里找到了一些类似的问题,但不是这种情况。 我的桌子: 人(约1000万行) 属性(位置,年龄,...) 人与属性之间的链接(M:M)(约4000万行) 完整转储〜280MB 情况: 我尝试person_id从某些位置(location.attribute_value BETWEEN 3000 AND 7000),性别(gender.attribute_value = 1),出生年份(bornyear.attribute_value BETWEEN 1980 AND 2000)和眼睛颜色(eyecolor.attribute_value IN (2,3))选择所有人的身份()。 这是我的询问女巫用了3〜4 分钟。我想优化: SELECT person_id FROM person LEFT JOIN attribute location ON location.attribute_type_id = 1 AND location.person_id = person.person_id LEFT JOIN attribute gender ON gender.attribute_type_id = 2 AND gender.person_id = person.person_id …

3
为什么MySQL甚至对这个顺序强制也忽略索引?
我运行EXPLAIN: mysql> explain select last_name from employees order by last_name; +----+-------------+-----------+------+---------------+------+---------+------+-------+----------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-----------+------+---------------+------+---------+------+-------+----------------+ | 1 | SIMPLE | employees | ALL | NULL | NULL | NULL | NULL | …

3
SQL Server基数提示
有没有一种方法可以将基数估计“注入”到SQL Server优化器(任何版本)? 即类似于Oracle的基数提示。 我的动机是由文章“查询优化器到底有多好?”驱动的。[1],他们测试基数估计量对不良计划选择的影响。因此,如果我可以强制SQL Server为复杂的查询精确地“估计”基数就足够了。 [1] Leis,Viktor等。“查询优化器到底有多好?” VLDB基金会论文集9.3(2015):204-215。

1
为什么在我索引列时此sqlite查询要慢得多?
我有一个带两个表的sqlite数据库,每个表有50,000行,其中包含(假)人的名字。我构建了一个简单的查询,以找出两个表共有的名称(给定名称,中间名缩写,姓氏): select count(*) from fakenames_uk inner join fakenames_usa on fakenames_uk.givenname=fakenames_usa.givenname and fakenames_uk.surname=fakenames_usa.surname and fakenames_uk.middleinitial=fakenames_usa.middleinitial; 当除了主键之外没有索引(与该查询无关)时,它将快速运行: [james@marlon Downloads] $ time sqlite3 generic_data_no_indexes.sqlite "select count(*) from fakenames_uk inner join fakenames_usa on fakenames_uk.givenname=fakenames_usa.givenname and fakenames_uk.surname=fakenames_usa.surname and fakenames_uk.middleinitial=fakenames_usa.middleinitial;" 131 real 0m0.115s user 0m0.111s sys 0m0.004s 但是,如果我将索引添加到每个表的三列中(总共六个索引): CREATE INDEX `idx_uk_givenname` ON `fakenames_uk` (`givenname` ) //etc. …

4
连接在运行时是否优化到where子句?
当我写这样的查询... select * from table1 t1 join table2 t2 on t1.id = t2.id SQL优化器不确定将其翻译为...吗? select * from table1 t1, table2 t2 where t1.id = t2.id 从本质上讲,SQL Server中的Join语句只是编写sql的一种简便方法吗?还是在运行时实际使用? 编辑:我几乎总是并且几乎总是会使用Join语法。我很好奇发生了什么。

4
好,坏或无所谓:WHERE 1 = 1
给定有关reddit的问题,我清理了查询以指出问题在查询中的位置。我首先使用逗号WHERE 1=1,并使修改查询更容易,所以我的查询通常以如下方式结束: SELECT C.CompanyName ,O.ShippedDate ,OD.UnitPrice ,P.ProductName FROM Customers as C INNER JOIN Orders as O ON C.CustomerID = O.CustomerID INNER JOIN [Order Details] as OD ON O.OrderID = OD.OrderID INNER JOIN Products as P ON P.ProductID = OD.ProductID Where 1=1 -- AND O.ShippedDate Between '4/1/2008' And '4/30/2008' And P.productname …

4
是否可以在具有数百万行的狭窄表上提高查询性能?
我有一个查询,目前平均需要2500毫秒才能完成。我的表很窄,但是有4400万行。我必须选择哪些选项来提高性能,或者说它达到了它的理想水平? 查询 SELECT TOP 1000 * FROM [CIA_WIZ].[dbo].[Heartbeats] WHERE [DateEntered] BETWEEN '2011-08-30' and '2011-08-31'; 桌子 CREATE TABLE [dbo].[Heartbeats]( [ID] [int] IDENTITY(1,1) NOT NULL, [DeviceID] [int] NOT NULL, [IsPUp] [bit] NOT NULL, [IsWebUp] [bit] NOT NULL, [IsPingUp] [bit] NOT NULL, [DateEntered] [datetime] NOT NULL, CONSTRAINT [PK_Heartbeats] PRIMARY KEY CLUSTERED ( [ID] …

5
我如何更快地查询这2000万条记录视图?
对于搜索功能,我正在使用一个视图,该视图具有需要搜索的所有表中的记录。该视图有近2000万条记录。针对该视图的搜索花费了太多时间。 我应该在哪里寻求改善这种观点的表现? 该视图的大致定义如下。它包括十三张桌子和大约三十个字段。 CREATE VIEW [dbo].[v_AllForSearch] AS SELECT FT.firstField AS [firstField] , FT.fld_primary AS [fld_primary] , FT.fld_thirdField AS [thirdField] , FT.fld_fourthField AS [fourthField] , ISNULL(ST.[fld_firstSearchField],'') AS [firstSearchField] , ISNULL(TT.[fld_thirdSearch],'') AS thirdSearch , ISNULL(TT.[fld_fourthSearch],'')AS fourthSearch , ISNULL(TT.[fld_fifthSearch],'')AS fifthSearch , ISNULL(FRT.[fld_sixthSearch],'') As [sixthSearch] , ISNULL(FRT.[fld_seventhSearch],'') AS [seventhSearch] , ISNULL(FRT.[fld_eightSearch],'')AS [eightSearch] , ISNULL(FIT.[fld_nineSearch],'') …

5
强制SQL Server按照编写的条件运行查询条件?
我正在使用SQL Server 2008 R2,并且具有以下伪查询(SP): select ... from ... WHERE @LinkMode IS NULL AND (myColumn IN (...very long-running query...)) ... ... 问题是查询要花很长时间才能执行-即使我使用来执行SP @LinkMode=2。 正如您所注意到的,只有在@LinkMode为null时才应执行长时间运行的查询,在这种情况下不是这样。在我的情况下,@LinkMode = 2! 但是,如果我将其更改为: select ... from ... WHERE 1=2 AND (myColumn IN (...very long time exeted query...)) ... ... SP 确实运行很快。 我之前听说过,有时优化器可以优化条件的顺序。 所以我问: 即使优化器选择了其他路径,比检查if更快=null呢?我的意思是,我认为检查if a==null是多比正在运行的其他长的查询速度更快... 如何强制 SQL …

1
部分覆盖范围谓词的垂直度估计
目前,我正在尝试弄清楚SQL Server如何评估部分覆盖直方图步骤的范围谓词的基数。 在Internet上,在针对阶跃统计值和阶跃内统计值进行基数估计时,我遇到了一个类似的问题,保罗·怀特(Paul White)给出了一个相当有趣的答案。 根据Paul的回答,用于估计谓词> =和>的基数的公式(在这种情况下,我只对至少120的基数估计器模型感兴趣): 对于>: Cardinality = EQ_ROWS + (AVG_RANGE_ROWS * (F * (DISTINCT_RANGE_ROWS - 1))) 对于> =: Cardinality = EQ_ROWS + (AVG_RANGE_ROWS * ((F * (DISTINCT_RANGE_ROWS - 1)) + 1)) 我根据使用TransactionDate列的范围谓词以及“ 20140614”和“ 20140618”之间的日期时间范围,在AdventureWorks2014数据库的[Production]。[TransactionHistory]表上测试了这些公式的应用。 此范围的直方图步骤的统计信息如下: 根据公式,我计算出以下查询的基数: SELECT COUNT(1) FROM [AdventureWorks2014].[Production].[TransactionHistory] WHERE [TransactionDate] BETWEEN '20140615 00:00:00.000' AND '20140616 00:00:00.000' …

2
DBCC FREEPROCCACHE或DBCC FREESYSTEMCACHE('SQL Plans')都不执行任何操作来释放CACHESTORE_SQLCP内存
CACHESTORE_SQLCP几天后,SQL计划占用超过38 GB的内存。 我们已经在运行“优化临时工作负载”选项。(实体框架和自定义报告会产生很多特殊条件!) 具有多可用区镜像的AWS RDS上的SQL Server 2016 SE 3.00.2164.0.v1 当我跑步时: DBCC FREESYSTEMCACHE('SQL Plans'); 要么 DBCC FREEPROCCACHE 要么 DBCC FREESYSTEMCACHE ('SQL Plans') WITH MARK_IN_USE_FOR_REMOVAL 要么 DBCC FREESYSTEMCACHE ('ALL') WITH MARK_IN_USE_FOR_REMOVAL; 它似乎无法清除: SELECT TOP 1 type, name, pages_kb FROM sys.dm_os_memory_clerks ORDER BY pages_kb desc type name pages_kb CACHESTORE_SQLCP SQL Plans 38321048 我在启用查询存储的情况下运行,但是我禁用了它以查看是否有任何干扰,这似乎没有帮助,但我将其保留了下来。 …

1
对SQL Server 2016中包含SUBSTRING()的谓词的估计值的更改吗?
是否有任何有关SQL Server 2016更改的文档或研究,以了解如何估计包含SUBSTRING()或其他字符串函数的谓词的基数? 我要问的原因是我正在查看一个在兼容模式130下性能下降的查询,原因与与包含调用SUBSTRING()的WHERE子句匹配的行数估计值的更改有关。我已通过查询重写纠正了此问题,但我想知道是否有人知道SQL Server 2016中有关此区域更改的任何文档。 演示代码如下。在此测试用例中,估计值非常接近,但准确性取决于数据。 在测试用例中,在兼容级别120中,SQL Server似乎正在使用直方图进行估计,而在兼容级别130中,SQL Server似乎假定表中有固定的10%匹配。 CREATE DATABASE MyStringTestDB; GO USE MyStringTestDB; GO DROP TABLE IF EXISTS dbo.StringTest; CREATE TABLE dbo.StringTest ( [TheString] varchar(15) ); GO INSERT INTO dbo.StringTest VALUES ( 'Y5_CLV' ); INSERT INTO dbo.StringTest VALUES ( 'Y5_EG3' ); INSERT INTO dbo.StringTest VALUES ( 'ZY_NE' …

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.