应用程序需要尽可能更新数据库中的数据。在这种情况下,除了基于计时器的请求(轮询)数据库之外,还有其他获取数据的方法吗?
我使用 MS SQL Server 2008(和 .NET 应用程序 + 实体框架),但我也想了解其他类型的数据库。
我想知道是否有办法发送关于死锁的通知?如果是这样,需要什么查询。我知道 SQL Server 会处理死锁,我只是想要有关所涉及查询的信息。
我发现以下内容来确定长时间运行的查询:
SELECT
creation_time
,last_execution_time
,total_physical_reads
,total_logical_reads
,total_logical_writes
, execution_count
, total_worker_time
, total_elapsed_time
, total_elapsed_time / execution_count avg_elapsed_time
,SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,
((CASE statement_end_offset
WHEN -1 THEN DATALENGTH(st.text)
ELSE qs.statement_end_offset END
- qs.statement_start_offset)/2) + 1) AS statement_text
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st
where total_elapsed_time >= 300000000 --5 min
ORDER BY total_elapsed_time / execution_count DESC;
Run Code Online (Sandbox Code Playgroud)
我想知道上述方法是否正确,或者是否有更好的方法来确定任何查询的时间是否超过特定时间间隔(例如 5 分钟),如图所示?
谢谢
我有一个具有以下架构的表,我需要定义一个查询,该查询可以根据时间间隔(例如每分钟记录)对数据进行分组,然后提供自上一组以来对 SnapShotValue 的更改总和。目前,SnapShotValue 总是递增,所以我只需要差异的总和。任何人都可以帮助使用可能执行此操作的 SQL Server T-SQL 查询吗?我愿意更改架构,但这是我目前拥有的。
CaptureTime (datetime)
SnapShotValue (int)
Run Code Online (Sandbox Code Playgroud)
1 Jan 2012 00:00:00, 100
1 Jan 2012 00:00:30, 125
1 Jan 2012 00:01:00, 200
1 Jan 2012 00:01:30, 300
1 Jan 2012 00:02:15, 400
1 Jan 2012 00:02:30, 425
1 Jan 2012 00:02:59, 500
Run Code Online (Sandbox Code Playgroud)
1 Jan 2012 00:01:00, 225 -- Sum of all captured data changes up to the 1 minute mark
1 Jan 2012 00:02:00, 500 -- Sum of all captured …Run Code Online (Sandbox Code Playgroud) customer_comments由于数据库设计,我将一些拆分为多行,对于报告,我需要将comments每个唯一的数据id合并为一行。我以前尝试过使用SELECT 子句和 COALESCE技巧中的此分隔列表进行一些操作,但我不记得它并且一定没有保存它。在这种情况下,我似乎也无法让它工作,似乎只能在一行上工作。
数据如下所示:
id row_num customer_code comments
-----------------------------------
1 1 Dilbert Hard
1 2 Dilbert Worker
2 1 Wally Lazy
Run Code Online (Sandbox Code Playgroud)
我的结果需要如下所示:
id customer_code comments
------------------------------
1 Dilbert Hard Worker
2 Wally Lazy
Run Code Online (Sandbox Code Playgroud)
所以对于每row_num一个实际上只有一行结果;注释应按 的顺序组合row_num。上面链接的SELECT技巧可用于将特定查询的所有值作为一行获取,但我无法弄清楚如何使其作为SELECT将所有这些行吐出的语句的一部分工作。
我的查询必须自己遍历整个表并输出这些行。我没有将它们组合成多列,每一行一个,所以PIVOT似乎不适用。
我用查询来计算记录
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%'
Run Code Online (Sandbox Code Playgroud)
对于每一个计数,mysql都需要遍历整个表,如果表很长,查询很多,这是一个大问题。
我想知道是否有一种方法可以在一个查询中进行所有计数。在这种情况下,当mysql遍历每一行时,它会处理所有计数,而无需一遍又一遍地扫描整个表。
目前我正试图弄清楚 SQL Server 如何评估部分覆盖直方图步骤的范围谓词的基数。
在互联网上,在cardinality-estimation-for-and-for-intra-step-statistics-value我遇到了一个类似的问题,Paul White 给出了一个相当有趣的答案。
根据Paul的回答,谓词>=和>的基数估计公式(在这种情况下,我只对至少120的基数估计器模型感兴趣)如下:
对于 >:
Cardinality = EQ_ROWS + (AVG_RANGE_ROWS * (F * (DISTINCT_RANGE_ROWS - 1)))
Run Code Online (Sandbox Code Playgroud)
对于 >=:
Cardinality = EQ_ROWS + (AVG_RANGE_ROWS * ((F * (DISTINCT_RANGE_ROWS - 1)) + 1))
Run Code Online (Sandbox Code Playgroud)
我基于范围谓词使用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'
Run Code Online (Sandbox Code Playgroud)
使用以下代码进行计算:
DECLARE @predStart DATETIME = '20140615 00:00:00.000'
DECLARE @predEnd DATETIME = '20140616 00:00:00.000'
DECLARE @stepStart DATETIME = '20140614 00:00:00.000'
DECLARE @stepEnd …Run Code Online (Sandbox Code Playgroud) sql-server query optimization sql-server-2014 cardinality-estimates
我们有一个使用 Microsoft SQL 数据库的现成应用程序。在这个应用程序中,我们为每个报告挑选和选择各种选择标准。此应用程序然后运行这些报告。
我相信我们有一个查询计划问题。我们每天运行的第一个报表,运行速度非常快 7 分钟。我们在第一个报告之后运行的任何报告都需要一个多小时。
每天晚上,我们都会运行一个计划任务来停止和启动 SQL Server 代理和 SQL Server。在这个 SQL Server 实例中还有大约 25 个其他数据库。没有其他数据库有性能问题,只有我之前提到的现成产品。
有没有办法清除 SQL Server 当前内存中的所有查询计划?
如何在不影响依赖同一服务器上其他数据库的 30 个左右的用户的情况下执行此操作?
使用 MS SQL 2008,我从 250 万条记录中选择了一个平均字段。每条记录代表一秒。MyField 是这些 1 秒记录的每小时平均值。当然服务器CPU命中100%,选择时间太长。我可能需要保存这些平均值,以便 SQL 不必在每个请求中选择所有这些记录。可以做什么?
SELECT DISTINCT
CONVERT(VARCHAR, [timestamp], 1)+' '+ CAST(DATEPART(Hh,[timestamp]) as VARCHAR) AS TimeStampHour,
MIN([timestamp]) as TimeStamp,
AVG(MyField) As AvgField
FROM MyData
WHERE TimeStamp > '4/10/2011'
GROUP BY CONVERT(VARCHAR, [timestamp], 1)+' '+ CAST(DATEPART(Hh,[timestamp]) as VARCHAR)
ORDER BY TimeStamp
Run Code Online (Sandbox Code Playgroud) 当您完成查询/存储过程/函数的编写后,快速获取一些性能参数的最有用的方法是什么?您是否运行查询并查看实际执行计划?如果是这样,您要寻找的东西是什么?显然表/索引扫描是位命中,但还有什么?
我将用尽可能均匀地装载固定数量的卡车订单来描述问题。
输入:
@TruckCount - the number of empty trucks to fill
Run Code Online (Sandbox Code Playgroud)
一套:
OrderId,
OrderDetailId,
OrderDetailSize,
TruckId (initially null)
Run Code Online (Sandbox Code Playgroud)
Orders由一个或多个组成OrderDetails。
这里的挑战是TruckId为每条记录分配一个。
单个订单不能跨卡车拆分。
卡车应尽可能均匀*装载,以sum(OrderDetailSize).
* 均匀:装载最少的卡车和装载最多的卡车之间可实现的最小增量。根据这个定义,1,2,3 比 1,1,4 分布更均匀。如果有帮助,请假装您是统计算法,创建均匀的高度直方图。
没有考虑最大卡车负载。这些是神奇的弹性卡车。然而,卡车的数量是固定的。
有一个明显的迭代解决方案 - 循环分配订单。
但是它可以作为基于集合的逻辑来完成吗?
我的主要兴趣是 SQL Server 2014 或更高版本。但其他平台的基于集合的解决方案也可能很有趣。
这感觉就像 Itzik Ben-Gan 领土 :)
我的实际应用程序将处理工作负载分配到多个存储桶中,以匹配逻辑 CPU 的数量。因此每个桶没有最大大小。统计更新,特别是。我只是认为将问题抽象为卡车作为构建挑战的一种方式会更有趣。
CREATE TABLE #OrderDetail (
OrderId int NOT NULL,
OrderDetailId int NOT NULL PRIMARY KEY,
OrderDetailSize tinyint NOT NULL,
TruckId tinyint NULL)
-- Sample Data
INSERT #OrderDetail (OrderId, OrderDetailId, …Run Code Online (Sandbox Code Playgroud)