小编mar*_*c_s的帖子

复合主键 - 索引两个字段?

我在用户和角色之间有一个多对多连接表。

CREATE TABLE AppUserRole 
(
    UserId INT NOT NULL,
    RoleId INT NOT NULL, 

    CONSTRAINT PK_AppUserRole PRIMARY KEY (UserId, RoleId), 

    CONSTRAINT FK_AppUserRole_User FOREIGN KEY (UserId) 
        REFERENCES AppUser(UserId), 
    CONSTRAINT FK_AppUserRole_Role FOREIGN KEY (RoleId) 
        REFERENCES AppRole(RoleId)
);

CREATE INDEX IX_AppUserRole_RoleId ON AppUserRole(RoleId)
CREATE INDEX IX_AppUserRole_UserId ON User(UserId)
Run Code Online (Sandbox Code Playgroud)

既然复合键是按照 ( UserId, RoleId)的顺序聚集的,那么第二个索引 onUserId真的有必要吗?

当您查询特定的所有行时,UserId它将使用聚集索引。只有当您查询特定中的所有用户时,RoleId才会使用索引IX_AppUserRole_RoleId

索引是IX_AppUserRole_UserId必要的吗?

index sql-server learning primary-key t-sql

5
推荐指数
1
解决办法
1119
查看次数

SQL Server 中 sys.sysrowsets 的用途是什么?

我只是想知道 SQL Server 中 sys.sysrowsets 的用法是什么?微软说它“存在于每个数据库中。为索引或堆的每个分区行集包含一行。” 但什么是分区?

另外这个表的 idmajor 和 idminor 是什么意思?我尝试查找表(246486340)的对象 ID,然后执行查询:

Select * from sys.sysrowsets where idmajor = 246486340
Run Code Online (Sandbox Code Playgroud)

结果有两条记录:

rowsetid           ownertype       idmajor idminor  numpart status  fgidfs  rcrows

72057603504865280   1              246486340     1     1        6     0     2582    
72057603612213248   1              246486340     6     1        2     0     2582
Run Code Online (Sandbox Code Playgroud)

但我认为应该只有一个具有该主要 id 的记录。

sql-server

5
推荐指数
1
解决办法
3646
查看次数

SQL Server - 无法删除空闲作业

目前,我正在将服务器从一家公司转移到另一家公司。

他们希望将 SQL Server 安装在服务器上,以便我们清除所有数据库、维护计划和作业。

我正在尝试删除一堆 SQL Server 代理作业,但即使它们被禁用,它们仍处于“空闲”模式,因此在尝试删除它们时会引发以下错误:

删除 Job 失败job_name.Subplan_1。( Microsoft.SqlServer.Smo)

执行 Transact-SQL 语句或批处理时发生异常。( Microsoft.SqlServer.ConnectionInfo)

DELETE语句与REFERENCE约束冲突FK_subplan_job_id。数据库“msdb”、表dbo.sysmaintplan_subplans、列中发生冲突job_id

该语句已终止。(Microsoft SQL Server,错误:547)

如何从作业中删除 IDLE 状态以便删除通过?

sql-server-2005 sql-server sql-server-agent

5
推荐指数
1
解决办法
7423
查看次数

将选择保存到 csv 时出现错误“--secure-file-priv 选项”

我尝试在 Win 2012 R2 服务器上保存一个非常大的选择(超过 7000 万行到 csv 文件中)

我以 root 身份执行查询,但我认为权限仍然存在一些问题

select * 
INTO OUTFILE 'D:\my_folder\my_file.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
from my_table
where 
...
Run Code Online (Sandbox Code Playgroud)

错误

错误代码:1290。MySQL 服务器正在使用 --secure-file-priv 选项运行,因此无法执行此语句

预先感谢您的任何帮助 !

mysql permissions

5
推荐指数
2
解决办法
4万
查看次数

在 SQL Server 中重建索引不会减少碎片

我正在尝试减少索引的碎片化。

首先,我重建了所有碎片高于 30% 的索引,但我的大多数索引仍然具有高碎片或什至没有改变 1%。

深入观察,当我减少重建语句的填充因子时,也会减少碎片。

现在,最好的选择是什么?

具有高填充因子的更高碎片或降低填充因子然后获得更低的碎片?

暂时谢谢。

index sql-server

5
推荐指数
2
解决办法
4123
查看次数

SQL Server:索引中包含的列:是否有“太多”之类的内容?

我们的一个数据库中有一张表,其结构大致如下:

Field1 int primary key
Field2 int foreign key A
Field3 int foreign key B
Field4 int foreign key C
Field5 ... Field70 diverse data types, for the "payload"
Run Code Online (Sandbox Code Playgroud)

外键列上有索引,尽管只有键列,没有任何包含的列。索引分析例程不断建议具有相同键列的新索引,这些列已经存在索引,但包含许多列 - 在一种情况下甚至是所有 Field5 到 Field70。我有点犹豫是否要创建包含如此多列的索引 - 感觉就像复制表本身。

对于索引中包含的列的数量是否有一些经验法则限制,或者我应该继续将现有索引(仅键列)替换为具有相同键列和如此多包含列的索引?

提前致谢。

index sql-server

5
推荐指数
1
解决办法
1696
查看次数

SQL Server 2008 R2-SP2 上的 Tempdb 日志文件不断增长。使用临时表的挂起插入语句可能是原因吗?

我刚刚开始担任 DBA 的新工作。突然间,我们开始收到有关磁盘空间的警报。当我查看时,我发现 tempdb 日志文件在不断增长。有一个针对它的活跃事务正在运行。我检查了查询,它使用的是临时表。从45分钟开始,事情就毫无进展了。我尝试了很多事情,包括这些作为最后的手段。

