数据库管理员

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

2
即使在创建存储过程时表存在,是否有办法强制延迟名称解析?
在SQL Server中创建存储过程时,可以引用不存在的表。但是,如果该表确实存在,则该过程中引用的任何列都必须存在于该表中(“ 延迟名称解析”)。 是否可以指示SQL Server推迟过程中引用的所有表的名称解析,而不管它们是否存在?我确实希望保留常规语法检查,因此即使有可能,也无法将存储过程定义修改到系统表中。 我希望我的要求看起来有些怪异,所以这里有一些背景知识:我会从用C#编写的应用程序中自动生成表定义和存储过程,并且我很难更改代码以根据SQL的需要对更改进行排序他们。我的代码“保证”架构在事务中是一致的,但是目前,我无法保证在定义引用它们的存储过程之前已定义表列。 下面是C#创建的SQL的规范示例,“说明”了我要解决的问题。 --Say this table already exists. CREATE TABLE myTable ( a NVARCHAR(MAX) ) GO --My C# code creates something like this BEGIN TRAN GO --the stored procedure gets generated first. CREATE PROCEDURE mySproc AS BEGIN SELECT a,b FROM myTable END --then the table update …

3
将某些阿拉伯字符视为相同
在阿拉伯语中,我们有ا(alef)和أ(带有hamza的alef)之类的字符。 用户可以互换地编写它们,而我们想互换地进行搜索。SQL Server将它们视为单独的字符。如何使SQL将它们视为相同字符? 我曾想在插入时用ا(alef)替换所有أ(alef用hamza),但是我们有很多阿拉伯语的替代品,而不仅仅是ا(alef)和أ(带有hamza的alef)。 我尝试过Arabic_CI_AS,Arabic_CI_AI但这不能解决问题。 这是重新生成问题的脚本: CREATE TABLE [dbo].[TestTable] ( [ArabicChars] [nvarchar](50) NOT NULL, CONSTRAINT [PK_TestTable] PRIMARY KEY CLUSTERED ( [ArabicChars] ASC ) ) ON [PRIMARY]; INSERT INTO TestTable values (N'احمد'); INSERT INTO TestTable values (N'أحمد'); SELECT * FROM TestTable WHERE ArabicChars like N'ا%'; 结果是: ArabicChars احمد (1 row(s) affected) …

2
当从带有外部参数化“ where”子句的视图中调用时,窗口函数会导致糟糕的执行计划
很久以前,我遇到了这个问题,我找到了适合自己的解决方法,却忘了它。 但是现在在SO上存在这个问题,所以我愿意提出这个问题。 有一个视图以非常简单的方式(订单+订单行)连接了几个表。 当查询不带where子句的视图时,该视图将返回几百万行。 但是,没有人会这样称呼它。通常的查询是 select * from that_nasty_view where order_number = 123456; 这将返回5m中的10条记录。 重要的是:该视图包含一个窗口函数,该窗口函数rank()完全由始终查询该视图的字段划分: rank() over (partition by order_number order by detail_line_number) 现在,如果使用查询字符串中的文字参数查询此视图(完全如上所示),它将立即返回行。执行计划很好: 使用on的索引在两个表上进行索引查找order_number(返回10行)。 在返回的微小结果上计算窗口。 选择。 但是,当以参数化方式调用视图时,情况会变得很糟: Index scan在所有表上忽略索引。返回5m行。 巨大的加入。 计算所有partitions上的窗口(约50万个窗口)。 Filter 从5m中取出10行。 选择 在涉及参数的所有情况下都会发生这种情况。可以是SSMS: declare @order_number int = 123456; select * from that_nasty_view where order_number = @order_number; 它可以是ODBC客户端,例如Excel: …

2
PostgreSQL可以创建区分大小写的数据库吗?
我正在将一些代码从某些版本的Sybase移植到PostgreSQL。这是一个使用Sybase客户端库的C应用程序。我的方法是编写一个转换层,以将调用转换dbsqlexec()为PQexec()(例如)。该部分大部分正常工作。 看来Sybase数据库是以区分大小写的方式(相对于数据库对象名称)设置的。例如,同时有一个WIDGET表和一个widget表。看起来此应用程序中的约定是:全大写名称表示实际数据表,而小写名称在运行某些处理时用作临时表。 根据4.1词法结构,“ 关键字和未加引号的标识符不区分大小写。 ”我知道我可以对标识符加双引号以禁用自动折叠为小写字母,但是我不想通过成千上万的行手动进行操作使用此数据库的代码。 有没有一种方法可以设置PostgreSQL以禁用数据库对象标识符的这种自动大小写折叠? 我的替代方法是编写一些代码,检查每个SQL语句,并在每个标识符(不是关键字)周围加上双引号。

3
在数据库中存储时间(以毫秒为单位)
关于在数据库中存储“时间”的一个简单问题。我正在记录用户运行时间,其格式为00:00:00:00(小时,分钟,秒,毫秒)。 我本来打算将其存储为,TIME但是后来我意识到MySQL不支持这种类型的毫秒。 我将存储从用户秒表获取的实际时间,而不是他们运行并完成的时间(这将在插入之前进行计算)。 最好使用哪种字段类型?我在想double或者float,但是我不确定是否行得通?

