sql >> データベース >  >> RDS >> Sqlserver

Select top 1 * from TableName with (nolock) が結果を返すのを妨げているのは何ですか?

    SELECT NOLOCK を使用したクエリ SCH-S が必要です。 (スキーマの安定性) テーブルのロック (ヒープ hobt も必要です ロック )。

    さらに SELECT の前に SQL Server は、ステートメントの計画をコンパイルする必要があります。これには、SCH-S を取ることも必要です。 テーブルにロックアウトしてください。

    長時間実行されるトランザクションが SELECT ... INTO を介してテーブルを作成すると、 互換性のない SCH-M を保持しています ステートメントが完了するまでロックします。

    sys.dm_os_waiting_tasks を調べると、これを確認できます。 その間 その間 ブロッキング期間中。

    1つの接続で次のことを試したとき

    BEGIN TRAN
    
    SELECT *
    INTO NewT
    FROM master..spt_values
    
    /*Remember to rollback/commit this later*/
      

    そして、実行します (または単に推定実行計画を表示しようとします)

    SELECT *
    FROM NewT
    WITH (NOLOCK)
      

    すぐに読み取りクエリがブロックされました。

    SELECT wait_type,
           resource_description
    FROM sys.dm_os_waiting_tasks
    WHERE session_id = <spid_of_waiting_task>
      

    待機タイプが確かに SCH_S であることを示します ブロッキング リソース SCH-M

    wait_type        resource_description
    ---------------- -------------------------------------------------------------------------------------------------------------------------------
    LCK_M_SCH_S      objectlock lockPartition=0 objid=461960722 subresource=FULL dbid=1 id=lock4a8a540 mode=Sch-M associatedObjectId=461960722
      

    1. java.sql.SQLException:jdbc:mysql:// localhost:3306/dbnameに適したドライバーが見つかりません

    2. 単一行のnull以外の値をカウントするMySQLクエリ

    3. SQL Serverインデックスの後方スキャン:理解、調整

    4. データベーステーブルから多次元配列を作成する