小编Ron*_*ldo的帖子

从远程服务器复制 PostgreSQL 数据库

当我使用 MySQL 时,我可以运行一个命令,将 SSH 连接到我的服务器并将数据库复制到我的本地机器上。

ssh -t remoteserver 'mysqldump --compress -u dbuser --password="password" db_name' | /usr/local/mysql/bin/mysql -u root --password="password" local_db_name
Run Code Online (Sandbox Code Playgroud)

我如何用 PostgreSQL 做同样的事情?

postgresql

13
推荐指数
1
解决办法
3万
查看次数

使用函数 DECRYPTBYPASSPHRASE 时,如何知道 SQL Server 使用什么哈希算法来解密加密数据?

我的问题与以下两个实例的实验有关:

SQL Server 2017 Express 实例 (Microsoft SQL Server 2017 (RTM-CU16))
SQL Server 2014 Express 实例 (Microsoft SQL Server 2014 (SP2-CU18))

我使用函数ENCRYPTBYPASSPHRASE来加密文本并将结果用作 DECRYPTBYPASSPHRASE 的@ciphertext。我的测试结果如下:

结果表

根据这个微软修复

[...] SQL Server 2017 使用 SHA2 散列算法来散列密码。SQL Server 2016 和更早版本的 SQL Server 使用不再被视为安全的 SHA1 算法。

但是,如果函数 DECRYPTBYPASSPHRASE 上没有与此相关的参数,它如何知道用于加密数据的算法是什么?它是加密数据的一部分吗?

根据我的测试结果,我猜 SQL Server 总是使用实例上可用的较新版本的算法来加密数据,但会尝试所有算法来解密数据,直到找到适合的算法或在找不到相应算法时返回 NULL . 这只是一个猜测,因为我找不到任何方法来检查 SQL Server 用于解密加密数据的散列算法。

sql-server encryption

13
推荐指数
1
解决办法
1745
查看次数

有没有办法查看查询优化器生成的候选执行计划是什么?

查询优化器创建多个可能的执行计划。如何查看在选择执行的计划之前生成的所有计划?

微软说

查询优化器必须分析可能的计划并选择估计成本最低的计划。

请注意,我不是在谈论执行计划缓存和重用,我在谈论候选执行计划,即生成但未选择执行的执行计划。

根据 Benjamin Nevarez 的文章SQL Server 查询优化器

候选执行计划的生成在查询优化器内部使用转换规则执行,启发式的使用限制了考虑的选择数量,以保持优化时间合理。候选计划在优化期间存储在内存中,称为备忘录的组件中。

是否有可能以显示实际执行计划的方式呈现候选计划?

sql-server optimization

10
推荐指数
2
解决办法
880
查看次数

为什么使用本地临时表(而不是全局临时表或常规表)会影响查询优化器选择糟糕的查询计划?

这个问题带来了查询优化器在简单查询的现有谓词中选择不好的搜索谓词的情况。运行一些测试后,我得出的结论是,糟糕的决定是由于使用了本地临时表而不是全局临时表或常规表。

db fiddle:本地临时表全局临时表常规表

索引查找信息

我在临时表文档中找不到任何可以解释我们在使用本地临时表而不是全局临时表或常规表时看到的不同行为的特征。这有合乎逻辑的原因还是可能是错误?

sql-server execution-plan temporary-tables

10
推荐指数
1
解决办法
180
查看次数

究竟是什么触发了 sys.database_files 列 is_media_read_only 的 UPDATE?

愿意解决这个问题涉及到一个错误的值is_media_read_only数据库属性我做了一些研究和试验,但最终我不能梳理一下究竟触发列的更新is_media_read_onlysys.database_files

根据sys.database_files文档,该列is_media_read_only应具有以下两个可能值之一:

1 = 文件位于只读媒体上。

0 = 文件在读写介质上。

有了这些信息,我对两个不同版本的 SQL Server 进行了以下实验:

Microsoft SQL Server 2014 (SP3-GDR) (KB4505218) - 12.0.6108.1 (X64)
Microsoft SQL Server 2017 (RTM-CU16) (KB4508218) - 14.0.3223.3 (X64)

在我的笔记本(驱动器 E:) 中插入一个笔式驱动器并创建一个数据库,如下所示:

CREATE DATABASE [MyDB]
 ON  PRIMARY 
( NAME = N'MyDB_01', FILENAME = N'D:\DataBases\MyDB_01.mdf'), 
 FILEGROUP [SECONDARY] 
( NAME = N'MyDB_02', FILENAME = N'E:\DataBasesPendrive\MyDB_02.ndf')
 LOG ON 
( NAME = N'MyDB_log', FILENAME = N'D:\DataBases\MyDB_log.ldf')
GO
Run Code Online (Sandbox Code Playgroud)

查询 sys.database_files: …

sql-server system-tables

8
推荐指数
2
解决办法
324
查看次数

master、tempdb、model 和 msdb 是否可以分别具有 1、2、3、4 以外的 database_id?

据我所知,SQL Server系统数据库总是具有相同的 ID,而且我在 Internet 上看到许多维护脚本依赖谓词WHERE database_id > 4将它们从脚本的操作中排除。

另外,如果我SELECT name, schema_id FROM sys.schemas;在新的用户数据库上运行,我会得到:

