2

350 000 行のテーブルがあります。トップ 50 を検索すると、最も古い 50 行が取得されます。ビンが挿入された最後の50行を取得するために、SQLサーバーを下から開始する方法はありますか?

パフォーマンスの問題があるため、すべてのレコードをループする構文は使用できません。

Id で注文を追加すると、1 秒ではなく 14 秒かかります。動的 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 as int、@LanguageId as int AS SET NOCOUNT ON; BEGIN DECLARE @sql nvarchar(MAX),@paramlist nvarchar(4000) Select @sql ='SELECT TOP 50 Insurance.InsuranceId, ISNULL(ProductCaption.CaptionText, [CS.Core].Entity.Name) AS Product_462, Stakeholder.RefStakeholderName AS Stakeholder_1093、ValidFrom_925 としての Insurance.ValidFrom、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 IS NOT NULL SELECT @sql = @sql + ' AND ([CS.Entity].[Insurance].[StakeholderId] = @StakeholderId)' IF @StatusId IS NOT 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 as int, @LanguageId as int' EXEC sp_executesql @sql, @ paramlist,@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など)を追加します。ただし、適切なインデックスが設定されていることも確認してください。よくわからない場合は、Explain Plan を使用してください。

于 2012-06-08T09:36:08.993 に答える