数据库管理员

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

3
SQL Server-临时表与物理表
在我的工作场所中,正在逐渐摆脱使用#temp表,而是使用具有SPID的永久物理表的趋势。只要以前将INSERTINSERT插入#temp表中,现在INSERT INTO dbo.MyPermanentTable (SPID, ...) VALUES (@@SPID, ...)都需要一个- DELETE FROM dbo.MyPermanentTable WHERE SPID = @@SPID在存储过程开始时加上一堆语句。此外,不用说,在使用这些“用于存储临时数据的永久性表”的地方,都必须小心包含一个WHERE SPID = @@SPID。 采取这种做法的逻辑是,它将提高运行查询的服务器的整体性能(通过减少tempdb中的I / O和争用)。由于多种原因,我并不热衷于这种方法-这种方法很丑陋,潜在危险,而且似乎很可能损害那些使用新方案的查询的性能。 有没有人有这种消除#temp表的方法或类似方法的经验?

1
强制性的可读二级计划
如果计划是针对可用性组中的主数据库执行的,则该计划是否适用于在辅助数据库上运行的查询? 我正在寻找涵盖计划强制的两种可能性的答案: 计划指南 查询存储强制计划 我阅读了以下内容,这些内容表明QS强制计划不会继续存在,但找不到文档中的权威内容或有关计划指南的任何内容。 Erin Stellato的查询存储和可用性组 在 Vikas Rana的AlwaysOn可读辅助数据库上查询数据存储强制计划行为 强迫的结论性证据将是二级执行计划中存在Use Plan或PlanGuideName和PlanGuideDB属性。

1
无法在非唯一索引上插入重复的键行?
在连续八周无错误之后,过去几天我们三度遇到了这个奇怪的错误,我很沮丧。 这是错误消息: Executing the query "EXEC dbo.MergeTransactions" failed with the following error: "Cannot insert duplicate key row in object 'sales.Transactions' with unique index 'NCI_Transactions_ClientID_TransactionDate'. The duplicate key value is (1001, 2018-12-14 19:16:29.00, 304050920).". 我们拥有的索引不是唯一的。如果您注意到,错误消息中的重复键值甚至不会与索引对齐。奇怪的是,如果我重新运行proc,它将成功。 这是我发现的最新链接,但有我的问题,但没有解决方案。 https://www.sqlservercentral.com/forums/topic/error-cannot-insert-duplicate-key-row-in-a-non-unique-index 关于我的场景的几件事: proc正在更新TransactionID(主键的一部分)-我认为这是导致错误的原因,但不知道为什么?我们将删除该逻辑。 在表上启用了更改跟踪 进行事务读取未提交 每个表有45个字段,我主要列出索引中使用的字段。我在更新语句中(不必要)更新TransactionID(集群键)。奇怪的是,直到上周,我们几个月都没有遇到任何问题。而且这只是通过SSIS偶尔发生的。 表 USE [DB] GO /****** Object: Table [sales].[Transactions] Script …

2
SQL Server可以在系统生成的约束名称中创建冲突吗?
我有一个可以在SQL Server 2008数据库(非群集)中创建数百万张表的应用程序。我希望升级到SQL Server 2014(群集),但在负载下却遇到错误消息: “数据库中已经存在一个名为'PK__tablenameprefix__179E2ED8F259C33B'的对象” 这是系统生成的约束名称。它看起来像是随机生成的64位数字。由于表格数量众多,我是否有可能看到冲突?假设我有1亿张表,那么在添加下一张表时,我计算出发生冲突的机会要小于1万亿分之一,但这假设分布是一致的。SQL Server是否有可能在2008年和2014年之间更改其名称生成算法以增加发生冲突的可能性? 另一个明显的不同是,我的2014年实例是一个成对的,但是我正在努力形成一个假设,说明为什么会产生上述错误。 PS:是的,我知道创建数百万张表很疯狂。这是我无法控制的黑匣子第三方代码。尽管有精神错乱,但它在2008版中仍然有效,现在在2014版中不再适用。 编辑:仔细检查后,生成的后缀似乎总是以179E2ED8开头-这意味着随机部分实际上只是一个32位数字,每次添加新表时,冲突几率仅为50分之一。与我看到的错误率更接近!