4
SQL Server 2008 R2:计算机名称更改后出现问题
更改托管本地SQL Server实例的远程服务器的计算机名称后,我遇到一个令人困惑的问题。 基本上,远程服务器是从一个站点移动到另一个站点的。为了简化此操作,我备份了旧数据库并将其还原为新的数据库名称,清除了数据,以便可以将其用作客户端软件的新数据库。我还更改了计算机名称,因为我们总是这样做,以便通过服务器的站点号来标识每个服务器。 可以通过客户端软件很好地连接数据库,并且我可以直接登录到SQL Server。但是,我的一个SQL Server代理作业失败,事件日志中出现错误: SQL Server计划的作业“立即重置”(0x4F76FDFFF6DFFE4EA0DE4A70252AD3BD)-状态:失败-调用日期:2012-02-07 08:10:05-消息:作业失败。无法确定作业Nightly Reset的所有者(Site-19 \ Admin)的所有者(Site-19 \ Admin)是否具有服务器访问权限(原因:无法获取有关Windows NT组/用户'Site-19 \ Admin'的信息,错误代码0x534。[SQLSTATE 42000](错误15404))。 现在,“ Site-19”是旧计算机名称,该名称已更改,并且服务器已重置。我使用新站点号'Site-28'手动连接,它显示我已通过Site-28 \ Admin连接到SQL Server。但是,当我查看代理作业的属性时,它显示所有者为Site-19 \ Admin,并且当我尝试浏览用户以对其进行更改时,Site-28 \ Admin不会显示为选项,只有Site-19 \ Admin。如果我从该脚本中编写了一个新作业,然后将所有者手动更改为“ Site-28 \ Admin”,则会使用所有者“ Site-19 \ Admin”创建新作业。 在sys.servers(或通过sp_helpserver)中查找,我只有一个条目:当前计算机名称。但是,SELECT @@ SERVERNAME返回原始的开发计算机名称(两个名称之前更改)。 简而言之,我无法运行此重要的SQL Server代理作业,因为该作业属于不再存在的用户,并且我不知道如何更改它或将其创建为正确的用户。

3
Oracle的左连接和where子句错误
CREATE TABLE "ATABLE1" ( "COLUMN1" VARCHAR2(20 BYTE), "COLUMN2" VARCHAR2(20 BYTE) ); CREATE TABLE "ATABLE2" ( "COLUMN1" VARCHAR2(20 BYTE), "COLUMN2" VARCHAR2(20 BYTE) ); Insert into ATABLE1 (COLUMN1,COLUMN2) values ('A','1'); Insert into ATABLE1 (COLUMN1,COLUMN2) values ('B','2'); Insert into ATABLE2 (COLUMN1,COLUMN2) values ('A',null); Insert into ATABLE2 (COLUMN1,COLUMN2) values ('A','1'); Insert into ATABLE2 (COLUMN1,COLUMN2) …
10 oracle  join 

1
在繁忙的主从复制系统上恢复单个mysql数据库
在繁忙的复制系统中寻找一种策略或工具来将单个数据库恢复到某个时间点。 我有12个数据库以主从复制配置在2个MySQL 5.0.77服务器上运行。每天对只读从属服务器进行一次完全转储,并且有可用的增量SQL转储,这些备份不在现场并监视复制状态。 编辑:表是InnoDB和myISAM的混合,因此引擎特定的解决方案不可用。 因此,考虑到主服务器完全故障,我可以中断复制并升级从服务器,也可以选择重建新服务器并从越过FULL备份进行配置,然后应用每小时从从服务器获取的差异。 但是,我担心如何处理部分故障或单个数据库的故障。我可以想到两种可能的情况; 例如,数据库7损坏,继续处理一些请求,直到有人注意到它已损坏,或者来自日志文件的警报... 某些查询,例如放置数据库,放置表,“更新位置...”类型的查询,将使单个数据库或其中的某些子集失效。 目前,我有一堆完整的转储文件,例如FULL- $ DATE-all-databases.sql.gz文件,以及可以应用于DIFF- $ DATE-all-databases.sql.gz的差异文件 要将数据库7恢复到某个时间点,将需要通过FULL和DIFF文件进行grep,并手动应用该sql。 为了使能够恢复到以前的DIFF转储到master数据库之一的状态,我应该如何进行? 我是否需要备份到单个数据库文件,即 mysqldump --databases "database1" | gzip > database1.sql.gz mysqldump --databases "database2" | gzip > database2.sql.gz mysqldump --databases "database3" | gzip > database3.sql.gz 而不是.. mysqldump --master-data --lock--all-databases --all-databases | gzip > all-databases.sql.gz 如果我要查找单独的mysqldump文件,那么主数据二进制日志会如何处理,我甚至应该为主服务器恢复转储设置--master-data吗?

