我读过,当数据库上有很多索引时,它会严重损害性能,但在 PostgreSQL 文档中我找不到任何关于它的信息。
我有一个非常大的表格,大约有 100 列和 10 亿行,我经常需要在许多不同的领域进行大量搜索。
如果我添加很多索引(可能是 10 个唯一列索引和 5 到 7 个三列索引),PostgreSQL 表的性能是否会下降?
编辑:随着性能下降,我的意思是SELECT性能;该数据库将每月仅一次,所以更新UPDATE和INSERT速度不是问题。
我最近阅读了很多关于CROSS APPLYvs 的文章INNER JOIN。我尝试编写一些查询,它们都以类似的方式工作,执行计划似乎也相同。
也许有更深入知识的人可以向我解释这两者之间的区别?
OUTER APPLY (SELECT UserID
, ActionPerformedDate = MAX(ActionDate)
FROM dbo.AdminUsage
WHERE SubscriberID = S.SubscriberID
AND ActionPerformed = 'Some Action'
AND Description = 'True'
GROUP BY UserID) AS AU
LEFT JOIN (SELECT SubscriberID
, UserID
, MAX(ActionDate) OVER(PARTITION BY SubscriberID) AS ActionPerformedDate
FROM dbo.AdminUsage
WHERE ActionPerformed = 'Some Action'
AND Description = 'True') AS AU
ON AU.SubscriberID = S.SubscriberID
Run Code Online (Sandbox Code Playgroud)
在这种情况下是否有首选方法?
如果列的输入值大于 3,我想在列上添加一个检查约束,而不应将其保存为 1 个其他输入值。对于这种情况,我使用下面的查询,但在插入数据时显示错误消息。
create table tblTestCheckConstraint
(
id int,
NewColumn int
)
alter table tblTestCheckConstraint
add constraint chk_tblTestCheckConstraint_NewColumn1 CHECK
(
CASE
WHEN NewColumn >4 THEN 1
ELSE NewColumn
END = 1
)
Run Code Online (Sandbox Code Playgroud)
插入语句:
insert into tblTestCheckConstraint values ( 1,5)
insert into tblTestCheckConstraint values ( 1,2)
Run Code Online (Sandbox Code Playgroud)
错误信息:
Msg 547, Level 16, State 0, Line 1
The INSERT statement conflicted with the CHECK constraint "chk_tblTestCheckConstraint_NewColumn1". The conflict occurred in database "DBName"
, table "dbo.tblTestCheckConstraint", column 'NewColumn'.
The statement has been terminated.
Run Code Online (Sandbox Code Playgroud) 我是这家公司的新 DBA。我看到他们的一些表有很多索引;例如,有些超过 50 或 60。
这是一件好事吗?从我的研究来看,这似乎对性能不利。
你会如何处理这个?
我想删除所有索引并从 0 开始。我认为开发人员一直在使用 Tuning Advisor 并没有真正了解索引。
我有一个每小时运行一次的事务备份作业。
首先它将数据库日志备份到另一个驱动器,然后缩小日志并删除旧.trn文件。

