在以下示例中,仅使用一个 SQL 查询的第一个版本的性能非常差。问题是最后一次加入。
当我将左侧的结果存储到一个临时表中并加入它时,它的运行速度大约快了 50 倍。
它旨在将其转换为 Oracle,因此我尽量避免使用临时表。
任何解释,为什么第一个查询表现如此糟糕或暗示改进它?
Declare @HO int = 2866;
Declare @Dtz int = 35;
---- version 1 takes about 60 seconds
With ratings as
(
select
ROW_NUMBER() Over ( ORDER BY SEDate) lfd,
SEDate,
BBCode
from PPV
join BB on BBRefnr = SEBBRefnr
where SEHORefnr = @HORefnr
and SEBBRefnr > 0
)
Select
SEDATE,
BBCODE,
Code,
DTRefnr
FROM (
Select
l.SEDate,
l.BBCode,
dbo.GetCode(@Dtz, l.BBCode) Code
from ratings l left join ratings r on l.lfd = …Run Code Online (Sandbox Code Playgroud) 我进行了搜索,但没有找到有关此主题的任何讨论。在连接表上创建许多额外的列有什么优点和缺点吗?因为我们加入了 3 个表,它会影响数据检索的速度吗?
就我而言,它可能会慢一点,但这是必要的,否则我们如何保存有关多对多关系的额外数据。或者还有其他我不知道的方式吗?
我知道我可以使用性能计数器来跟踪资源调控器 CPU 和内存使用情况。是否可以跟踪每个工作负载组的 I/O 使用情况?我没有看到任何具体的或任何推荐的做法。
我想更新表(我是 20-30 ),每个表都有数百万条记录。
问题是更新过程花费了太多时间,而且那时 CPU 使用率也很高。我想以一种在处理数据时不能使用太多 CPU 的方式来做。如果处理时间增加,那么这对我来说不是问题,但它应该使用有限的 CPU 资源来处理(更新)表。我使用 PostgreSQL 作为数据库,服务器操作系统是 Linux。
我的示例查询可以是这样的
UPDATE TEMP
SET CUSTOMERNAME =
( select customername from user where user.customerid = temp.customerid );
Run Code Online (Sandbox Code Playgroud) 根据执行计划,你知道这个sql代码是否有效的衡量标准是什么?
根据执行计划如何知道这个sql代码是否高效?



SELECT [CustomerID], [CompanyName], [City], [Region]
FROM [Northwind].[dbo].[Customers]
WHERE [Country] = 'Germany'
ORDER BY [CompanyName]
SELECT [CustomerID], [CompanyName], [City], [Region]
FROM [Northwind].[dbo].[Customers]
WHERE [Country] = 'Germany'
Run Code Online (Sandbox Code Playgroud) performance index sql-server-2008 execution-plan query-performance
我有一个相当大的事务数据库 (100GB),有很多用户。数据库访问完全通过存储过程进行,这些过程大量使用临时表、表变量、游标和其他有趣的东西。
我正在一个新盒子上试用它以提高性能。新盒子有 5 个独立的物理硬盘。我正在努力想出一个最佳设置(主要是虽然无知,但我通常是 ac# dev)。到目前为止,我得到了以下信息:
Drive C: OS, SQL install, TempDB log
Drive D: Database data
Drive E: Database log
Drive F: TempDB data
Drive G: Databases indexes
Run Code Online (Sandbox Code Playgroud)
我走的是正确的道路吗?有什么明显的错误吗?
询问:
Select *
from `t_event`
where `create_user_id`=7
and (`event_create_date`)=('2012-12-18 00:00:00')
and `event_type_cd`=11
and `domain_id` =602
and `job_id` =1
limit 1
Run Code Online (Sandbox Code Playgroud)
表结构:
mysql> show create table t_event\G
*************************** 1. row ***************************
Table: t_event
Create Table: CREATE TABLE `t_event` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`create_user_id` int(11) DEFAULT NULL,
`event_create_date` date DEFAULT NULL,
`event_type_cd` int(11) NOT NULL,
`event_desc` varchar(512) NOT NULL,
`IsGlobalEvent` int(2) DEFAULT NULL,
`event_start_date` datetime NOT NULL,
`event_end_date` datetime NOT NULL,
`job_id` int(11) DEFAULT NULL,
`domain_id` int(11) NOT NULL,
PRIMARY …Run Code Online (Sandbox Code Playgroud) 我有下表交易。该表如下所示:
CREATE TABLE [dbo].[Transactions](
[TransactionID] [bigint] IDENTITY(1,10) NOT NULL,
[PlayerID] [bigint] NOT NULL,
[BalanceTransactionTypeID] [int] NOT NULL,
[BalanceTransactionSubTypeID] [int] NULL,
[PointDelta] [money] NULL,
[TransactionDate] [datetime] NOT NULL,
Run Code Online (Sandbox Code Playgroud)
该表包含以下约束和索引。
CONSTRAINT [PK_Transactions] PRIMARY KEY CLUSTERED
(
[TransactionID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
CREATE NONCLUSTERED INDEX [IX_Transactions_PlayerID] ON [dbo].
[Transactions]
(
[PlayerID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF,
DROP_EXISTING = OFF, …Run Code Online (Sandbox Code Playgroud) 我有一个 21 列的表。大多数是数字,其余的是nvarchar。
我需要添加 4 列,这些列将包含每行的 XML 数据。每行的 XML 数据可以是 200 到 2,000 行。
问题是:
将 XML 类型的列添加到同一个表是否会改变查询该表的速度?
当我将 xml 类型的列添加到另一个表并在执行查询时连接两个表时,有什么性能优势?
对 XML 数据进行编码以缩小它并在应用程序中对其进行解码是否更好?
系统表pg_stat_all_tables记录 autovacuum 守护进程最后一次清理表的时间。
我注意到一些性能问题与数据库中较大的表之一被清理之间可能存在关联。然而,由于我不知道吸尘过程的持续时间,所以我不能 100% 确定。
如何查明在任何给定的表上自动清理花费了多长时间?
performance ×10
sql-server ×3
index-tuning ×2
postgresql ×2
hardware ×1
index ×1
mysql ×1
update ×1
xml ×1