数据库管理员

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



5
SQL Server CASE语句是否评估所有条件或在第一个TRUE条件下退出?
SQL Server(特别是2008或2012)CASE语句会评估所有WHEN条件,还是在找到WHEN评估结果为true 的子句后退出?如果确实要经历整个条件集,这是否意味着最后一个评估为true的条件会覆盖第一个评估为true的条件?例如: SELECT CASE WHEN 1+1 = 2 THEN'YES' WHEN 1+1 = 3 THEN 'NO' WHEN 1+1 = 2 THEN 'NO' END 即使最后一个条件将其评估为“否”,结果仍为“是”。似乎一旦找到第一个TRUE条件就退出。有人可以确认是否是这种情况。
44 sql-server  t-sql  case 

4
存储过程的单元测试
我已经考虑了很长时间了。 基本问题是:如何对存储过程进行单元测试? 我看到我可以相对简单地为经典意义上的函数设置单元测试(我的意思是它们得到零个或多个参数并返回一个值)。但是,如果我考虑一个看似简单的过程的真实示例,该过程似乎在某个位置插入行,并在插入之前或之后执行一些触发器,甚至在定义“单元”的边界时也很难做到。我应该只测试INSERT自身吗?我认为这很简单-价值相对较低。我应该测试整个事件链的结果吗?除了是否要进行单元测试的问题外,设计合适的测试可能是一项艰巨的工作,并且还会增加许多其他问号。 然后是不断更改数据的问题。如果UPDATE影响不只是几行,那么在测试用例中必须以某种方式包括每个可能受影响的行。DELETEs等的进一步困难。 那么如何对存储过程进行单元测试?在复杂性上是否有完全无法实现的极限?维护需要哪些资源? 编辑基于AlexKuznetsov的回答,还有一个小问题:还是有一个完全没有用的阈值?

7
我应以哪种数据类型在数据库中存储电子邮件地址?
我知道254个字符的电子邮件地址是有效的,但是我研究过的实现倾向于使用varchar(60)到varchar(80)或等效的电子邮件。例如:此SQL Server建议使用varchar(80)或此Oracle示例 是否有理由不使用完整的254个字符的最大值?按照定义,varchar不会仅使用所需的存储量来保存数据吗? 是否存在重大的性能隐含/折衷,导致如此多的实现使用少于254个可能的字符?