中间任务使用以下代码缩小日志文件:
USE myDB
DBCC SHRINKFILE('myDB_LOG', 0, TRUNCATEONLY)
Run Code Online (Sandbox Code Playgroud)
但是,有时我会收到以下错误。
说明:执行查询“USE myDB DBCC SHRINKFILE('myDB_LOG'...”失败并出现以下错误:“备份、文件操作操作(例如 ALTER DATABASE ADD FILE)和数据库上的加密更改必须序列化。重新发出当前备份或文件操作操作完成后的语句。将数据库上下文更改为“myDB”。”。可能的失败原因:查询问题、“ResultSet”属性设置不正确、参数设置不正确或连接未正确建立。 End Error DTExec: The package execution returns DTSER_FAILURE (1). Started: 22:00:19 Finished: 22:04:17 Elapsed: 238.26 seconds. The package execution failed. The step failed.
为什么会这样?
有没有更好的方法来备份和收缩数据库日志?
我想从比当前年份减去“x”年之前的时间点选择并最终删除记录。
我不确定最有效的方法来做到这一点。
在 SQL Server 2005 中:
CREATE TABLE __RADHE
(
itemNo varchar(10) not null primary key clustered
);
GO
INSERT INTO __RADHE ???
'34926840', '34927020', '34927202', '34927384', '34927566',
'34927830', '34927889', '34930743', '34930750', '34927897',
'34927848', '34927574', '34927392', '34927210', '34927038',
'34926857', '34917120', '34917286', '34917443', '34926865',
'34927046', '34927228', '34927400', '34927582', '34927855',
'34927905', '34930768', '34930776', '34927913', '34927863',
'34927590', '34927418', '34927236', '34927053', '34926873',
'34917450', '34917294', '34917138', '34917146', '34917302',
'34917468', '34926881', '34927061', '34927244', '34927426',
'34927608', '34927871', '34927921', '34930784', '34927616',
'34927434', '34927251', '34927079', '34926899', '34917476',
'34917310', '34917153', '34917161', …Run Code Online (Sandbox Code Playgroud) 有没有办法可以把下面的SELECT语句变成一个DELETE?
I would like to delete the corresponding returned records from the [ETL].[Stage_Claims] table.
Since I used derived tables I can't reference the Stage_Claims table.
To summarize, the 2 physical tables used in the below query have identical structures. Only difference is DUPS_Claims is a subset of Stage_Claims.
DUPS_Claims contains duplicate records found in Stage_Claims. If a record exists 3 times in Stage_Claims, we will have that record 3 times in DUPS_Claims as …
我有一个包含通话记录的表:
tbl_calls
cl_Id
cl_StartDate
cl_endDate
Run Code Online (Sandbox Code Playgroud)
我传递两个参数@StartDate并@EndDate给我的存储过程。
我的要求是在每 15 分钟的持续时间内获取通话记录的数量。
例如,如果:
@StartDate = '2015-11-16 00:00:00.000',
@EndDate = '2015-11-16 23:59:00.000'
Run Code Online (Sandbox Code Playgroud)
输出应该是:
Date Count
2015-11-16 00:00:00.000 10(Count of startDate between '2015-11-16 00:00:00.000' AND '2015-11-16 00:15:00.000')
2015-11-16 00:15:00.000 7(Count of startDate between '2015-11-16 00:15:00.000' AND '2015-11-16 00:30:00.000')
2015-11-16 00:30:00.000 50(Count of startDate between '2015-11-16 00:30:00.000' AND '2015-11-16 00:45:00.000')
upto @EndDate
Run Code Online (Sandbox Code Playgroud)
我已经尝试了以下查询,但它不能正常工作。有一个更好的方法吗?
DECLARE @StartDate DATETIME = DATEADD(DAY,-1,GETUTCDATE()),
@EndDate DATETIME = GETUTCDATE()
SELECT New
FROM
(SELECT
(CASE
WHEN cl_StartTime BETWEEN @StartDate AND …Run Code Online (Sandbox Code Playgroud) 在 SQL Server 中,我们可以设置多个电子邮件配置,其中只有一些设置为默认值。
我尝试使用以下查询来获取帐户列表:
select *
from msdb.dbo.sysmail_profile p
join msdb.dbo.sysmail_profileaccount pa on p.profile_id = pa.profile_id
join msdb.dbo.sysmail_account a on pa.account_id = a.account_id
join msdb.dbo.sysmail_server s on a.account_id = s.account_id
Run Code Online (Sandbox Code Playgroud)
有什么方法可以识别默认邮件配置文件吗?
sql-server ×8
index ×2
count ×1
date ×1
insert ×1
join ×1
maintenance ×1
oracle ×1
performance ×1
postgresql ×1
subquery ×1