use tempdb
GO
DBCC FREEPROCCACHE -- clean cache
DBCC DROPCLEANBUFFERS -- clean buffers
DBCC FREESYSTEMCACHE ('ALL') -- clean system cache
DBCC FREESESSIONCACHE -- clean session cache
Run Code Online (Sandbox Code Playgroud)

但这根本没有帮助。我还杀死了卡住的插入件。看来这并没有超出正常流程。最后我不得不紧急中断几分钟并重新启动 SQL 服务。关于我可能错过的内容有什么建议吗?

sql-server transaction-log

5
推荐指数
1
解决办法
5355
查看次数

在并发调用中使用 CTE 和 OUTPUT 块进行更新

我遇到了死锁问题,所以我开始使用我在某处读到的这个 CTE 技巧。没有更多的僵局。

但是现在我添加的每个客户端都会减慢(阻止?)存储过程。例如,1 个客户端的 1-2 秒更新变为两个客户端的 2-4 秒。(这个简单的隐喻查询运行时间为 0.001 秒,但在少数客户之后达到 0.03 秒——所以这个问题与我的实际实现无关。)

是锁定问题吗?我需要将它包装在(某种)交易中吗?

WITH UpdateView AS (
    SELECT TOP 1 W.*
    FROM [WidgetSandbox].[dbo].[Widgets] W
    INNER JOIN [WidgetSandbox].[dbo].[Sizes] S ON W.SizeId = S.Id
    WHERE W.StatusId = @availableStatusId
    AND W.ColorCode = @colorCode
    ORDER BY S.DiameterInches
)

UPDATE UpdateView 
SET StatusId = @soldOutStatusId
OUTPUT INSERTED.Id INTO @outputIds;

SET @singleUpdatedId = (SELECT TOP 1 Id FROM @outputIds);

SELECT * FROM [WidgetSandbox].[dbo].[Widgets]
WHERE Id = @singleUpdatedId;
Run Code Online (Sandbox Code Playgroud)

我希望我能更好地了解具体问题是什么,但事实上我只是被卡住了......

DDL,如果有帮助:https : //gist.github.com/RobertBaldini/3740c7bb85eea47d7fe63cb8602ac2d6

回购:https : …

sql-server deadlock stored-procedures concurrency locking

5
推荐指数
1
解决办法
2576
查看次数

SQL Server 中的 ODBC 连接锁定表

我们的 ERP 系统比现代系统稍差,后端目前安装在 SQL Server 2008 R2 上。我们通过管理授权(并非总是如此)允许许多用户随意从该系统中提取数据以将数据处理为他们喜欢的报告风格(BI、Powerquery、Access),这是完全不切实际的做法。 、Excel 等)

尽管所有这些报告生成用户都只有选择权限,但还有一些其他应用程序能够实际操作数据,以执行 EDI、自动数据输入等操作。

从逻辑上讲,这会在表上创建许多竞争条件。先到先得,或者更糟的是,仍在提供服务,请稍等,或者只是不......我相信这进一步导致了多年来无法解释的数据损坏需要供应商协助纠正。因为并非所有应用程序都经过正确编码以预测其他事物可能会中断其自己的私有意图的可能性。

因此,任务是在我最近才继承的系统上尽可能证明/纠正/减轻它。

我的第一直觉告诉我,如果没有不同供应商产品之间的某种 IPC/错误/事务控制以及他们修复它的意愿、控制源代码或限制它的能力,这是无法完成的,这不能从 DBA 修复从角度来看,这只是导致应该预期的潜在有害副作用的不良做法。

所以此时我所能做的就是证明这一点,看看如果有证据,我可以在坚持必须这样做的管理层心中征求某种行为改变。

第一步,我正在运行一个连续的分析器输出到磁盘,尽管资源密集,但我必须能够返回并查看已提交的内容,由谁提交,以及它产生了什么影响。我还使用 perfmon 日志记录和 PAL 来尝试交叉引用服务器上的密集行为,“当处理器和内存挂钩时,SQL 服务器在该实例中做了什么(很可能是为编写的 GUI 之一提供服务,性能不佳,十个表连接,非索引查询,一些报告编写者/工具扔在一起”

其中一种情况刚刚发生,我们在 ERP 系统中有一个用户无法执行某项功能,我们发现该用户登录的数据库没有使用 ERP 软件(使用 ODBC,SQL 用户只能选择访问,以及MS Access),让他们断开连接并完成该功能。管理层拒绝相信它们是相关的,因为它们“应该处理不同的表,而用户只有选择访问权限”,而且我没有发生之前瞬间的个人资料历史记录。

所以,这一切归结为一个问题,DBA学员在那里,给的任务验算该应用程序A被应用B的不利影响,你有什么建议给报价?

ms-access sql-server odbc sql-server-2008-r2 locking

5
推荐指数
1
解决办法
5468
查看次数

SQL Server 应该有多少内存

我有一个占用 500gb 的数据库,我注意到即使我有 100gb 的 RAM,我的 ple 也很低。我在谷歌中搜索过原因,我发现了一些有趣的查询。我有一个在非常大的表上运行的查询,即使它使用聚集索引,它也会导致 ple 删除。我在查询前后以及查询完成后检查了缓冲池中的内容,看起来 DB 必须为我的查询中使用的索引释放一些空间,并且在查询旧索引加载到缓冲池之后。我的问题是 DB 应该有多少 RAM 内存,我如何计算它,它是否应该是让我一次将所有使用的索引保存在内存中的数量?或者我应该减少保存在表中的数据,以便索引会更小?

performance sql-server memory page-life-expectancy

5
推荐指数
1
解决办法
2万
查看次数