经过大量的工作,我终于得到了一个相当复杂的查询,非常流畅地工作,并很快返回结果.
它在开发和测试方面运行良好,但现在测试速度已大大减慢.解释查询在开发上需要0.06秒并且在测试中大致相同,现在测试时间为7秒.
解释略有不同,我不确定为什么这将是dev的解释
-+---------+------------------------------+------+------------------------------ ---+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+------------+--------+-------------------------+------------ -+---------+------------------------------+------+------------------------------ ---+ | 1 | PRIMARY | | ALL | NULL | NULL | NULL | NULL | 5 | | | 1 | PRIMARY | tickets | ref | biddate_idx | biddate_idx | 7 | showsdate.bid,showsdate.date | 78 | | | 2 | DERIVED | shows | ALL | biddate_idx,latlong_idx | NULL …
当从参数化查询更改为非参数化查询时,我无法理解SQL Server中我的语句的估计查询计划的行为.
我有以下查询:
DECLARE @p0 UniqueIdentifier = '1fc66e37-6eaf-4032-b374-e7b60fbd25ea'
SELECT [t5].[value2] AS [Date], [t5].[value] AS [New]
FROM (
SELECT COUNT(*) AS [value], [t4].[value] AS [value2]
FROM (
SELECT CONVERT(DATE, [t3].[ServerTime]) AS [value]
FROM (
SELECT [t0].[CookieID]
FROM [dbo].[Usage] AS [t0]
WHERE ([t0].[CookieID] IS NOT NULL) AND ([t0].[ProductID] = @p0)
GROUP BY [t0].[CookieID]
) AS [t1]
OUTER APPLY (
SELECT TOP (1) [t2].[ServerTime]
FROM [dbo].[Usage] AS [t2]
WHERE ((([t1].[CookieID] IS NULL) AND ([t2].[CookieID] IS NULL))
OR (([t1].[CookieID] IS NOT NULL) AND ([t2].[CookieID] …Run Code Online (Sandbox Code Playgroud) 我有一个表ItemValue,其中包含运行在2000兼容模式下的SQL 2005 Server上的数据,这些模式类似于(它是用户定义的值表):
ID ItemCode FieldID Value
-- ---------- ------- ------
1 abc123 1 D
2 abc123 2 287.23
4 xyz789 1 A
5 xyz789 2 3782.23
6 xyz789 3 23
7 mno456 1 W
9 mno456 3 45
... and so on.
Run Code Online (Sandbox Code Playgroud)
FieldID来自ItemField表:
ID FieldNumber DataFormatID Description ...
-- ----------- ------------ -----------
1 1 1 Weight class
2 2 4 Cost
3 3 3 Another made up description
. . x xxx
. . …Run Code Online (Sandbox Code Playgroud) 关于SQL中语句的执行顺序,以下性能是否有明显区别?
SELECT * FROM Persons
WHERE UserType = 'Manager' AND LastName IN ('Hansen','Pettersen')
Run Code Online (Sandbox Code Playgroud)
和:
SELECT * FROM Persons
WHERE LastName IN ('Hansen','Pettersen') AND UserType = 'Manager'
Run Code Online (Sandbox Code Playgroud)
如果有任何差异,是否可能有一个链接等,你可以在哪里可以了解更多相关信息?
万分感谢,
凯尔
我有一个查询,它在SQL Server Management STudio中是超高速的,并且在sp_ExecuteSQL下运行时超级慢.
这是否与在spExecuteSQL下运行时未执行的执行计划的缓存有关?
正如标题所述,我不明白为什么sp_executeSQL会生成与从Sql Management Studio运行查询完全不同的执行计划.
从SQL管理工作室运行时,我的查询将需要3秒钟,因为通过sp_executeSQL在管理工作室中运行的查询将花费5分钟.
我已经更新了统计数据,并查看了索引,但事实上仍然存在这样的事实:sp_executeSQL的执行计划比直接从我的管理工作室运行sql更糟糕.
所以这是我的问题:为什么执行计划在以这两种不同方式运行查询之间会有很大差异?
谢谢
其中一个查询(如下所示)需要90秒以上才能执行.它从一个相当大的表LogMessage返回~500行.如果ESCAPE N'~'从查询中删除它,它会在几秒钟内执行.同样,如果TOP (1000)删除它,它会在几秒钟内执行.查询计划Key Lookup (Clustered) PK_LogMessage, Index Scan (NonClustered) IX_LogMessage and Nested Loops (Inner Join)在第一种情况下显示.当从句ESCAPE N'~'或TOP (1000)移除查询计划的变化,以及Clustered Index Scan (Clustered) PK_LogMessage.虽然我们正在寻找添加更多索引(可能在ApplicationName上),但我们想了解当前的情况.
正在生成查询Entity Framework,以防您想知道为什么以这种方式编写.实际查询也更复杂,但这是表现出相同行为的最短版本.
查询:
SELECT TOP (1000)
[Project1].[MessageID] AS [MessageID],
[Project1].[TimeGenerated] AS [TimeGenerated],
[Project1].[SystemName] AS [SystemName],
[Project1].[ApplicationName] AS [ApplicationName]
FROM
(
SELECT
[Project1].[MessageID] AS [MessageID],
[Project1].[TimeGenerated] AS [TimeGenerated],
[Project1].[SystemName] AS [SystemName],
[Project1].[ApplicationName] AS [ApplicationName]
FROM
(
SELECT
[Extent1].[MessageID] AS [MessageID],
[Extent1].[TimeGenerated] AS [TimeGenerated],
[Extent1].[SystemName] AS [SystemName], …Run Code Online (Sandbox Code Playgroud) sql sql-server performance sql-server-2008-r2 sql-execution-plan
Nhibernate探查器显示有关查询计划的大量错误消息:
不同的参数大小会导致查询计划缓存使用效率低下
它还会引导您在http://nhprof.com/Learn/Alerts/UncachedQueryPlan中进行解释,并prepare_sql = true在构建会话时警告您使用参数.我这样做是流利的:
.ExposeConfiguration(configuration => configuration
.SetProperty("current_session_context_class", "thread_static")
.SetProperty("prepare_sql", "true")
.SetProperty("generate_statistics", "true")
)
Run Code Online (Sandbox Code Playgroud)
但似乎它没有工作,因为错误消息仍然存在.这是对OracleClientConfiguration的限制还是我做错了?
编辑提供有关此内容的更多信息......
在我的存储库中,我这样做
session.Query<TEntity>.Where(predicate).ToList();
Run Code Online (Sandbox Code Playgroud)
这就是电话
var value = ParameterRepository.First(p => (p.Pipeline.Id == pipelineId && p.Name == name));
Run Code Online (Sandbox Code Playgroud)
例如,这些是从此调用生成的两个SQL,并且nhibernate profiler显示为"不同的参数大小导致查询计划缓存使用效率低下"
select GUID1_12_,
PARAMETER2_12_,
PARAMETER3_12_,
GUID4_12_
from (select pipelineex0_.GUID_PIPELINE_EXEC_PARAMETER as GUID1_12_,
pipelineex0_.PARAMETER_NAME as PARAMETER2_12_,
pipelineex0_.PARAMETER_VALUE as PARAMETER3_12_,
pipelineex0_.GUID_PIPELINE_TRACKING as GUID4_12_
from FCT_PIPELINE_EXEC_PARAMETER pipelineex0_
where pipelineex0_.GUID_PIPELINE_TRACKING = 'A5916E73CF1E406DA26F65C24BFBF694' /* :p0 */
and pipelineex0_.PARAMETER_NAME = 'lid' /* :p1 */)
where rownum <= 1 /* …Run Code Online (Sandbox Code Playgroud) 当我们在Oracle中执行任何sql语句时,会为该sql语句分配一个哈希值并将其存储到库缓存中.因此,稍后,如果另一个用户请求相同的查询,则Oracle会找到哈希值并执行相同的执行计划.但是,我对哈希值有一个疑问.我的意思是,如何生成哈希值?我的意思是,Oracle服务器是否使用某些算法,或者只是将sql字符串转换为某个数值.
从那时起,我正在阅读Pro Oracle SQL书籍,上面写着,
select * from employees where department_id = 60;
SELECT * FROM EMPLOYEES WHERE DEPARTMENT_ID = 60;
select /* a_comment */ * from employees where department_id = 60;
Run Code Online (Sandbox Code Playgroud)
将返回不同的哈希值,因为当执行sql语句时,Oracle首先将字符串转换为哈希值.但是,当我尝试这个时,它返回相同的哈希值.
SQL> select * from boats where bid=10;
no rows selected
Execution Plan
----------------------------------------------------------
Plan hash value: 2799518614
-------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 16 …Run Code Online (Sandbox Code Playgroud) 如何在Couchbase中计算查询时间和查询执行计划.是否有任何实用程序,如Oracle解释计划和Couchbase数据库中的tkprof?
编辑:
我试图看看哪个数据库最适合我的数据.所以我想尝试使用mysql,mongodb,couchbase.我尝试了三个不同数量的条目10k,20k,40k条目.
使用mysql,我可以使用"set profiling = 1"查看查询时间.使用此设置我在三种情况下运行查询1)没有索引主键,2)索引主键3)第二次运行相同的查询(以查看查询缓存的效果)
同样,我使用mongodb运行相同的测试,并以表格格式汇总我的结果.我想用couchbase运行相同的测试,看看它的性能如何.我试图搜索网络,但找不到任何我可以遵循以获得类似结果的内容.
下面是我的表(所有时间都是毫秒).带有大括号()的第二行显示第二次运行的查询时间.
Records Count Mysql MongoDB CouchBase
___________________ _______________ ___________
Without | With Without | With With Index
Index | Index Index | Index
10K 62.27325 | 8.537 3311 | 33
(33.3135) | (3.27825) (7) | (0)
20K 108.4075 | 23.238 132 | 39
(80.90525)| (4.576) (17) | (0)
40K 155.074 | 26.26725 48 | 10
(110.42) | (10.037) (42) | (0)
对于couchbase,我想知道使用其密钥检索文档时的性能(类似于memcahed的功能).查询时间也使用其视图.
performance execution-time nosql sql-execution-plan couchbase
sql ×5
sql-server ×5
performance ×3
t-sql ×3
oracle ×2
couchbase ×1
join ×1
mysql ×1
nhibernate ×1
nosql ×1