数据库管理员

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

5
无法在计算列上创建过滤索引
在我的上一个问题中,在向表中添加新的计算列时禁用锁升级是个好主意吗?,我正在创建一个计算列: ALTER TABLE dbo.tblBGiftVoucherItem ADD isUsGift AS CAST ( ISNULL( CASE WHEN sintMarketID = 2 AND strType = 'CARD' AND strTier1 LIKE 'GG%' THEN 1 ELSE 0 END , 0) AS BIT ) PERSISTED; 计算所得的列是PERSISTED,并且根据computed_column_definition(Transact-SQL): 坚持 指定数据库引擎将物理地将计算出的值存储在表中,并在更新计算出的列所依赖的任何其他列时更新这些值。将计算列标记为PERSISTED允许在确定的但不精确的计算列上创建索引。有关更多信息,请参见计算列上的索引。任何用作分区表分区列的计算列都必须显式标记为PERSISTED。当指定PERSISTED时,computed_column_expression必须是确定性的。 但是,当我尝试在列上创建索引时,出现以下错误: CREATE INDEX FIX_tblBGiftVoucherItem_incl ON dbo.tblBGiftVoucherItem (strItemNo) INCLUDE (strTier3) WHERE isUsGift = 1; …

4
在窗口功能中使用DISTINCT和OVER
我正在尝试将查询从Oracle迁移到SQL Server 2014。 这是我的查询,在Oracle中效果很好: select count(distinct A) over (partition by B) / count(*) over() as A_B from MyTable 这是我尝试在SQL Server 2014中运行此查询后遇到的错误。 Use of DISTINCT is not allowed with the OVER clause 有人知道是什么问题吗?在SQL Server中可以进行这种查询吗?请指教。

2
需要了解并行查询执行错误
今天,我们的生产sql服务器的性能下降了。在发生这种情况时,我们记录了一些"The query processor could not start the necessary thread resources for parallel query execution"错误。我所做的阅读表明,这与执行复杂查询时使用多少个CPU有关。但是,当我在停电期间检查时CPU Utilization was only at 7%。还有其他我可能还没有提到的东西吗?这可能是性能下降的罪魁祸首吗?还是我追赶红鲱鱼? 我的sp_configure值如下: name minimum maximum config_value run_value cost threshold for parallelism 0 32767 5 5

4
真空/自动真空操作需要多少时间?
我管理着一个大型的数据库(数百个演出),其中包含具有各种角色的表,其中一些表拥有数百万条记录。一些表只接收大量的插入和删除,另一些表则接收大量的插入和删除。 数据库在带有16 GB RAM的Debian 6.0 amd64系统上的PostgreSQL 8.4上运行。 问题有时是在桌子上进行自动真空处理,需要很长时间(几天)才能完成。我希望能够粗略地知道一个特定的真空命令将花费多少时间,以便能够决定是否取消它。另外,如果有用于postgres真空操作的进度指示器,那将真的很有帮助。 编辑: 我不是在寻找防弹解决方案。只需给出死元组数或必要的I / O字节数的粗略提示就可以确定。VACUUM无论何时何地都不知道,真是令人讨厌。 我已经看到pg_catalog.pg_stat_all_tables有一个死元组数列。因此,即使有可能需要对表进行估算,也可以进行估算ANALYZE。在另一方面,autovacuum_vacuum_threshold与autovacuum_vacuum_scale_factor设置单独证明Postgres的本身知道一些有关变化对表的数量,并可能将其放在了DBA手中了。 我不确定要运行什么查询,因为在运行时VACUUM VERBOSE,我不仅看到表,而且也正在处理它们的索引。

2
是否应在适用于MySQL的AWS RDS t1-micro中增加max_connections?
我有一个运行MySQL 5.5的AWS RDS t1-micro。它给我太多连接错误。我检查了一下,它允许并发最多连接34个。我读到的是可以通过为此Micro实例创建一个数据库参数组来增加此最大值。 我的困惑是 我是否应该增加数据库参数组中微控制器的最大连接值?还是我应该考虑升级到提供更多最大连接数的下一个RDS级别(125)? 我应该将微型RDS上的max_connections增加到125,而不是升级到RDS小实例吗? 我为什么要做出什么决定? 谢谢

4
使用GUID作为主键修复数据库设计的最佳解决方案
在对这一想法进行确认后,我将修复性能不佳的数据库或一个更好的建议(如果有的话)。始终欢迎更好的建议。 我有一个非常大的数据库(20+百万条记录,每天增长约1/2百万条),它们使用GUID作为PK。 我的疏忽大意是,但是PK聚集在SQL Server上,并导致性能问题。 产生引导的原因-该数据库与150个其他数据库部分同步,因此PK需要唯一。同步不是由SQL Server管理的,而是建立了一个自定义过程,该过程使数据保持同步以符合系统要求-全部基于该GUID。 150个远程数据库中的每个数据库都不存储中央SQL数据库中存储的完整数据。他们只存储他们实际需要的数据的子集,并且需求的数据并不是他们唯一的(例如,在150个数据库中,有10个可能具有其他站点数据库中的某些相同记录-它们共享)。另外-数据实际上是在远程站点而不是在中心点生成的,因此需要GUID。 中央数据库不仅用于使所有内容保持同步,而且还将针对该非常大的碎片数据库执行来自3000多个用户的查询。在初始测试中,这已经是一个大问题。 幸运的是我们还没有上线-因此我可以进行更改,并在需要时将其脱机,至少这是必须的。 远程数据库的性能不是问题-数据子集非常小,并且数据库的总大小通常不会超过1GB。记录被定期地反馈到主系统,并在不再需要时从较小的BD中删除。 保留所有记录的中央数据库的性能令人担忧-由于群集GUID是许多记录的主键。索引碎片不在图表上。 所以-我想解决性能问题的想法是创建一个新列-Unsigned BIGINT IDENTITY(1,1),然后更改表BIGINT列的Clustered PK。 我将在GUID字段上创建唯一非聚集索引,该索引是主键。 较小的远程150数据库不需要了解Central SQL Server数据库上的新PK-它仅用于组织数据库中的数据并阻止不良的性能和碎片。 这样做是否可以提高中央SQL数据库的性能,并防止将来出现索引碎片地狱(在一定程度上)?还是我错过了这里很重要的东西,它会跳起来咬我,引起更多的悲伤?


