16

sys.dm_exec_requestsを試すことができるように、長時間実行されるSQLステートメントを偽造したい

「偽物」はそれを説明するための最良の方法ではありませんが、自動生成されたレコードを選択するための良いヒントを誰かが持っていますか?おそらくCTEを使用していますか?

4

4 に答える 4

30

実行時間の長いSQLステートメントは次のとおりです。

WAITFOR DELAY '0:05';

実行には約5分かかります。

于 2013-01-03T11:44:03.310 に答える
6

1つのクエリウィンドウで、次を実行します。

BEGIN TRANSACTION

SELECT * from TableY with (XLOCK)

次に、別のウィンドウで、にアクセスしようとするany(*)クエリを実行しますTableYROLLBACKそして、最初のウィンドウを閉じるか、その中でまたはを実行するまで、好きなだけ実行されますCOMMIT

NOLOCK(*)への参照にヒントを追加しないと仮定しますTableY

于 2013-01-03T11:55:57.030 に答える
1

「CTE」を書いていたのと同じように…考えさせられました。後で簡単に検索し、 http://smehrozalam.wordpress.com/2009/06/09/t-sql-using-common-table-expressions-cte-to-generate-sequences/のバリエーション

--define start and end limits
Declare @start bigint, @end bigint
Select @start=1, @end=99999

;With NumberSequence( Number ) as
(
    Select @start as Number
        union all
    Select Number + 1
        from NumberSequence
        where Number < @end
)

--select result
Select * From NumberSequence Option (MaxRecursion 0)
于 2013-01-03T11:40:00.240 に答える
0

Alex KeySmithのCTE回答https://stackoverflow.com/a/14138219/318411は、独自のクエリに適用できるため、本当に気に入っています。これは、有効なデータを長期的な形式で返すことができることを意味します。

したがって、たとえば、数行のテストテーブルがあるが、アプリケーションコードが大きな結果セットでどのように実行されるかをすばやく知りたい場合は、次のようにすることができます。

    declare @i int, @c int
    select @i = 1, @c = 10;
    with X as (
        select @i as N union all select N + 1 from x where N < @c
    )
    select 
        T.*
    from
        X,
    (   
        select 
            *
        from
            MySmallTestTable
    ) AS T
    option (MaxRecursion 0)

これにより、テストデータが繰り返されます@c

また、クエリキャンセルコードのテストにも使用しました。

于 2019-04-30T11:47:40.280 に答える