数据库管理员

希望提高数据库技能并向社区中的其他人学习的数据库专业人员的问答



4
SSMS工具包替代品[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为数据库管理员Stack Exchange 的主题。 5年前关闭。 有没有可以与SSMS Tools Pack 2012媲美的工具?许可(每台机器30美元,任何数量的机器100美元……为期3个月的许可)还有很多需要改进的地方,我不确定还有哪些其他选择可用。 例如,我真正想念的一件事是“保存您运行的每个查询”。进行修补和研究时,在运行查询时对不同版本的查询进行运行备份是非常宝贵的。或者,当我意识到我没有2个月前正在处理的查询的备份时。 澄清:SQL Server Management Studio没有官方的附加组件支持,但是那里有一些工具。SSMS Tools Pack是我非常喜欢的工具包(2005、2008版本),但是2012年的许可费用太高了。(我会支付合理的许可证费用,但这不是这里的问题。) 例如,我发现了SSMS Boost,它在SSMS中添加了一些很酷的功能,似乎值得。 SQL Server 2012还可以使用哪些其他加载项?我很想有一些东西可以像SSMS Tools Pack一样在按F5时保存查询,或者除了列出的两个工具之外还有其他东西?

1
为什么此派生表可以提高性能?
我有一个查询,需要一个json字符串作为参数。json是纬度,经度对的数组。输入示例如下。 declare @json nvarchar(max)= N'[[40.7592024,-73.9771259],[40.7126492,-74.0120867] ,[41.8662374,-87.6908788],[37.784873,-122.4056546]]'; 它调用一个TVF,该TVF可以计算在1、3、5、10英里距离处某个地理位置周围的POI数量。 create or alter function [dbo].[fn_poi_in_dist](@geo geography) returns table with schemabinding as return select count_1 = sum(iif(LatLong.STDistance(@geo) <= 1609.344e * 1,1,0e)) ,count_3 = sum(iif(LatLong.STDistance(@geo) <= 1609.344e * 3,1,0e)) ,count_5 = sum(iif(LatLong.STDistance(@geo) <= 1609.344e * 5,1,0e)) ,count_10 = count(*) from dbo.point_of_interest where LatLong.STDistance(@geo) <= 1609.344e …

1
单行INSERT…SELECT比单独的SELECT慢得多
给定以下堆表,该堆表具有从1到400编号的400行: DROP TABLE IF EXISTS dbo.N; GO SELECT SV.number INTO dbo.N FROM master.dbo.spt_values AS SV WHERE SV.[type] = N'P' AND SV.number BETWEEN 1 AND 400; 以及以下设置: SET NOCOUNT ON; SET STATISTICS IO, TIME OFF; SET STATISTICS XML OFF; SET TRANSACTION ISOLATION LEVEL READ COMMITTED; 以下SELECT语句将在6秒钟左右完成(demo,plan): DECLARE @n integer = 400; …

1
SQL Server何时会发出有关过多的内存授予的警告?
产生“过度拨款”执行计划警告的条件是什么? 查询内存授权检测到“ ExcessiveGrant”,这可能会影响可靠性。授予大小:初始5128 KB,最终5128 KB,已用16 KB。 短信服务 计划浏览器 Showplan XML <Warnings> <MemoryGrantWarning GrantWarningKind="Excessive Grant" RequestedMemory="5128" GrantedMemory="5128" MaxUsedMemory="16" /> </Warnings>

1
清除数据的最快方法是什么?
场景: 我们在订阅服务器上有两个表Tbl1&Tbl2。在Tbl1正在从出版商复制的Server A,它有两个触发器-插入和更新。触发器正在将数据插入并更新到中Tbl2。 现在,我们必须清除(大约9亿条记录)Tbl2中的总数超过1000+百万条记录。以下是一个月到一分钟的数据分布。 一个月-14986826行 一天-483446行 一小时-20143行 一分钟-335行 我在寻找什么 清除该数据的最快方法,不会产生任何生产问题,数据一致性,也可能不会造成停机。因此,我正在考虑按照以下步骤操作,但遇到了:( 脚步: BCP从现有表Tbl2中输出所需的数据(大约1亿条记录,大约需要30分钟)。 假设我从1Fab2018 10:00 PM开始进行活动,并在1Fab2018 10:30 PM结束了活动。到活动完成时,表Tbl2将获得变为增量的新记录。 在名称为Tbl3的数据库中创建一个新表 BCP将导出的数据导入到新创建的表Tbl3中(大约1亿条记录,可能需要大约30分钟) 停止复制作业 完成BCP输入后,请使用tsql脚本插入新的增量数据。 挑战是-如何处理增量“更新”语句? 开始复制 附加问题: 处理场景的最佳方法是什么?

2
“ SELECT TOP”效果问题
我有一个查询,使用select可以运行得更快,top 100而没有则要慢得多top 100。返回的记录数为0。能否解释查询计划中的差异或在解释差异的地方共享链接? 没有top文本的查询: SELECT --TOP 100 * FROM InventTrans JOIN InventDim ON InventDim.DATAAREAID = 'dat' AND InventDim.INVENTDIMID = InventTrans.INVENTDIMID WHERE InventTrans.DATAAREAID = 'dat' AND InventTrans.ITEMID = '027743' AND InventDim.INVENTLOCATIONID = 'КзРЦ Алмат' AND InventDim.ECC_BUSINESSUNITID = 'Казахстан'; 以上查询计划(不含top): https://pastebin.com/cbtJpxFf IO和TIME统计信息(无top): SQL Server parse and compile time: CPU time = 0 …


7
在SQL Server中优化数值范围(间隔)搜索
此问题类似于优化IP范围搜索?但是那只限于SQL Server 2000。 假设我将1000万个范围临时存储在一个表中,该表的结构和填充如下。 CREATE TABLE MyTable ( Id INT IDENTITY PRIMARY KEY, RangeFrom INT NOT NULL, RangeTo INT NOT NULL, CHECK (RangeTo > RangeFrom), INDEX IX1 (RangeFrom,RangeTo), INDEX IX2 (RangeTo,RangeFrom) ); WITH RandomNumbers AS (SELECT TOP 10000000 ABS(CRYPT_GEN_RANDOM(4)%100000000) AS Num FROM sys.all_objects o1, sys.all_objects o2, sys.all_objects o3, sys.all_objects o4) …

6
与简单地重建每个索引相比,ALTER INDEX ALL REBUILD是否使用具有简单恢复模型的事务日志空间更多?
由于事务日志空间不足,SQL Server 2012上的“ ALTER INDEX ALL REBUILD”操作失败。索引从未进行过重组或重建,因此几乎所有索引上的碎片都超过80%。 数据库使用简单的恢复模型。我假设在命令的“ ALL”形式执行的每个索引操作之后,在下一次重建索引之前将刷新事务日志数据。这是它的实际工作方式,还是索引重建记录为好像是单个事务的一部分? 换句话说,是否可以通过编写脚本来分别执行每个重建来减少事务日志的增长?还有其他要考虑的因素吗?
18 sql-server  index 

6
始终将单个整数列作为主键的不利之处是什么?
在我正在处理的一个Web应用程序中,所有的数据库操作都使用在Entity Framework ORM上定义的一些通用存储库来抽象。 但是,为了对通用存储库进行简单设计,所有涉及的表都必须定义一个唯一的整数(Int32在C#中,int在SQL中)。到目前为止,这始终是表格的PK以及IDENTITY。 外键被大量使用,它们引用这些整数列。它们是一致性和ORM生成导航属性所必需的。 应用程序层通常执行以下操作: 从表(*)加载初始数据 -SELECT * FROM table 更新 -UPDATE table SET Col1 = Val1 WHERE Id = IdVal 删除 -DELETE FROM table WHERE Id = IdVal 插入 -INSERT INTO table (cols) VALUES (...) 不太频繁的操作: 批量插入 - BULK INSERT ... into table所有数据加载后跟(*)(以检索生成的标识符) 批量删除 -这是正常的删除操作,但是从ORM的角度来看,这是“笨拙的”:DELETE FROM table where …

1
如何防止在列上创建统计信息?
我有一个表,该表的列不希望创建或更新统计信息。如果我强制查询优化器在主键上使用统计密度而不是在该列上使用统计直方图,则可以得到更好的联接基数估计。自动更新和自动创建统计信息处于数据库级别,我无法更改。 如果要建议防止统计信息创建的替代方法,请记住该表用于成千上万个不同查询所引用的视图中。我无法控制所运行的查询。 我最初的策略是使用NOCOMPUTE和SAMPLE 0 ROWS选项在该列上创建统计信息。我的印象是,SQL Server不会在已经具有统计对象的列上自动创建统计信息,但这在我们的dev和QA服务器上已经发生。 为创建了新的统计信息COL_GROUP。我的NORECOMPUTE统计信息没有更新。我不知道为什么创建统计信息,而且我无法通过运行查询来触发该统计信息。 有没有一种方法可以防止SQL Server在一个列上自动创建统计信息?我的表只有两列,因此防止在单个表上创建自动状态的解决方案也可以解决我的问题。 跟踪标记4139和2371会打开,以防产生影响。 如果您想使用表结构,请在下面添加它和示例数据: CREATE TABLE X_NO_COLUMN_STATS( [COL_USER] [varchar](256) NOT NULL, [COL_GROUP] [int] NOT NULL, CONSTRAINT [PK_X_NO_COLUMN_STATS] PRIMARY KEY CLUSTERED ( [COL_USER] ASC, [COL_GROUP] ASC )WITH (DATA_COMPRESSION = PAGE) ); -- prevent stats from being updated on COL_GROUP CREATE STATISTICS [X_NO_COLUMN_STATS__COL_GROUP] ON X_NO_COLUMN_STATS …

4
为什么我不能像我想象的那样在T-SQL中使用变量?
请原谅,我是一名开发人员,已经转移到SQL领域。我以为我可以通过添加变量来改进一些SQL,但它的功能不像我预期的那样。有人可以告诉我为什么这行不通吗?我不想变通,我想知道为什么此方法不起作用的原因,就像我想像的那样,因为我确信这是有充分的理由的,但是目前还没有跳出来。 DECLARE @DatabaseName varchar(150) SET @DatabaseName = 'MyAmazingDatabaseName' CREATE DATABASE @DatabaseName GO USE @DatabaseName GO

1
特殊数据库“ postgres”有什么用?
我有一台PostgreSQL服务器,上面运行着几个数据库。其中一个数据库称为postgres,从一开始就在那里。我看不到任何表,也从未明确使用它,但是我注意到,任何用户都可以在数据库中创建表(这不是我想要的-除了管理员,我不希望任何用户创建表任何地方的任何表格)。 我感觉这是服务器正常运行所需的某种特殊数据库,但是它的确切目的是什么?里面(或可能)存储什么样的数据?它是否保存有关其他数据库的元数据(例如information_schema?)。如果我connect从公共场所撤消了对该数据库的特权,会发生令人讨厌的事情吗?还是我什至掉线了? 我用谷歌搜索了半个小时,但是总是得到完全无关的东西,因为这个词postgres也用于用户postgres和DBMS本身。
18 postgresql 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.