比较查询性能时应该检查哪些因素?
我看到很多关于 IO 成本、子树成本(通过使用执行计划)、CPU 时间、运行时间(通过使用 set statistics time on)、运行查询所需的时间等统计信息的文章。
我见过一些具有高子树成本但执行速度快的查询。所以我想知道在检查查询性能时我必须考虑哪些因素。
使用 Demo from here重现我的问题,更改表结构如下,并将演示分区函数修改为 datetime
CREATE TABLE [dbo].[DemoPartitionedTable](
[DemoID] [int] IDENTITY(1,1) NOT NULL,
[SomeData] [sysname] NOT NULL,
[CaptureDate] [datetime] NULL,
CONSTRAINT [PK_DemoPartitionedTable] UNIQUE NONCLUSTERED
(
[DemoID] ASC,
[CaptureDate] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
)
GO
Run Code Online (Sandbox Code Playgroud)
用户运行如下查询(查询 1)
SELECT [DemoID], [SomeData], [CaptureDate] FROM
[dbo].[DemoPartitionedTable] WHERE (1=1) and (1=1) and
CONVERT(varchar(10),CaptureDate,112) between 20190912 and 20190912
Run Code Online (Sandbox Code Playgroud)
计划是https://www.brentozar.com/pastetheplan/?id=r1veZhovH
大约需要 4 小时才能返回 500 万行
如果我使用如下分区键来改进上面的代码(查询 2)
SELECT [DemoID], [SomeData], [CaptureDate] FROM …Run Code Online (Sandbox Code Playgroud) performance sql-server partitioning sql-server-2012 query-performance performance-tuning
我现在在 SQL Server 2008 R2 中看到了一些行为,我无法确定服务器是否表现不佳。
我已经设置了一个测试,将一个整数插入到一个表中,如下定义,75,000 次。
dbo.Test1
(
id INT IDENTITY(1,1)
, [text] VARCHAR(2000)
, [timestamp] DATETIME NOT NULL DEFAULT(GETDATE())
)
Run Code Online (Sandbox Code Playgroud)
插入数据的应用程序(下面的 C# 代码)和 SQL Server 实例都在同一个物理盒子上。
结果:该过程需要将近 10 分钟的时间来循环和插入数据。不太确定这怎么可能。
for (int i = 0; i < 75000; i++)
{
using (SqlConnection connection = new SqlConnection(@"<server>"))
{
connection.Open();
using (SqlCommand command = new SqlCommand("INSERT INTO dbo.Test1 ([text]) SELECT '" + i + "'", connection))
{
command.ExecuteNonQuery();
}
connection.Close();
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:
根据@AaronBertrand 的回复更新问题。
我有多大?正如我所指定的,它是一个循环中的整数。我不关心可能会或可能不会出现在文本列中的文本。
什么样的驱动?这是一个 7200 …
你能解释一下,我如何优化这样的选择:
SELECT * FROM calls WHERE id_temp % 5 = 0 LIMIT 300000
Run Code Online (Sandbox Code Playgroud)
此选择正在处理具有 5000 万条记录的表。
非常感谢,祝你有美好的一天。
Select *
from #temp1
join #temp2 on #temp2.mdx <> replace(#temp2.mdx,#temp1.mdx,'')
Run Code Online (Sandbox Code Playgroud)
上面的查询大约需要 30 分钟才能执行。我想减少这个时间。
#temp1 包含 100 000 条记录#temp2 包含 4 000 条记录#temp1.mdx并#temp2.mdx都varchar(max)列。temp2.mdx 是一个类似的公式subprocess[1].dp[2]/subprocess[1].dp[5],它可以达到任何长度。temp1.mdx 包含该公式的一部分。
我想根据 #temp2.mdx 的每个公式获取 #temp1.mdx 的所有行,就像 temp1.mdx 包含
和 temp2.mdx 包含
通过上述逻辑,我将得到 2 行 a/b 和 3 行 a/b*d 因为当你用 '' 替换 A/b 中的 A 时,它不等于 A/b,这样你就会找到所有该公式中使用的行。
temp2.mdx 的最大长度为 10213。
我试图在我的本地机器上运行这个查询,它是 3.1ghz 和 8gb ram。我还没有在实际服务器上尝试过。
SQL Server 版本是 2014 Developer SP1。跟踪标志272, 610, 1118, 1206, 1222, 8048, 9481是全局打开的。
我们不得不打开标志 9481,因为新的基数估计器严重影响了许多查询计划。查询没有排序、散列或并行。当我运行查询时,几分钟内没有返回结果。
在执行期间,sys.dm_exec_query_memory_grants dmv 还报告了超过 1.3TB 的理想内存。(WhyGiganticDesiredMemory.queryanalysis)
我运行了一个非常相似的查询。在 ActualPlan.queryanalysis 中所需的内存为 124GB,授予为 44GB,而在 ActualPlanWithLessMemoryGrant.queryanalysis 中所需的内存仅为 10MB。
它们之间的唯一区别是从后者中删除的嵌套循环下方的最左侧索引查找(我在连接条件中添加了一个无效过滤器 1 = 0 以从计划中删除该表)。
我的查询如下所示:
SELECT CAST('C' AS CHAR(1)) AS [Action]
, f.LoadId
, u.UnvPclId
, p.* --- [about 480 columns, Daniel Hutmacher's edit]
FROM [tExtract].[ExtractCounty] f
INNER JOIN [tControl].[VersionControl] vc ON Id = 1
INNER JOIN [tTax].[Property] pk WITH ( NOLOCK, FORCESEEK ( UpdateVersion_CntyCd ( UpdateVersion ) ) ) …Run Code Online (Sandbox Code Playgroud) performance sql-server memory sql-server-2014 query-performance
索引数据会影响查询性能吗?意味着如果我在任何子IN句中以有序形式将值传递为 1,2,3,4... ,它可以提高查询性能吗?如果我随机传递值 2,5,7,9,1 等会发生什么......
例子 :
Select Name from Emp
where id IN (1,2,3,4) -- Ordered values
Run Code Online (Sandbox Code Playgroud)
或者:
Select Name from Emp
where id IN (4,2,7,98,34) -- Randomly ordered values
Run Code Online (Sandbox Code Playgroud)
其它的办法 :
Select Name from Emp
where id IN (Select empid from trans order by empty) -- Ordered values
Run Code Online (Sandbox Code Playgroud)
我要求 MySql 以及 SQL-Server 数据库。
谁能告诉我数据库引擎如何在上述情况下获得结果(执行计划)?
我想知道像下面这样的简单查询在一个只有 300 000 行的表上花费 6-7 秒是否正常。我正在研究 SQL Server 2014,而 RDBMS 需要花费大量时间来返回“没有那么多”数据,这让我感到非常惊讶。
SELECT [Id]
,[b]
,[c]
,[d]
,[e]
,[f]
,[g]
,[h]
,[i]
,[j]
,[k]
,[l]
,[m]
,[n]
,[o]
,[p]
,[q]
,[r]
,[s]
,[t]
,[u]
,[v]
,[w]
,[x]
,[y]
,[z]
,[aa]
,[ab]
,[ac] FROM .[dbo].[MyTable]
Run Code Online (Sandbox Code Playgroud)
以下是表格说明:
CREATE TABLE MyTable(
Id [int] IDENTITY(1,1) NOT NULL,
b [nvarchar](50) NULL,
c [nvarchar](30) NULL,
d [int] NOT NULL,
e [nvarchar](350) NULL,
f [nvarchar](350) NULL,
g [int] NULL,
h [int] NULL,
i [int] NULL,
j [int] NOT …Run Code Online (Sandbox Code Playgroud) performance sql-server select sql-server-2014 query-performance
performance ×8
sql-server ×7
memory ×1
mysql ×1
mysql-5.5 ×1
partitioning ×1
postgresql ×1
select ×1