2

我有一张有 350 000 行的表。当我搜索前 50 个时,我得到了 50 个最旧的行。有没有办法让 SQL 服务器从底部开始,所以我得到了 bin 插入的最后 50 行?

我们有一些性能问题,所以我不能使用任何循环遍历所有记录的语法。

如果我按 ID 添加订单,则需要 14 秒而不是 1 秒。我使用动态 SQL 来解决动态表结构的搜索功能。

ALTER Procedure [CS.Core].[spDynamicSearchInsuranceDemoCar]

@ChassisNumber AS NVARCHAR(50) = NULL,@FirstOwner AS BIT = NULL,@GroupId AS INT = NULL,@InsuranceNumber AS INT = NULL,@InsuredId AS INT = NULL,@Model AS NVARCHAR(50) = NULL,@OwnerYearOfBirth AS INT = NULL,@RegistrationNumber AS NVARCHAR(12) = NULL,@StakeholderId AS INT = NULL,@StatusId AS INT = NULL,@UserId 作为 int,@LanguageId 作为 int AS SET NOCOUNT ON;开始声明 @sql nvarchar(MAX),@paramlist nvarchar(4000) 选择 @sql ='SELECT TOP 50 Insurance.InsuranceId, ISNULL(ProductCaption.CaptionText, [CS.Core].Entity.Name) AS Product_462, Stakeholder.RefStakeholderName AS Stakeholder_1093,Insurance.ValidFrom 作为 ValidFrom_925,Insurance.InsuranceNumber,Insurance.GroupId,Insurance.StatusId,Insurance.ValidFrom,DemoCar.RegistrationNumber,DemoCar.Year,DemoCar.ChassisNumber,DemoCar.FirstOwner,DemoCar。

0 SELECT @sql = @sql + ' AND ([CS.Entity].[DemoCar].[RegistrationNumber] Like @RegistrationNumber)' ELSE SELECT @sql = @sql + ' AND ([CS.Entity].[DemoCar]. [RegistrationNumber] = @RegistrationNumber)' IF @StakeholderId 不为 NULL SELECT @sql = @sql + ' AND ([CS.Entity].[Insurance].[StakeholderId] = @StakeholderId)' IF @StatusId 不为 NULL SELECT @ sql = @sql + ' AND ([CS.Entity].[Insurance].[StatusId] = @StatusId)' SELECT @sql = @sql + ''

SELECT @paramlist = '@ChassisNumber AS NVARCHAR(50) = NULL,@FirstOwner AS BIT = NULL,@GroupId AS INT = NULL,@InsuranceNumber AS INT = NULL,@InsuredId AS INT = NULL,@Model AS NVARCHAR(50) = NULL,@OwnerYearOfBirth AS INT = NULL,@RegistrationNumber AS NVARCHAR(12) = NULL,@StakeholderId AS INT = NULL,@StatusId AS INT = NULL,@UserId 作为 int,@LanguageId 作为 int' EXEC sp_executesql @sql,@参数列表,@ChassisNumber,@FirstOwner,@GroupId,@InsuranceNumber,@InsuredId,@Model,@OwnerYearOfBirth,@RegistrationNumber,@StakeholderId,@StatusId,@UserId,@LanguageId END

4

4 回答 4

5

“当我搜索前 50 个时,我会得到 50 个最旧的行。”

不,你得到 50 行。时期。DBMS 选择返回的 50 行。50 个或多或少的随机行。

如果您想要最后插入的 50 行,则必须有一列存储此类信息 (InsertionDateTime)。然后索引它。然后你可以运行:

SELECT TOP (50)
    * 
FROM 
    mytable 
ORDER BY
    InsertionDateTime DESC ; 
于 2012-06-08T09:38:51.527 回答
1

考虑到您有一个 IDENTITY ID 列

select * 
from YOUR_TABLE
where id > (select max(id) from YOUR_TABLE) - 50

编辑:

如果您没有 ID,则需要使用 row_number 做一些事情,但您需要订单

于 2012-06-08T09:38:53.010 回答
1

如果您有一个 IDENTITY 主键列,那么您可以按该列降序排序(因为这是插入的顺序行,并且 id 单调递增)

SELECT TOP 50 *  
FROM MyTable
ORDER BY IdentityColId DESC

注意:默认情况下,SQL Server 在表的 Identity 主键列上创建聚集索引这一事实不足以保证排序。

于 2012-06-08T09:35:49.763 回答
0

在您选择的末尾添加一个“ORDER BY inserttime DESC”(或任何您的“旧”标准,顺序 ID 等)。但是,是的,还要检查您是否设置了合适的索引。如果您不确定,请使用解释计划。

于 2012-06-08T09:36:08.993 回答