gpt4 book ai didi

sql - SELECT * 中有时会缺少计算列

转载 作者:行者123 更新时间:2023-12-04 04:38:40 24 4
gpt4 key购买 nike

在 SQL Azure 中,我有一个或多或少像这样设置的表,其中有两个计算列(IsExpiredIsDeadlineExpired),它们只是比较不可为 null 的日期时间列到当前时间:

CREATE TABLE [dbo].[Stuff]
(
[StuffId] int NOT NULL IDENTITY(1,1),
[Guid] uniqueidentifier NOT NULL,
[ExpirationDate] datetime NOT NULL,
[DeadlineDate] datetime NOT NULL,
[UserId] int NOT NULL,
[IsExpired] AS CAST((CASE WHEN [ExpirationDate] < GETUTCDATE() THEN 1 ELSE 0 END) AS bit),
[IsDeadlineExpired] AS CAST((CASE WHEN [DeadlineDate] < GETUTCDATE() THEN 1 ELSE 0 END) AS bit),
CONSTRAINT [PK_StuffId] PRIMARY KEY ([StuffId]),
CONSTRAINT [UNQ_Guid] UNIQUE([Guid]),
)
GO

我有一个包含多个结果集的存储过程,其中一个结果集:

SELECT * FROM [dbo].[Stuff] WHERE [Guid] = @guid

我最近注意到错误日志表明,有时当使用 SqlDataReader 读取结果集时,SqlDataReader.GetOrdinal("IsExpired") 会失败并出现 IndexOutOfRangeException 。我知道即使在这些情况下,前面的列也能正常工作,因为它们是在前面的代码行中读取的,没有错误。我还相信该过程的结果集顺序正确,因为它们不共享列名称(否则读取前面的列也会同样失败)。

此外:大多数时候一切似乎都运行得很完美。

这是否可以归因于 Azure transient 故障?

最佳答案

请引用这篇文章:SELECT * AND SQL Azure .

其作者强烈建议更换

SELECT *
FROM TableName

SELECT [Column1], [Column2], ... [ColumnN]
FROM TableName

因为使用 SELECT * 可能会导致额外的分页、RFID 查找、不必要的表锁定,并妨碍将来创建覆盖索引的任何尝试。总之,这对性能不利

顺便说一句:这里有一组有趣的文章:

  1. How to get to SQL Azure Query Performance Data
  2. Query Performance
  3. Getting Started with the Windows Azure Tools for Visual Studio
  4. Getting Started with SQL Azure Development
  5. Improving Your I/O Performance
  6. Analyzing Query Performance just got easier with SQL Azure.

我怀疑 GetOrdinary("IsExpired") 导致 System.IndexOutOfRangeException由于 MS SQL Azure 框架的上述行为。

结论?使用带有定义的列列表的 SELECT 语句来提高 SQL Azure 数据库的性能并避免 IndexOutOfRange 异常。

关于sql - SELECT * 中有时会缺少计算列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17998196/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com