5
ER图的重要性
我是一名学生,并且正在作为学术界的一部分开发多个项目。 在为其中一个项目开发数据库时,我们遇到了一种情况,即我们在考虑是否需要ERD。目前,并不是我们每个人都同意先开发ERD,然后再从中开发数据库。 大多数人都喜欢直接根据书面要求在系统上实时地开发数据库。 现在,我是数据库原则的严格追随者。我认为该数据库应仅从ERD开发。因此,我只想了解以下内容: 业界是否遵循这些原则? 我只是在浪费时间开发ERD吗? 开发ERD有什么好处?


2
SQL Server如何确定选择表时锁定的顺序?
当系统处于负载状态时,我有两个存储过程处于死锁状态。当Proc B插入同一张表时,Proc A从表中选择。锁定图显示Proc A具有Proc B希望为其IX模式锁定的S模式页面锁定,但是Proc A正在等待针对Proc B已经具有IX模式页面锁定的另一页面的S模式页面锁定。 。 显然,可以通过确保两个查询以相同的顺序锁定表中的页面来解决此问题,但是我不知道该怎么做。 我的问题是:SQL Server如何确定在执行INSERT和SELECT时锁定页面的顺序,以及如何修改此行为?

1
由于数据移动,无法继续使用NOLOCK进行扫描
我们运行SQL Server 2000,并且每晚都有一些此类错误。 Could not continue scan with NOLOCK due to data movement 引发此错误的查询是一个大型的复杂查询,连接了十几个表。我们的基础数据可以经常更新。 文化上的“最佳实践”是,过去,引入NOLOCK提示可以提高性能并提高并发性。该查询不必是100%准确的,即我们可以忍受脏读等。但是,尽管我们拥有所有这些锁定提示,但我们仍在努力理解为什么数据库抛出此错误。 任何人都可以对此有所了解-彬彬有礼,我实际上是程序员,而不是DBA :) PS:我们已经应用了下面提到的修复程序:http : //support.microsoft.com/kb/815008

2
在IsolationLevel.ReadUncommitted上发布的共享锁
我读到,如果我使用IsolationLevel.ReadUncommitted,则查询不应发出任何锁。但是,当我对此进行测试时,看到了以下锁: 资源类型:HOBT 请求模式:S(共享) 什么是HOBT锁?与HBT(堆或二叉树锁)有关的东西吗? 为什么我还会得到S锁? 如何在不打开隔离级别快照选项的情况下进行查询时避免共享锁定? 我正在SQLServer 2008上对此进行测试,并且快照选项已设置为off。该查询仅执行选择。 我可以看到Sch-S是必需的,尽管SQL Server似乎没有在锁查询中显示它。它怎么仍然发出共享锁?根据: 设置事务隔离级别(Transact-SQL) 在该READ UNCOMMITTED级别运行的事务不会发出共享锁,以防止其他事务修改当前事务读取的数据。 所以我有点困惑。

1
为什么mysql 5.5慢于5.1(linux,使用mysqlslap)
my.cnf(5.5和5.1相同): back_log=200 max_connections=512 max_connect_errors=999999 key_buffer=512M max_allowed_packet=8M table_cache=512 sort_buffer=8M read_buffer_size=8M thread_cache=8 thread_concurrency=4 myisam_sort_buffer_size=128M interactive_timeout=28800 wait_timeout=7200 MySQL 5.5: ..mysql5.5/bin/mysqlslap -a --concurrency=10 --number-of-queries 5000 --iterations=5 -S /tmp/mysql_5.5.sock --engine=innodb Benchmark Running for engine innodb Average number of seconds to run all queries: 15.156 seconds Minimum number of seconds to run all queries: 15.031 seconds …

4
SQL Server分区-分区密钥使用什么?
我从来没有使用过SQL Server分区,但是目前我面临着设计数据库的问题,而这些数据库可能需要它的支持。该系统用于优惠券。优惠券应定期发行,通常每六周发行一次,尽管也会临时发行(例如特殊活动)。有1500万客户,每次发行活动,每个客户将获得6种不同的优惠券类型,总共提供9000万个优惠券实例。我们需要跟踪优惠券实例的兑换数据并保持6个月,尽管通常优惠券仅有效6周。任何兑换无效优惠券的请求都不会到达数据库,因为直到POS都将对其进行验证。 在六个月的时间内,我们需要在Coupon Instance表中存储3.6亿行,在Redemption表中存储多达7200万行(假设最大20%的赎回率)。我感觉这些数字对于单个分区来说太大了吗? 我的问题是-用作分区键是什么?一个明显的候选者将是通过发行事件,给出大约6个分区。但是然后我认为,即使那样也会使分区大小太大而无法实现最佳性能?是否可以通过两个密钥进行划分,例如按发布事件+客户ID的最后一位数字?因此逻辑将是: If issuance event = 1 and last digit of customer id < 5 then Store in partition 1 Else if issuance event = 1 and last digit of customer id >4 then Store in partition 2 Else if issuance event =2 and last digit of …

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.