2
SQL Server如何在将列更新为int时解决事务日志填满的问题
我有一个称为SQL Server 2005的表BRITTNEY_SPEARS_MARRIAGES,它具有以下列: MarrigeId tinyint, HusbandName varchar(500), MarrigeLength int 现在我有另一张桌子 BRITTNEY_SPEARS_MARRIAGE_STORIES StoryId int, MarriageId tinyint, StoryText nvarchar(max) 问题是我们想将MarrigeId列从中更新int为tinyint。我们只是觉得在说完一切之前,布兰妮将会有很多婚姻。 现在BRITTNEY_SPEARS_MARRIAGE_STORIES表中有1800万行(嘿,女孩遇到了一些问题),因此当我们进行更新时,事务日志已填满,SQL Server框消失了。 我们如何解决这个问题? 无论如何都说“嘿,SQL Server,我将更新此列并将其扩大。在此SQL Server上相信我。请在尝试验证所有内容时不要填写事务日志?”

4
数据库设计:如何处理“归档”问题?
我敢肯定,很多应用程序,关键应用程序,银行等等每天都在执行此操作。 所有这些背后的想法是: 所有行都必须有一个历史记录 所有链接必须保持连贯 发出获取“当前”列的请求应该很容易 购买过时物品的客户仍应查看购买的物品,即使该产品不再属于目录 等等。 这是我想要做的,我将解释我面临的问题。 我所有的表都有这些列: id id_origin date of creation start date of validity start end of validity 以下是CRUD操作的想法: create =用id_origin= id,date of creation= now,start date of validity= now,end date of validity= null 插入新行(=表示它是当前活动记录) 更新= 读取=读取所有记录,其中end date of validity== null end date of validity用end date of …

2
SQL Server联接/位置处理顺序
在阅读了慢速SQL查询之后,不确定如何优化,这让我开始思考查询的一般性能。当然,我们需要将第一个表(在连接其他表时)的结果尽可能小,然后再进行连接(此问题的内部连接),以使我们的查询快一点。 示例,应该这样: SELECT * FROM ( SELECT * FROM table1 WHERE col = @val ) t INNER JOIN table2 ON col = col2 比以下更好/更快: SELECT * FROM table1 INNER JOIN table2 ON col = col2 WHERE table1.col = @val 我的理论如下(这可能不是正确的实现,我试图从我读过的一本SQL Server 2008内部书籍(MSFT Press)中记住): 查询处理器首先获取左表(表1) 在过滤掉必要的行之前,连接第二个表(表2)并形成笛卡尔积(如果适用) 然后使用SEELCT语句最后执行WHERE,ORDER BY,GROUP BY,HAVING子句。 因此,如果在上面的语句1中表较小,则在形成笛卡尔积时SQL引擎要做的工作较少。然后,当您到达where语句时,您将得到减少的结果集,可以从中筛选出结果集。 我可能还差得远,这是不真实的。就像我说的,这是一种理论。 …



4
如何在结果表定义未知的情况下生成透视CROSS JOIN?
给定两个具有未定义的行计数和名称和值的表,我将如何显示CROSS JOIN函数在其值上的透视图。 CREATE TEMP TABLE foo AS SELECT x::text AS name, x::int FROM generate_series(1,10) AS t(x); CREATE TEMP TABLE bar AS SELECT x::text AS name, x::int FROM generate_series(1,5) AS t(x); 例如,如果该函数是乘法,那么我将如何生成一个(乘法)表,如下所示, 所有这些(arg1,arg2,result)行都可以使用 SELECT foo.name AS arg1, bar.name AS arg2, foo.x*bar.x AS result FROM foo CROSS JOIN bar; 因此,这仅是表示的问题,我希望它也可以使用自定义名称 -这个名称不仅是CAST文本的参数而是在表中设置的, CREATE …

2
IDENTITY列中出现意外间隔
我正在尝试生成从1开始并以1递增的唯一采购订单号。我有一个使用以下脚本创建的PONumber表: CREATE TABLE [dbo].[PONumbers] ( [PONumberPK] [int] IDENTITY(1,1) NOT NULL, [NewPONo] [bit] NOT NULL, [DateInserted] [datetime] NOT NULL DEFAULT GETDATE(), CONSTRAINT [PONumbersPK] PRIMARY KEY CLUSTERED ([PONumberPK] ASC) ); 使用此脚本创建的存储过程: CREATE PROCEDURE [dbo].[GetPONumber] AS BEGIN SET NOCOUNT ON; INSERT INTO [dbo].[PONumbers]([NewPONo]) VALUES(1); SELECT SCOPE_IDENTITY() AS PONumber; END 在创建时,这可以正常工作。当存储过程运行时,它将以所需的编号开始,并以1递增。 奇怪的是,如果我关闭计算机或使其进入休眠状态,那么下一次该过程运行时,序列将增加近1000。 查看以下结果: 您会看到数字从8跃升至1002! …


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.