4
单个查询的速度快于联接的速度吗?
概念性问题:单个查询的速度是否比联接更快?或者:我是否应该尝试将客户端上想要的每个信息都压缩到一个 SELECT语句中,或者仅使用看起来方便的数量? TL; DR:如果我加入的查询花费的时间比运行单个查询所花费的时间更长,这是我的错还是应该这样? 首先,我不是非常了解数据库,所以可能只是我一个人,但是我注意到当我必须从多个表中获取信息时,通过对单个表进行多次查询来获取此信息“通常”更快(也许包含一个简单的内部联接)并在客户端将数据修补在一起,以尝试编写一个(复杂的)联接查询,在此我可以在一个查询中获得所有数据。 我试图将一个非常简单的示例放在一起: SQL小提琴 模式设置: CREATE TABLE MASTER ( ID INT NOT NULL , NAME VARCHAR2(42 CHAR) NOT NULL , CONSTRAINT PK_MASTER PRIMARY KEY (ID) ); CREATE TABLE DATA ( ID INT NOT NULL , MASTER_ID INT NOT NULL , VALUE NUMBER , CONSTRAINT PK_DATA PRIMARY KEY …

4
创建的用户无需任何授权即可访问PostgreSQL中的所有数据库
关于设置PostgreSQL,我一定会有所遗漏。我想做的是创建多个彼此隔离的数据库和用户,以便特定用户只能访问我指定的数据库。但是,根据我的判断,任何创建的用户都可以访问所有数据库,而无需给予任何特定的授权。 这是我在Ubuntu Server 12.04上执行的操作: apt-get安装postgresql sudo -u postgres createuser -DRSP mike1(指定新用户的密码) 须藤-u postgres createdb data1 psql -h localhost -U mike1 data1(指定用户mike1登录的密码) 似乎新用户“ mike1”可以毫无问题地连接到数据库“ data1”并创建表等。而且这根本不需要运行任何GRANT命令(而“ data1”的所有者是“ postgres”,因为我没有指定步骤3中的所有者)。这真的应该是这样吗? 我想做的就是授予mike1对data1的完全访问权限,然后对更多的用户和数据库重复此操作,以确保用户只能访问我选择的一个(或可能多个)数据库。

3
使用SSD时,数据库设计中的聚集索引概念是否明智?
在设计SQL Server数据架构和后续查询,存储过程,视图等时,对于明确要部署在SSD平台上的数据库设计,聚集索引的概念和磁盘上数据的顺序是否有意义? “ http://msdn.microsoft.com/zh-cn/library/aa933131(v=sql.80).aspx “聚集索引确定表中数据的物理顺序。” 在物理磁盘平台上,考虑到它们的设计对我来说很有意义,因为对数据进行物理扫描以检索“顺序”行比在表中查找更有效。 在SSD平台上,所有数据读取访问都使用相同的查找。就位存储在同一块硅片而言,没有“物理顺序”的概念,并且数据读取不是“顺序的”。 那么,在设计应用程序数据库的过程中,聚集索引的考虑是否与此平台相关? 我最初的想法不是因为“有序数据”的概念不适用于SSD的存储和查找/恢复优化。 编辑:我知道SQL Server 将创建一个,我只是在思考在设计/优化过程中考虑它是否有意义。


9
如何在数据库中处理删除?
我想在Web应用程序中实现“取消删除”功能,以便用户可以改变主意并恢复已删除的记录。关于如何实施的想法?我考虑过的一些选项实际上是删除有问题的记录,并将更改存储在单独的审核表中,或者不删除记录,而是使用布尔“已删除”列将其标记为已删除。后一种解决方案在正常情况下将需要附加的应用程序逻辑来忽略“已删除”的记录,但将使在应用程序端恢复记录变得容易得多。

14
消除ListAgg(Oracle)中的重复项
在Oracle 11.2之前,我使用自定义聚合函数将一列连接成一行。11.2添加了该LISTAGG功能,因此我尝试使用该功能。我的问题是我需要消除结果中的重复项,而且似乎无法做到这一点。 这是一个例子。 CREATE TABLE ListAggTest AS ( SELECT rownum Num1, DECODE(rownum,1,'2',to_char(rownum)) Num2 FROM dual CONNECT BY rownum<=6 ); SELECT * FROM ListAggTest; NUM1 NUM2 ---------- --------------------- 1 2 2 2 << Duplicate 2 3 3 4 4 5 5 6 6 我想看的是: NUM1 NUM2S ---------- -------------------- 1 2-3-4-5-6 2 …


3
如何授予用户超级权限?
我已经创建了一个用户,并赋予了user1特权。 `grant all privileges on db1.* to user1@'%' with grant option; 我正在使用mysql工作台将转储导入到我的数据库中。将转储导入数据库db1时,发生错误,指出 ERROR 1227 (42000) at line 49: Access denied; you need (at least one of) the SUPER privilege(s) for this operation 在该转储中,所有表均已成功导入,但是在将例程导入数据库时​​发生错误。我赋予用户1的特权有什么问题。请指教。

9
要求不要使用事务并使用替代方法来模拟事务
我从事T-SQL的开发已经有好几年了,并且一直在不断深入研究,继续学习有关该语言各个方面的所有知识。我最近开始在一家新公司工作,收到了我认为关于交易的奇怪建议。永远不要使用它们。而是,使用一种模拟交易的解决方法。这来自于我们的DBA,该DBA在一个数据库中处理大量事务,并随后进行大量阻塞。我主要工作的数据库没有出现此问题,并且我看到过去使用过事务。 我了解交易会受到阻碍,因为这样做本质上就是这样做的,如果您不使用任何交易就可以逃脱,那就一定要这样做。但是在很多情况下,每个语句必须成功执行。如果失败了,那么所有人都必须提交。 我一直将交易范围保持在尽可能狭窄的位置,始终与SET XACT_ABORT ON结合使用,并且始终在TRY / CATCH中使用。 例: CREATE SCHEMA someschema; GO CREATE TABLE someschema.tableA (id INT NOT NULL IDENTITY(1, 1) PRIMARY KEY, ColA VARCHAR(10) NOT NULL ); GO CREATE TABLE someschema.tableB (id INT NOT NULL IDENTITY(1, 1) PRIMARY KEY, ColB VARCHAR(10) NOT NULL ); GO CREATE PROCEDURE someschema.ProcedureName @ColA …

6
可以在一台SQL服务器上放置的数据库数量有限制吗?
我正在建立一个SaaS系统,我们打算在该系统中为每个客户提供他们自己的数据库。该系统已经设置好,因此如果负载太大,我们可以轻松地扩展到其他服务器。我们希望拥有成千上万的客户。 问题 在一个SQL Server上可以/应该具有的微数据库数量是否有实际限制? 它会影响服务器的性能吗? 拥有10,000个每个100 MB的数据库或一个1 TB的数据库是否更好? 附加信息 当我说“微数据库”时,我并不是真的意思是“微”。我只是说我们的目标是成千上万的客户,因此每个单独的数据库仅占总数据存储量的千分之一或更少。实际上,每个数据库的容量大约为100MB,这取决于它获得的使用量。 使用10,000个数据库的主要原因是可伸缩性。事实是,系统的V1有一个数据库,当数据库承受负载时,我们经历了一些不舒服的时刻。 所有这些都使CPU,内存,I / O紧张。即使我们解决了这些问题,他们也使我们意识到,即使在世界上索引最佳的情况下,如果我们如希望的那样成功,我们也无法将所有数据都放在一个巨大的鸿沟中的数据库。因此,对于V2,我们正在分片,以便可以在多个数据库服务器之间分配负载。 去年,我花了很多时间来开发这种分片解决方案。每个服务器一个许可证,但是由于我们在Azure上使用VM,因此无论如何都要照顾好它。之所以出现这个问题,是因为以前我们只向大型机构提供服务,并且自己建立每个机构。我们的下一个业务是自助服务模型,任何使用浏览器的人都可以注册并创建自己的数据库。与大型机构相比,他们的数据库将更小,数量更多。 我们尝试了Azure SQL数据库弹性池。性能非常令人失望,因此我们切换回常规VM。

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.