一般来说,我总是使用 Ints。我知道理论上这不是最佳实践,因为您应该使用保证存储数据的最小数据类型。
例如,tinyint当您知道将存储的唯一数据是 1、0 或 null(以后将其扩展为 2 或 3 的可能性很小)时,最好使用。
但是,我知道这样做的唯一原因是出于存储目的——在一行中使用 1 个字节而不是 4 个字节。
除了节省硬盘空间之外,仅使用tinyint(smallint甚至bigint)会产生什么影响int?
我见过很多人使用 COALESCE 函数代替 ISNULL。从 Internet 搜索中,我发现 COALESCE 是 ANSI 标准,因此有一个优势,即我们知道使用它时会发生什么。然而, ISNULL 似乎更容易阅读,因为它似乎更清楚它在做什么。
我也意识到 ISNULL 有点棘手,因为它在不同的数据库服务器和不同的语言中表现不同。
在我看来,所有这些都归结为风格和标准。鉴于风格是主观的,有没有理由在 ISNULL 上使用 COALESCE(反之亦然)?具体来说,一个比另一个有性能优势吗?
我正在使用Dapper对来自 ASP.NET MVC 3 (.NET 4.0) 应用程序的 SQL Server 2008 R2 Express 实例执行以下查询。
INSERT INTO Customers (
Type, Name, Address, ContactName,
ContactNumber, ContactEmail, Supplier)
VALUES (
@Type, @Name, @Address, @ContactName,
@ContactNumber, @ContactEmail, @Supplier)
SELECT @@IDENTITY
Run Code Online (Sandbox Code Playgroud)
对 的调用connection.Query<int>(sql, ...)正在引发无效的强制转换异常。我已经调试了它,它是在 Dapper 调用GetValue返回的SqlDataReader.
的返回类型GetValue是Object,在调试器中检查它显示它是一个装箱十进制。
如果我将选择更改为SELECT CAST(@@IDENTITY as int),则 GetValue 的返回是一个装箱的 int 并且不会引发异常。
Id 列绝对是 int 类型;为什么会SELECT @@IDENTITY返回一个小数?
一些附加信息:
http://en.wikipedia.org/wiki/CAP_theorem
http://www.cs.berkeley.edu/~brewer/cs262b-2004/PODC-keynote.pdf
我想是不是非常简单,为什么只有两个的
可以适用于任何给定的分布式数据库系统。这个猜想被证实,但有没有看出为什么一个简单的方法可能是,这可能持有?
我不是在寻找证明,只是一种理解为什么这个定理可能有意义的好方法。理由是什么?
为什么当我们在列中有一个 NULL 值并且我们按值升序排序时,首先对 NULL 进行排序?
select 1 as test
union all
select 2
union all
select NULL
union all
select 3
union all
select 4
order by test
Run Code Online (Sandbox Code Playgroud)
结果是
NULL
1
2
3
4
Run Code Online (Sandbox Code Playgroud)
我一直认为 NULL 意味着“不确定”或可能的“未知”。如果这是真的,它们会不会排在最后,因为该值可能大于所有其他值?(或者这是某个地方的排序选项?)
我使用的是 SQL Server 2008R2,但我怀疑这适用于所有 SQL Server,并且可能适用于所有 RDBMS。
我认为这将是一个相当简单的问题,但实际上我很难找到答案。
问题:您能否通过简单地更新分区列使其跨越分区边界将分区表中的数据行从一个分区移动到另一个分区?
例如,如果我有一个包含分区键的表:
CREATE TABLE SampleTable
(
SampleID INT PRIMARY KEY,
SampleResults VARCHAR(100) NOT NULL,
)
Run Code Online (Sandbox Code Playgroud)
使用映射到主键的分区函数:
CREATE PARTITION FUNCTION MyPartitionFunc (INT) AS
RANGE LEFT FOR VALUES (10000, 20000);
Run Code Online (Sandbox Code Playgroud)
我可以通过将 SampleID 从 1 更改为(例如)500,000 将一行从第一个分区移动到第三个分区吗?
注意:我将其标记为 sql server 2005 和 2008,因为它们都支持分区。他们的处理方式不同吗?
从我的另一个问题中可以看出,生成测试数据是我现在的主题。
在这一点上,我仍在手动生成我的测试数据。但是,此过程始终会生成少量数据(通常为 5-10 行),因为它是一个手动过程。
是否有任何工具可以自动执行此过程?特别是,我希望能够生成 100 万行以上。
最近,我试图创建一个包含通用测试数据对于一些大型的串这里的一个问题。似乎我曾经知道一种乘法字符串的方法。但是,我已经记不起语法了。
我正在寻找类似的东西:
SELECT 'A' + ('a' * 1000) + 'ha!'
Run Code Online (Sandbox Code Playgroud)
想出“Aaaaaaaaaaaaaaha!” (嗯,当然要长得多。)
这在 T-SQL 中可能吗?(或者我在想其他语言吗?)另外,还有其他技术可以生成大字符串吗?
DBA.StackExchange 上的一篇文章(保持记录修订号的触发器的最佳实践是什么?)引发了一个关于 MySQL 性能的有趣问题(至少对我来说很有趣)。
上下文是我们要为更新的每一行在表中插入一条记录。在更新行之前,我们希望存储先前的值,然后增加其中一列(“版本”列)。
如果我们在触发器中执行此操作,效果会很好。对于 MySQL,触发器是逐行的,因此这将是一个简单的解决方案。选择表中当前的数据,将其插入到日志表中,并在新数据中更新“版本”列。
但是,可以将此逻辑移至存储过程。如果你这样做,你正在执行插入,然后增加表中的“版本”列。整个事情将基于设置。
那么,在执行此插入时,使用基于集合的存储过程方法或基于触发器的方法会更高效吗?
这个问题是针对 MySQL 的(因为它有逐行触发器),尽管它可以应用于其他逐行触发器 DBMS。
sql-server ×7
performance ×2
t-sql ×2
ado.net ×1
mysql ×1
partitioning ×1
sorting ×1
syntax ×1
testing ×1
trigger ×1