name                 schema_id
dbo                  1
guest                2
INFORMATION_SCHEMA   3
sys                  4
db_owner             16384
db_accessadmin       16385
db_securityadmin     16386
db_ddladmin          16387
db_backupoperator    16389
db_datareader        16390
db_datawriter        16391
db_denydatareader    16392
db_denydatawriter    16393
Run Code Online (Sandbox Code Playgroud)

我在两个不同的实例上运行了该查询,一个是 SQL Server 2016,另一个是 SQL Server 2005,并且都返回了相同的结果。

问题:

  1. 是否有任何情况(或 sql server 版本)系统数据库 master、tempdb、model 和 msdb 的 database_id 分别不是 1、2、3、4?
  2. 真的可以相信我列出的架构在任何 SQL Server 实例上都具有相同的 ID,以便我可以根据这些 ID 编写维护脚本吗?

sql-server system-databases objectid

8
推荐指数
2
解决办法
1005
查看次数

为什么我们在 SQL Server 中有未记录和不受支持的函数?

在阅读了一篇日期为2012年的关于未记录的函数fn_dblog 和 fn_dump_dblog的文章后,我想知道如果它们已经存在很长时间并且非常有用,为什么它们仍然未记录且不受支持。与这篇2004 年的sp_msforeachtable 和 sp_msforeachdb文章相同。

我可以从其中一个回答论坛上的问题中受益(在日志备份期间是将数据备份到操作开始还是结束?),但我想知道为什么它们随 SQL Server 一起提供直到现在,以未记录和不受支持的方式。

我知道有人说他们不可靠,但如果这是唯一的原因,他们本可以在 16 年内得到纠正。所以一定有另一种解释。

sql-server documentation functions

8
推荐指数
1
解决办法
1767
查看次数

什么可能导致 SQL Server 一开始拒绝执行 SP,但稍后允许它不更改权限?

用户(Windows 登录)刚刚抱怨他被拒绝执行程序。我去检查并确认他有执行它的权限。我没有改变任何东西(现在我是唯一一个拥有管理员权限的人,如果需要的话),在两次尝试失败后,他尝试第三次运行 SP 并且成功了。

我将 XE 配置为捕获错误消息,它捕获了错误代码 229 的两倍:

对象“storedProcedureName”、数据库“databaseName”、架构“schemaName”的 EXECUTE 权限被拒绝。

是否存在预期这种行为的任何情况?


Microsoft SQL Server 2014 (SP3-CU-GDR) (KB4535288) - 12.0.6372.1 (X64)

sql-server permissions errors sql-server-2014

7
推荐指数
4
解决办法
1853
查看次数

了解查询计划更改的原因

我们的 ERP 系统存在一些性能问题。06:00 左右,问题开始出现。长话短说; 我的一位同事执行了DBCC FREEPROCCACHE(我知道这不是首选操作,但这不是重点)。之后,他重新启动了整个 ERP 应用程序,而不是数据库引擎。这似乎没有帮助。我查看了查询存储,发现查询计划在 06:05 左右发生了更改。我尝试强制执行旧计划,性能问题就消失了。

我比较了 2 个计划 XML,发现两者都基于相同的统计数据(更新日期完全相同)。索引上的更改数量不同,但这不会触发更新统计信息,因为否则新的查询计划将为所使用的统计信息提供新的日期。我检查了涉及的表的所有统计信息,但自上次维护工作以来,它们没有更新。最后一次维护作业在本周末运行,这也是两个查询计划中使用的统计信息的更新日期。

该查询是参数化查询,所以我有点不清楚为什么查询计划突然改变。我认为恰恰相反,查询突然运行缓慢,因为相同的计划用于不同的参数。这里的情况似乎并非如此,因为我强制使用旧的查询计划。

该查询来自一些检索订单的定制工作。现在,我怀疑有人发出了参数化查询,该查询会返回一个非常大的数据集,从而减慢 ERP 系统的速度。然后,我的同事运行了一个DBCC FREEPROCCACHE命令,根据本周末的新统计数据触发了查询计划的重新编译。当前查询继续运行,他决定重新启动 ERP 应用程序。现在,使用新的查询计划,所有新查询都会变慢,直到我强制使用旧的查询计划。

这能是解释吗?我有点怀疑,因为当统计数据发生变化时,SQL Server会触发重新编译,所以计划应该在索引维护作业之后已经重新编译。

我想我在这里遗漏了一些东西,但我不确定是什么。它是SQL Server 2016 Standard,是ERP系统的专用服务器。

编辑 15-4-2020 12:17:既然我写了这个...我认为问题在于DBCC FREEPROCCACHE第一次执行有问题的参数化查询的参数使用了不同的参数,这导致 SQL Server 重新编译(坏)计划。或者我还缺少什么吗?

sql-server optimization execution-plan

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

什么会导致具有 80,000 条记录的表使用 145GB 的空间?

我有一张每天插入和删除的表。平均记录数为 80,000。大约 20 个字段,其中 10 个是 VARCHAR(4000) 但是大多数记录的这些字段为空。1 个 NC 索引占 8MB。

加载此表的作业按预期运行,没有性能问题。

该表每天缓慢增长 1GB,最小记录数增加(有时会减少)。我似乎无法指出是什么导致了这种情况。任何帮助是极大的赞赏!

sql-server storage sql-server-2012

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