即使我添加了所有建议的索引,我的存储过程有时也会花费很长时间。我不断收到查询必须等待内存授予 查询计划可以在这里找到:查询计划
sql-server stored-procedures execution-plan query-performance
我现在在 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 #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