2
更改“ sa”密码是否需要重新启动SQL(在混合模式下)?
我们发现一个SQL“ sa”帐户的使用方式不应该被使用,因此我们正在更改所有SQL实例上的sa密码。 (我们有以混合身份验证模式运行的SQL 2005至2017服务器。所有用户和应用程序都应使用域帐户或非sa SQL帐户进行连接。我一直在监视,但未发现任何其他应用程序,用户或非-使用sa帐户的内部sps。) 几个问题: Q1:更改sa密码是否需要重新启动SQL? 我发现一些参考资料说更改sa帐户密码后需要重新启动SQL服务: DBA SE:更改sa密码 SQLAuthority:使用Management Studio更改SA登录的密码 真的吗?还是仅当我更改身份验证模式时?还是仅当我以sa常规身份登录时? 这个SQL Server Central线程甚至建议更改它可能会影响现有的SQL代理作业和其他内容。这是一个问题吗?还是仅当有人将SA帐户硬编码到SSIS包或其他内容中时? (如果很重要,我们将域帐户用于SQL服务和SQL代理服务,并将域代理帐户用于调用SSIS包或PowerShell脚本的作业。) Q2:我可以以“正常”方式更改sa密码吗? 我可以像重设其他帐户一样重设吗?使用SSMS,或更可能通过以下方式: ALTER LOGIN sa WITH PASSWORD = 'newpass'; 还是我必须进入单用户模式或需要计划停机的时间?(请注意,我将通过域帐户运行此文件,而不是以“ sa”身份连接。) 问题3:我们是否应该尝试定期进行此密码轮换?或仅在我们发现问题时? 这是推荐的“最佳实践”吗?

1
IDLE状态在pg_stat_activity行中表示什么?
有人可以解决我关于pg_stat_activitypostgres 9.5的以下疑问吗? 可以让我知道state IDLE行中的表示什么pg_stat_activity吗?是否就像它检查到postgres的所有打开的连接,并且如果该连接未执行任何查询,则IDLE表示该连接执行的最后一个查询? 在输出中,select * from pg_stat_activity我看到与state IDLE的行和query_start_date超过2天的行?这意味着什么?我应该为此担心吗? 有人可以让我知道如何填充pg_stat_activity吗?如果我正在执行查询,例如Select * from pg_stat_activity它是否从postgres维护的某些快照中生成详细信息,或者它检查在postgres中打开的当前连接以提供详细信息?
14 postgresql 

2
SQL Server 2016的奇怪性能问题
我们在VMware虚拟机中运行SQL Server 2016 SP1的单个实例。它包含4个数据库,每个数据库用于一个不同的应用程序。这些应用程序都位于单独的虚拟服务器上。它们都没有在生产中使用。但是,测试应用程序的人员正在报告性能问题。 这些是服务器的统计信息: 128 GB RAM(SQL Server最大110GB内存) 4核@ 4.6 GHz 10 GBit网络连接 所有存储均基于SSD 程序文件,日志文件,数据库文件和tempdb位于服务器的单独分区上 阿斯 用户正在通过基于C ++的ERP应用程序执行单屏访问。 当我ostress使用许多小型查询或大型查询对Microsoft的SQL Server进行压力测试时,我将获得最佳性能。唯一的限制是客户,因为他不能足够快地回答。 但是,当几乎没有用户时,SQL Server几乎什么也不做。然而,人们必须永远等待以保存应用程序中的所有内容。 根据Paul Randal的“ 告诉我哪里疼 ”查询,所有等待事件中有50%是ASYNC_NETWORK_IO。 这可能意味着网络问题,或者应用程序服务器或客户端的性能问题。这些都无法最大程度地远程使用其资源。大多数情况下,所有计算机(客户端,应用服务器,数据库服务器)上的CPU大约占26%。 网络连接的延迟约为1-3ms。在正常使用该应用程序期间,数据库服务器的IO最高写入速度为20MB / s(平均为7-9MB / s)。当我进行压力测试时,最高速度达到5GB / s。 对于我们的ERP系统数据库,缓冲区高速缓存大小为60GB,对于我们的财务软件,为20GB,对于质量保证软件,为1GB,对于文档归档系统,为3GB。 我授予了SQL Server帐户使用即时文件初始化的权利。丝毫没有提高性能。 在正常使用期间,页面预期寿命约为15k +。在预期的重压力测试结束时,该值下降至.05k左右。批处理/秒约为2-8k,具体取决于工作负载。 我会说ERP应用程序写得不好,但是我不能,因为所有应用程序都受影响。即使工作量最少。 但是我无法查明是什么原因造成的。是否有任何提示,提示教程,应用程序,最佳/最差实践文档或其他有关此问题的想法? 这些是来自的结果sp_BlitzFirst: 我跑了600秒。我在工作量很大的应用程序中启动了它。是1/3的时间ASYNC_NETWORK_IO。我还测试与网络连接NTttcp,PsPing,ipferf3,和pathping。没什么不寻常的。响应时间最大3毫秒,平均0.3毫秒。吞吐量约为1000 MB / s。 我的调查总是导致ASYNC_NETWORK_IOwaitstat排名第一。 我们调查了Large-Receive-Offload在VMware 中禁用该功能的结果。我们仍在测试中,但结果似乎不一致。我们的第一个“基准测试”持续了19分钟(最高结果是13分钟,只有当应用程序在具有SQL …

1
扩展事件允许的最大绑定动作数是多少?
如果在事件会话中向事件添加“太多”操作,则会收到此错误: 消息25639,级别16,状态23,第1行该事件“ [事件名称]”超出了允许的绑定操作数。 允许多少动作?它会因事件而变化吗? 根据实验,答案似乎是27 sqlserver.rpc_completed。但是我在任何Microsoft文档中都没有找到这个数字。而且似乎因事件而异,因为我能够获得30分sqlserver.sql_batch_completed。 失败的示例代码: CREATE EVENT SESSION [Test] ON SERVER ADD EVENT sqlserver.rpc_completed( ACTION( package0.callstack, package0.collect_cpu_cycle_time, package0.collect_current_thread_id, package0.collect_system_time, package0.event_sequence, package0.last_error, package0.process_id, sqlos.cpu_id, sqlos.numa_node_id, sqlos.scheduler_address, sqlos.scheduler_id, sqlos.system_thread_id, sqlos.task_address, sqlos.task_elapsed_quantum, sqlos.task_resource_group_id, sqlos.task_resource_pool_id, sqlos.task_time, sqlos.worker_address, sqlserver.client_app_name, sqlserver.client_connection_id, sqlserver.client_hostname, sqlserver.client_pid, sqlserver.context_info, sqlserver.database_id, sqlserver.database_name, sqlserver.is_system, sqlserver.nt_username, sqlserver.plan_handle)) GO DROP EVENT SESSION [Test] …

4
此时只有一个管理员可以连接(MS SQL Server错误18461)
我正在试验给SQL Server少量内存的效果,我认为它会恢复。 我将SQL Server配置为使用200MB的内存,现在它不想启动,我在Internet上进行了一些搜索,建议我以单用户模式启动SQL Server。但是,我得到了错误 用户A的登录失败。原因:服务器处于单用户模式。此时只有一个管理员可以连接(Microsoft SQL Server,错误:18461) 我已经停止了SQL Server代理。
14 sql-server 

1
从Postgres查询非ASCII行
是否[:ascii:]在所有的Postgres类的工作?在他们的帮助中没有列出它,但是我在网络上看到一些利用它的示例。 我有一个UTF-8数据库,其中归类和c_typ e是en_US.UTF-8,而Postgres版本是9.6.2。当我搜索这样的非ASCII行时: select title from wallabag_entry where title ~ '[^[:ascii:]]'; 我同时获得了 Unicode和非Unicode符号(完整的输出在): Сталинская правозащитница: мать Меленкова бабушка Настя Дневник НКВДиста Шабалина: Знает ли Москва положение на фронте? Бег по городу и поездка на осле: как в средневековье наказывали прелюбодеев Как комиссар Крекшин в 1740-е чуть не отменил историю России …

2
什么索引可用于大量重复值?
让我们做一些假设: 我有这样的表: a | b ---+--- a | -1 a | 17 ... a | 21 c | 17 c | -3 ... c | 22 关于我的场景的事实: 整个表的大小是〜10 10行。 我有〜100k行,其中acolumn中有值,a其他值也类似(例如c)。 这意味着“ a”列中的〜100k个不同的值。 我的大部分查询将读取例如中的给定值的全部或大部分值select sum(b) from t where a = 'c'。 该表以这样的方式编写,即连续值在物理上接近(或者按顺序编写,或者我们假设CLUSTER已在该表和column上使用过a)。 该表很少更新(如果有的话),我们只关心读取速度。 该表相对较窄(例如每个元组约25个字节,+ 23个字节的开销)。 现在的问题是,我应该使用哪种索引?我的理解是: BTree我的问题是BTree索引将是巨大的,因为据我所知它将存储重复值(它必须这样做,因为它不能假定表是物理排序的)。如果BTree很大,那么我最终必须同时读取索引和该索引指向的表的各个部分。(我们可以用来fillfactor = 100稍微减小索引的大小。) BRIN我的理解是,我可以在这里建立一个小的索引,而以阅读无用的页面为代价。使用较小的值pages_per_range表示索引较大(这是BRIN的问题,因为我需要读取整个索引),使用较大的值pages_per_range表示我将读取很多无用的页面。pages_per_range考虑到这些折衷,是否有一个神奇的公式可以找到一个好的价值? GIN …

2
为什么array_agg()比非聚合ARRAY()构造函数慢?
我只是在回顾一些为8.4之前的PostgreSQL编写的旧代码,我发现确实很不错。我记得以前有一个自定义函数来执行某些操作,但我忘记了它的外观array_agg()。为了进行回顾,现代聚合是这样写的。 SELECT array_agg(x ORDER BY x DESC) FROM foobar; 但是,从前,它是这样写的, SELECT ARRAY(SELECT x FROM foobar ORDER BY x DESC); 因此,我尝试了一些测试数据。 CREATE TEMP TABLE foobar AS SELECT * FROM generate_series(1,1e7) AS t(x); 结果令人惊讶。#OldSchoolCool方法大大提高了速度:加快了25%。而且,在不使用ORDER的情况下对其进行简化显示出相同的慢度。 # EXPLAIN ANALYZE SELECT ARRAY(SELECT x FROM foobar); QUERY PLAN ----------------------------------------------------------------------------------------------------------------------------- Result (cost=104425.28..104425.29 rows=1 width=0) (actual time=1665.948..1665.949 rows=1 …

2
从CTE内部调用时未执行PostgreSQL函数
只是希望确认我的观察并获得关于为什么发生这种情况的解释。 我有一个函数定义为: CREATE OR REPLACE FUNCTION "public"."__post_users_id_coin" ("coins" integer, "userid" integer) RETURNS TABLE (id integer) AS ' UPDATE users SET coin = coin + coins WHERE userid = users.id RETURNING users.id' LANGUAGE "sql" COST 100 ROWS 1000 VOLATILE RETURNS NULL ON NULL INPUT SECURITY INVOKER 当我从CTE调用此函数时,它将执行SQL命令,但不会触发该函数,例如: WITH test AS (SELECT …
14 postgresql  cte 

2
用于集成测试的SQL Server数据库快照
我正在尝试为集成测试定义一种使用测试数据库(在SQL Server中)的方法。 我的想法是在集成测试程序集启动时执行以下步骤: 创建一个完全空的数据库 运行“创建数据库对象”脚本以创建所有相关的数据库对象(表,视图,序列等) 填写“基础数据”(查找值等) 拍摄称为(db)_Basis“基准” 的数据库快照,以进行将来的集成测试 现在,在每个测试类(包含1-n个测试)之前,我打算简单地执行“从快照还原”以返回到数据库定义良好的或多或少的“空”状态。到目前为止,它就像一个魅力。 但是,有一组集成测试需要在大型测试数据库上进行操作-所以我希望在每个测试装置(具有n个单独测试的类)之前进行此操作 从(db)_Basis快照还原数据库 将那5万多行数据插入数据库 创建另一个快照(db)_With_Testdata快照 然后对于每个测试,将数据库重置为定义良好的(db)_With_Testdata快照版本,运行测试,验证结果等等。 问题是:我似乎无法同时拥有两个数据库快照-一旦这样做,就无法将我的数据库还原到其中任何一个....我一直收到此错误: 消息3137,级别16,状态4,第9行 数据库无法还原。错误地指定了主要名称或快照名称,未删除所有其他快照或缺少文件。 消息3013,级别16,状态1,第9行 RESTORE DATABASE正在异常终止。 这真的就是SQL Server数据库快照的工作方式吗?似乎有严格的限制.....我会理解是否不能直接返回到原始的“(db)_Basis”快照-但是仅由于我现在有两个快照,我什至无法返回最新的一个?!?!?

1
产品捆绑在一起的产品的数据库设计
我正在为零售业务建立数据库系统。我设置了一些表,它们是: 产品 采购 营业额 平衡 所有这些相互连接,并且能够显示我的库存水平。 我遇到的问题是我还销售捆绑销售的产品-价格与单个产品价格不同。 示例:我以1美元的价格出售一个橙子,以1.2美元的价格出售一个苹果;我以3.8美元的价格出售水果套餐1(2个橙子和2个苹果),以7美元的价格出售水果2包(4个橙子和4个苹果)。 有没有正确的方法来为这些产品捆绑创建关系? PS:我正在使用FileMaker Pro创建它。

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.