<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>調べた事</title><link>http://blogs.wankuma.com/esten/category/1227.aspx</link><description>.NETとCLRとVisualStadio2005の関連で自分で調べた事</description><managingEditor>片桐　継（Tugu Katagiri）</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>片桐　継（Tugu Katagiri）</dc:creator><title>やまたのおろちが酒を飲む～片桐的VB.NETスレッドプログラミング～その３</title><link>http://blogs.wankuma.com/esten/archive/2008/12/27/165136.aspx</link><pubDate>Sat, 27 Dec 2008 21:27:00 GMT</pubDate><guid>http://blogs.wankuma.com/esten/archive/2008/12/27/165136.aspx</guid><wfw:comment>http://blogs.wankuma.com/esten/comments/165136.aspx</wfw:comment><comments>http://blogs.wankuma.com/esten/archive/2008/12/27/165136.aspx#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://blogs.wankuma.com/esten/comments/commentRss/165136.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/esten/services/trackbacks/165136.aspx</trackback:ping><description>&lt;p&gt;やまたのおろちが酒飲んでます。あいかわらずの飲兵衛です。&lt;/p&gt; &lt;p&gt;その１&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.wankuma.com/esten/archive/2008/12/03/162607.aspx"&gt;http://blogs.wankuma.com/esten/archive/2008/12/03/162607.aspx&lt;/a&gt;&lt;/p&gt; &lt;p&gt;ここでは、ただ首一本がガブガブ飲むだけだったんだけど、それじゃ他の首が飲ませろとうるさいので、全部の首がせーのっ！で飲めるようにして&lt;/p&gt; &lt;p&gt;その２&lt;/p&gt; &lt;p&gt;&lt;a title="http://blogs.wankuma.com/esten/archive/2008/12/09/163043.aspx" href="http://blogs.wankuma.com/esten/archive/2008/12/09/163043.aspx"&gt;http://blogs.wankuma.com/esten/archive/2008/12/09/163043.aspx&lt;/a&gt;&lt;/p&gt; &lt;p&gt;となったわけだけれども、コメントでツッコミがあったように、これだけでは全く持って、ダメダメプログラミングなわけですｗ。&lt;font color="#ff0000"&gt;はい、わざとです。&lt;/font&gt;&lt;/p&gt; &lt;p&gt;では、どうしようか？　リファクタする？&lt;/p&gt; &lt;p&gt;&lt;font color="#000080"&gt;でもその前に、まだやっておかなくちゃいけないことがあるんだわ。&lt;/font&gt;&lt;/p&gt; &lt;p&gt;やまたのおろちが飲みたい酒ツボが１つだったときにどうなるかって話。&lt;/p&gt; &lt;p&gt; &lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:bc38ab75-1fcc-40d6-9c5d-ca141bc3d4ac" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="vb:nocontrols"&gt;Imports System
Imports System.Threading

Module OrochMTA

    Delegate Sub DrinkingSAKE()

    '酒ツボは一つ
    Private sakeTubo As Integer

    '酒ツボの残り
    Private sakeNokori As Integer

    &amp;lt;MTAThread()&amp;gt; _
  Public Sub Main()

    '酒ツボに酒を準備
    sakeTubo = 50000
    sakeNokori = sakeTubo

    '本体で首が別々に酒飲みするのを身構える

        Dim ts As New ThreadStart(AddressOf OrochiDrinking)

        Dim workerThread As New Thread(ts)

        workerThread.SetApartmentState(ApartmentState.MTA)

        workerThread.Start()

        workerThread.Join()

        Stop

  End Sub

    Private Sub OrochiDrinking()

        'まずは首を八本で飲んでみる
        Dim headCount As Integer = 8

        '酔っ払い待ち行列を首の数だけ準備
        Dim yoppa(headCount - 1) As WaitHandle

        For i As Integer = 1 To headCount

            '飲んだ首から酔っ払いへと
            yoppa(i - 1) = HeadDrinking(i).AsyncWaitHandle

        Next

        '全部の首が酔っ払いになるまで待機
        WaitHandle.WaitAll(yoppa)

    End Sub

    Private Function HeadDrinking(ByVal headNo As Integer) As IAsyncResult

        '指定した番号の首に酒を飲ませる
        Dim myHead As New OrochiHead(headNo)

        Dim gubi As New DrinkingSAKE(AddressOf myHead.Drink)

        '酒飲み開始とともに、酔っ払い待ち行列へ戻す
        Return gubi.BeginInvoke(Nothing, Nothing)

    End Function

    'おろちの首をクラス化
Private Class OrochiHead

    Private meNumber As Integer

    '何番目の首なのかを保存
    Public Sub New(ByVal headNo As Integer)

        meNumber = headNo

    End Sub

    '酒を飲むメソッド
    Public Sub Drink()

        Dim sakeZuki As New Thread( _
          New ThreadStart(AddressOf DrinkSAKE)) ' 

        sakeZuki.Start()
        sakeZuki.Join()

          Console.WriteLine("ぷはーっ！ {0}番目の首、飲み終わり！", meNumber)

    End Sub


  ' 酒のみスレッド
  Private Sub DrinkSAKE()

        Dim totalDrunk As Integer = 0
        Dim nowDrink As Integer

        Dim oneDrink As New Random
        Dim oneBreath As New Random

        '酒ツボの中の酒を飲み干す
        While (sakeNokori &amp;gt; 0)

            '一回飲むたびに息継ぎ
            Thread.Sleep(oneBreath.Next(30, 60))

            '一回ぐび
            nowDrink = oneDrink.Next(1, 100)

            '全部でどれくらい飲んだ？
            sakeNokori -= nowDrink

            Console.WriteLine("{0}番目の首が {1} リットル ぐびっ : 残り {2} リットル", meNumber, nowDrink, sakeNokori)


        End While

  End Sub

End Class

End Module&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;ぱっと見、これだけに見えるよね？&lt;/p&gt;
&lt;p&gt;でも、これが落とし穴。&lt;/p&gt;
&lt;p&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="283" alt="image" src="http://esten.cside.com/img/VB.NET_124A3/image.png" width="362" border="0"&gt; &lt;/p&gt;
&lt;p&gt;CPUの数が多い時、スレッドはどのCPUで管理されるかはOS次第。でもそのバラバラに動いているスレッドの処理が一箇所のアドレスにある値を読み出して書き出すわけだから、「今ある酒の量が本当に正しい」かどうか判らなくなる。これが小さなスレッドと一瞬で終わるプログラムなら気がつかないかもしれない。でも、沢山のCPU、スレッドで動いたときこの落とし穴ははっきりと結果にでてくるんだよね。&lt;/p&gt;
&lt;p&gt;&lt;font color="#008000"&gt;つまり、一つの酒ツボから複数の首が酒を飲むわけだけど、実際に、首の動きを制御しているのは、CPU。だから、CPUが複数あると、本当の意味で「同時に」首が酒を飲むことができるわけで、そうなると、酒ツボから飲んだ→残りこんだけ、という動きも本当の意味で「同時に」起きちゃうことになるの。&lt;strong&gt;そうなっちゃうと、今の酒の残り、は本当に正しい！ということがこのままだといえなくなっちゃうんだ。&lt;/strong&gt;&lt;font color="#ff0000"&gt;たとえば残り１００リットルから、ある首Aが２０リットル飲んで、ある首Bが１０リットル飲んだ。この時、本当だったら残りは７０リットルのはずなんだけど、２個のCPUがあるときに、Aの「100-20」の計算を１CPU、Bの「100-10」の計算を１CPUがそれぞれに同時にしちゃったら結果は「80」もしくは「90」として格納、これ、プログラム的には正しい動作なんだもの。&lt;/font&gt;見えないだけで、実はやまたのおろちの首はおもいっきり絡まってて、絡まったなりに酒を飲んだツモリになってたりしてるってことだよね。&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;厄介なのは、これ、必ず再現できると限らないんだ。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;VisualStudioのデバッガをつかってブレークポイントを仕掛けて止めただけでも、マルチスレッドプログラミングは直列の処理に最適化されてしまうので、ステップするとうまくいっちゃったりとかする。「なんで？何が悪いの？」がさっぱり判らなくなっちゃう。&lt;/p&gt;
&lt;p&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;おそろしいよね、それって。&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;だから、スレッド間でやり取りする値、読み出したり書き出したり更新したりする時には、必ずスレッド間で同期を取れるように作ってあげないといけない。&lt;/p&gt;
&lt;p&gt;マルチスレッドが難しいのはこの考え方があるからで、実はこれを回避するための処理クラスやステートメントが、ちゃんと用意されてたりするのね。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;それが、InerLockedクラス、そして、SyncLockステートメントブロック&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;じゃ、こいつらを使って、やまたのおろちに行儀良くお酒を飲んでもらおうと思う。ついでに、リファクタってやつもやってみるってことで、それは次回ねｗ&lt;/p&gt;
&lt;p&gt;&lt;font color="#ff00ff"&gt;実はまだ出てない新キャラがいるんだ、スサノオってのがｗｗｗ&lt;/font&gt;&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/esten/aggbug/165136.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>片桐　継（Tugu Katagiri）</dc:creator><title>やまたのおろちが酒をのむ～片桐的VB.NETスレッドプログラミング～その１</title><link>http://blogs.wankuma.com/esten/archive/2008/12/03/162607.aspx</link><pubDate>Wed, 03 Dec 2008 22:56:00 GMT</pubDate><guid>http://blogs.wankuma.com/esten/archive/2008/12/03/162607.aspx</guid><wfw:comment>http://blogs.wankuma.com/esten/comments/162607.aspx</wfw:comment><comments>http://blogs.wankuma.com/esten/archive/2008/12/03/162607.aspx#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://blogs.wankuma.com/esten/comments/commentRss/162607.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/esten/services/trackbacks/162607.aspx</trackback:ping><description>&lt;p&gt;やまたのおろちって本体一つに八つの首があるんだって。３だとキングギドラで、４がヒュドラで、16だとミズノエリュウ、だったと思うの。で、このたくさんの首の一つ一つがドラゴンの顔になってて、口があって……。まぁ、ようするに、&lt;font color="#ff0000"&gt;そんな彼らに酒を飲んでもらおうというコンセプトで、スレッドプログラミングの話をしてみようと思うんだ&lt;/font&gt;。  &lt;p&gt;まずはシングルスレッドのお話。  &lt;p&gt;まずはシンプルに、ふつーのシングルスレッド。代表の一本の首だけが飲ンベって想定で。 流れとしては一本の首がごきゅごきゅと酒ツボを飲み干すっと。 &lt;/p&gt; &lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:4e92f5b4-83a6-45fe-b77e-23e5a62749ba" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="vb:nocontrols"&gt;Imports System.Threading

Module OrochSTA

  Public Sub Main()

    Dim hontai As New Thread( _
      New ThreadStart(AddressOf DrinkSAKE)) ' 

    hontai.Start()
    hontai.Join()

      Console.WriteLine("ぷはーっ！")

        Stop
  End Sub

  ' 酒のみスレッド
  Private Sub DrinkSAKE()

        '酒ツボの中の酒の量
        Dim totalSAKE As Integer = 1000

        Dim totalDrunk As Integer = 0
        Dim nowDrink As Integer

        Dim oneDrink As New Random
        Dim oneBreath As New Random

        '酒ツボの中の酒を飲み干す
        While (totalDrunk &amp;lt;= totalSAKE)

            '一回飲むたびに息継ぎ
            Thread.Sleep(oneBreath.Next(30, 60))

            '一回ぐび
            nowDrink = oneDrink.Next(1, 100)
            Console.WriteLine("{0} リットル ぐびっ", nowDrink)

            '全部でどれくらい飲んだ？
            totalDrunk += nowDrink

        End While

  End Sub

End Module
&lt;/pre&gt;&lt;/div&gt;
&lt;div style="display: none"&gt;&amp;nbsp;&lt;/div&gt;この場合、&lt;font color="#ff0000"&gt;酒飲みはまだ一個の首でやってる。酒ツボも一つだけだから、さくーっとのんで終わり&lt;/font&gt;。で、つぎに、&lt;font color="#008000"&gt;このおろちの首をクラス化して、その一本の首に酒を飲ませてみる&lt;/font&gt;。これが大事な前フリｗ。あとで首がたくさんになるからね。 
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:bf8b30b9-f1d1-454b-9ee7-d4a3e9ebb515" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="vb:nocontrols"&gt;Imports System.Threading

Module OrochSTA

  Public Sub Main()

    Dim myHead As New OrochiHead

        myHead.Drink()

        Stop
  End Sub

    'おろちの首をクラス化
Private Class OrochiHead

    '酒を飲むメソッド
    Public Sub Drink()

        Dim sakeZuki As New Thread( _
          New ThreadStart(AddressOf DrinkSAKE)) ' 

        sakeZuki.Start()
        sakeZuki.Join()

          Console.WriteLine("ぷはーっ！")

    End Sub


  ' 酒のみスレッド
  Private Sub DrinkSAKE()

        '酒ツボの中の酒の量
        Dim totalSAKE As Integer = 1000

        Dim totalDrunk As Integer = 0
        Dim nowDrink As Integer

        Dim oneDrink As New Random
        Dim oneBreath As New Random

        '酒ツボの中の酒を飲み干す
        While (totalDrunk &amp;lt;= totalSAKE)

            '一回飲むたびに息継ぎ
            Thread.Sleep(oneBreath.Next(30, 60))

            '一回ぐび
            nowDrink = oneDrink.Next(1, 100)
            Console.WriteLine("{0} リットル ぐびっ", nowDrink)

            '全部でどれくらい飲んだ？
            totalDrunk += nowDrink

        End While

  End Sub

End Class

End Module
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;
&lt;div id="subjoinder" style="display: none"&gt;
&lt;p id="collapser"&gt;&lt;a onkeypress="expand(0,'subjoinder','expander');return false;" onclick="expand(0,'subjoinder','expander');return false;" href="#expander"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;で、首をクラス化することで、首が酒を飲む、というメソッドがラッピング。こうすると首一本のやるべきことが明確になる。そこで、飲ンベ首をデリゲートに登録して、さらに別スレッドで飲ませるように書き換えてみる。&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:ccac1272-b4c6-44cb-940e-b2d8c72243d4" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="vb:nocontrols"&gt;Imports System
Imports System.Threading

Module OrochSTA

    Delegate Sub DrinkingSAKE()

  Public Sub Main()

    '本体で首が別々に酒飲みするのを身構える

        Dim ts As New ThreadStart(AddressOf OrochiDrinking)

        Dim workerThread As New Thread(ts)

        workerThread.SetApartmentState(ApartmentState.STA)

        workerThread.Start()

        workerThread.Join()

        Stop

  End Sub

    Private Sub OrochiDrinking()

        'まずは首を八本で飲んでみる
        Dim headCount As Integer = 8

        '全部の首が酒を飲み干す
        For i As Integer = 1 To headCount

            HeadDrinking(i)

        Next

    End Sub

    Private Sub HeadDrinking(ByVal headNo As Integer)

        '指定した番号の首に酒を飲ませる
        Dim myHead As New OrochiHead(headNo)

        Dim gubi As New DrinkingSAKE(AddressOf myHead.Drink)

        '酒飲み開始とともに、酔っ払い待ち行列へ戻す
        gubi.Invoke()

    End Sub

    'おろちの首をクラス化
Private Class OrochiHead

    Private meNumber As Integer

    '何番目の首なのかを保存
    Public Sub New(ByVal headNo As Integer)

        meNumber = headNo

    End Sub

    '酒を飲むメソッド
    Public Sub Drink()

        Dim sakeZuki As New Thread( _
          New ThreadStart(AddressOf DrinkSAKE)) ' 

        sakeZuki.Start()
        sakeZuki.Join()

          Console.WriteLine("ぷはーっ！ {0}番目の首、飲み終わり！", meNumber)

    End Sub


  ' 酒のみスレッド
  Private Sub DrinkSAKE()

        '酒ツボの中の酒の量
        Dim totalSAKE As Integer = 1000

        Dim totalDrunk As Integer = 0
        Dim nowDrink As Integer

        Dim oneDrink As New Random
        Dim oneBreath As New Random

        '酒ツボの中の酒を飲み干す
        While (totalDrunk &amp;lt;= totalSAKE)

            '一回飲むたびに息継ぎ
            Thread.Sleep(oneBreath.Next(30, 60))

            '一回ぐび
            nowDrink = oneDrink.Next(1, 100)
            Console.WriteLine("{0}番目の首が {1} リットル ぐびっ", meNumber, nowDrink)

            '全部でどれくらい飲んだ？
            totalDrunk += nowDrink

        End While

  End Sub

End Class

End Module
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;
&lt;div id="subjoinder" style="display: none"&gt;
&lt;p id="collapser"&gt;&lt;a onkeypress="expand(0,'subjoinder','expander');return false;" onclick="expand(0,'subjoinder','expander');return false;" href="#expander"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;さて、こんなカンジで、&lt;font color="#ff0000"&gt;首の一本一本が順番に酒を飲んで、順番に飲み終わり、をシングルスレッドで動いてるってことに置き換えてもこれだけの方法があったりする&lt;/font&gt;。でもね、飲ンベ首が増えたら、待たせるとウルサイから皆せーの！で飲んじゃいなYO！ってことで並列化させようと思うんだ。これがマルチスレッドでの動き。それはまた次にね&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/esten/aggbug/162607.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>片桐　継（Tugu Katagiri）</dc:creator><title>32.4GBの攻防戦→訂正→32.994GBの攻防戦</title><link>http://blogs.wankuma.com/esten/archive/2008/12/02/162443.aspx</link><pubDate>Tue, 02 Dec 2008 00:21:00 GMT</pubDate><guid>http://blogs.wankuma.com/esten/archive/2008/12/02/162443.aspx</guid><wfw:comment>http://blogs.wankuma.com/esten/comments/162443.aspx</wfw:comment><comments>http://blogs.wankuma.com/esten/archive/2008/12/02/162443.aspx#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://blogs.wankuma.com/esten/comments/commentRss/162443.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/esten/services/trackbacks/162443.aspx</trackback:ping><description>&lt;p&gt;それは開発用サーバーのSQLServer2005で、ちょっと前から困っていたことのお話。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;問題：ディスクは50GBしかないのに、msdbが33GBもある。そのせいで、テストモジュールを最低限まで削ってもテスト動かすとすぐに残り容量100MB以下に。うーん、でいんじゃらす。&lt;/font&gt;&lt;/strong&gt;  &lt;p&gt;なので、ちょっと本気を出して、msdbの圧縮について、対処することにした。 &lt;p&gt;まずは原因となっているだろうテーブルの洗い出し。 &lt;p&gt; &lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:572d2cff-2c9e-4989-9481-5e97614ed52d" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="sql:nocontrols"&gt;SELECT isnull(sum(  p.rows ),0) as RowCounts,s.name as TableName
 FROM sys.partitions p
INNER JOIN sys.objects s ON s.object_id = p.object_id
LEFT JOIN  sys.allocation_units a ON  p.partition_id = a.container_id
 WHERE p.index_id  in(0,1) and p.rows is not null and a.type = 1
 group by s.name
 order by isnull(sum(  p.rows ),0) desc&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;で、msdbの全テーブルの行数をテーブルごとに列挙してみると、&lt;strong&gt;行数が800万件超えてるテーブルを発見&lt;/strong&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font color="#008000"&gt;問題のテーブルは　sysxmitqueue&lt;/font&gt;&lt;/strong&gt; 
&lt;p&gt;ServiceBroker の処理キューを貯めておくところなんだけどどうやら未処理のままデータを溜め込んでいるらしい。&lt;font color="#0000ff"&gt;そういや、このサーバーでBrokerのテストしたことあったなー&lt;/font&gt;。って、ずいぶん前だな、、つか、そのせいかorz 
&lt;p&gt;なので、さくっとBroker再構築&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:94fe1245-59f3-44a4-9d1b-3d3bd7d1f4bf" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="sql:nocontrols"&gt;ALTER DATABASE [msdb] SET SINGLE_USER
  WITH ROLLBACK IMMEDIATE
GO

ALTER DATABASE [msdb] SET NEW_BROKER
  WITH ROLLBACK IMMEDIATE
GO

ALTER DATABASE [msdb] SET MULTI_USER
GO&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;で、その後、msdbを圧縮。&lt;strong&gt;&lt;font color="#ff00ff"&gt;おおっ！33GB→6MBに！&lt;/font&gt;&lt;/strong&gt;
&lt;p&gt;ディスクが空いた。一安心ｗ &lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/esten/aggbug/162443.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>片桐　継（Tugu Katagiri）</dc:creator><title>こういう時こそ、ツリービューだと思う</title><link>http://blogs.wankuma.com/esten/archive/2008/09/17/156834.aspx</link><pubDate>Wed, 17 Sep 2008 13:28:00 GMT</pubDate><guid>http://blogs.wankuma.com/esten/archive/2008/09/17/156834.aspx</guid><wfw:comment>http://blogs.wankuma.com/esten/comments/156834.aspx</wfw:comment><comments>http://blogs.wankuma.com/esten/archive/2008/09/17/156834.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.wankuma.com/esten/comments/commentRss/156834.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/esten/services/trackbacks/156834.aspx</trackback:ping><description>&lt;p&gt;和菓子大好きです。  &lt;p&gt;玉子、とくに黄身の摂取を控えなくてはならない私にとって、ささやかに楽しむ季節の和菓子は最高の娯楽です。  &lt;p&gt;これからの時期は、ススキやもみじをあしらった上菓子やおはぎが幸せな頃。&lt;br&gt;それだけに&lt;strong&gt;一連の平成米騒動は我慢ならないものがあります&lt;/strong&gt;。  &lt;p&gt;&lt;a href="http://www.asahi.com/national/update/0917/TKY200809160331_10.html"&gt;http://www.asahi.com/national/update/0917/TKY200809160331_10.html&lt;/a&gt;&lt;br&gt;ここに、事故米が流通したとされる業者の一覧がでています。&lt;br&gt;施設への給食と和菓子製造が多いことに簡単に気づくでしょう。&lt;br&gt;名前から察するに、きっと家族単位、家単位でひっそりと長く続けてきた地域の老舗なんかも含まれてるんじゃないでしょうか？  &lt;p&gt;&lt;font color="#ff0000"&gt;「うわ、ここで買っちゃいけない」&lt;br&gt;&lt;/font&gt;なんて簡単に思ってませんか？&lt;br&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;でも、それ、ちょっとまってやってください。&lt;/font&gt;&lt;/strong&gt;&lt;br&gt;この発表そのものに、違和感を感じませんか？ &lt;/p&gt; &lt;p&gt;末端、つまり消費者に直接関係するのは確かにこれらの会社の製品であり、お店であり、施設なのでしょう。&lt;font color="#0000ff"&gt;&lt;strong&gt;けれど、どこから、どうやって、どの経路で、事故米がここまで流れたのか。そもそも、誰から誰へこの米がどういう名称で取引されてここまできたのか、その経緯がまったくここから読み取れません。&lt;/strong&gt;&lt;/font&gt;それではまるで、この一覧の上流にある卸会社、流通会社については情報隠蔽のようにも感じ取れてしまいます。私はその報道形式がとても不気味で、納得ができないのです。  &lt;p&gt;個人的に思うのですけれど、&lt;font color="#ff0000"&gt;この一覧にある施設の関係者、お店、製造会社の関係者、私達消費者と同様に被害者なのではないですか？&lt;/font&gt;&lt;font color="#ff0000"&gt;&lt;br&gt;&lt;/font&gt;そういう疑問をもって、ちょっとだけ頑張って情報収集してみました。グーグル先生のおかげでそれなりに情報は得られるのだから確かに今は情報化社会なのかもしれない。 &lt;/p&gt; &lt;p&gt;&lt;font color="#008080"&gt;でも一方で、そういう努力、そういう発想や行動力を持たない人は与えられた情報だけで満足？して、ヒステリックに「ここはダメ！」「ここでは買わない！」で終わっちゃうんじゃないかなぁとふと思う（笑）&lt;br&gt;で残念な事に、そういう人が増えている昨今なワケですが（汗） &lt;/font&gt; &lt;p&gt;というわけで、がんばって農水省のPDFを探して、ダウンロードして、読んで、色々と情報が得られました。&lt;br&gt;大本営発表だからどこまで真実なのかは当事者じゃないからわからないけど……すくなくとも何も知らないよりはマシ。&lt;br&gt;でも探すの大変だったよ、全部の関連PDFを時系列で読まないと理解できないんだもの＜おい  &lt;p&gt;最終的に、事故米の流れはツリービューにできる、と思ったのですよ。そうしたらもっとたくさんの人に簡単にわかりやすく情報を伝える事ができるのに、なぜそれを避けるのかしら……  &lt;p&gt;和菓子好きとして、本当に今回の事は許せないなぁ、図にしてみようかな……&lt;strong&gt;って、あれ？　誰か来た？&lt;/strong&gt;&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/esten/aggbug/156834.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>片桐　継（Tugu Katagiri）</dc:creator><title>ある図書室のお話</title><link>http://blogs.wankuma.com/esten/archive/2008/06/14/143756.aspx</link><pubDate>Sat, 14 Jun 2008 23:47:00 GMT</pubDate><guid>http://blogs.wankuma.com/esten/archive/2008/06/14/143756.aspx</guid><wfw:comment>http://blogs.wankuma.com/esten/comments/143756.aspx</wfw:comment><comments>http://blogs.wankuma.com/esten/archive/2008/06/14/143756.aspx#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://blogs.wankuma.com/esten/comments/commentRss/143756.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/esten/services/trackbacks/143756.aspx</trackback:ping><description>&lt;p&gt;その図書室は不思議な図書室です。&lt;/p&gt; &lt;p&gt;&lt;br&gt;利用したい人はそこに本棚を作り、いろんな本を自由に置いて使うことができます。大きな分厚い本、小さな薄い本、それも自由。ただし、&lt;font color="#ff0000"&gt;必ず司書さんを通して本を置いたり退けたりしなければならない、というルールが存在&lt;/font&gt;します。つまり、本棚を作った後は、利用者が直接触ることはできないってことです。&lt;strong&gt;図書室はとても固いセキュリティに護られているんですよ。&lt;/strong&gt; &lt;/p&gt; &lt;p&gt;&lt;font color="#000080"&gt;さて、そんな本棚には４つの棚があり、本の配置には厳格な決まりがあります。&lt;br&gt;本の大きさや分厚さがある一定サイズを超えていた場合、必ず一番下の棚に本を置き、それ以外は必ず上から置く、というルールです。&lt;/font&gt;  &lt;p&gt;それでは実際に、一つ本棚を作って、司書さんに、分厚い図鑑を置く事からお願いしてみましょう。  &lt;p&gt;司書さんは一番下の棚にその図鑑をおきます。大きい本ですからね。  &lt;p&gt;今度は、小さな本をお願いしました。  &lt;p&gt;司書さんはその本を一番上の棚に置きます。小さいですもん。  &lt;p&gt;まぁそんなこんなで、何冊か色んな本を司書さんにお願いした後、使用者にはもう読まない本がでてきているでしょう。早速お願いして退けてもらいます。が、ここはあくまでも、「使わないよ宣言」にすぎません。&lt;font color="#008000"&gt;司書さんは非効率な仕事は好まないので、すぐに本を処分しないのです。とりあえず、「使わない」ラベルを貼って、まだ本棚に置きっぱなしにしておきます。&lt;/font&gt;  &lt;p&gt;やがて、一番上の棚がいっぱいになり、頼まれた本が入らなくなりました。&lt;font color="#ff0000"&gt;司書さんは、ここではじめて「使わないラベル」が貼られた本を棚からどけて、残った一番上の棚の本を二番目の棚に移動させます。こうして、もう一度、上の棚で本を並べて仕事を続けます。&lt;/font&gt;  &lt;p&gt;繰り返して、また上の棚がいっぱいになりました。&lt;font color="#ff0000"&gt;司書さんは二番目の棚で「使わないラベル」の本をどけてさらに一つ下の棚に置き、一番目の棚で「使わないラベル」になった本をどけてその開いた二番目に入れ、一番上の棚を空けます。 &lt;/font&gt; &lt;p&gt;さらに、また上の棚がいっぱいになりました。&lt;font color="#ff0000"&gt;司書さんは三番目の棚の「使わないラベル」の本をどけて間をつめ、二番目の棚の「使わないラベル」の本をそこへ移し、入りきらないものを二番目に残します。そこへ一番上の棚の「使わないラベル」の本をどけた残りの本を移し、さらに上の棚を使えるようにしようとします。 &lt;/font&gt; &lt;p&gt;……でも、さらに本が来たら……  &lt;p&gt;司書さんは「これ以上仕事はできません」と返事をし、一切の仕事を拒否します。一度本棚を撤去して、再度本棚を作り直すことから始めましょう。  &lt;p&gt;&lt;strong&gt;本棚＝プロセスメモリ空間&lt;br&gt;一番目の棚＝GC　ジェネレーション0&lt;br&gt;二番目の棚＝GC　ジェネレーション1&lt;br&gt;三番目の棚＝GC　ジェネレーション2&lt;br&gt;四番目の棚＝ラージ オブジェクト ヒープ&lt;br&gt;司書さんの仕事＝.NetFramework のガベージコレクタ制御&lt;br&gt;本＝プログラムで使用するオブジェクトメモリ&lt;/strong&gt;  &lt;p&gt;はい、簡単で超大雑把なGCのお話でした（＾＾； &lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/esten/aggbug/143756.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>片桐　継（Tugu Katagiri）</dc:creator><title>Hyper-V が　RC1　になってまふ</title><link>http://blogs.wankuma.com/esten/archive/2008/05/21/138814.aspx</link><pubDate>Wed, 21 May 2008 23:58:00 GMT</pubDate><guid>http://blogs.wankuma.com/esten/archive/2008/05/21/138814.aspx</guid><wfw:comment>http://blogs.wankuma.com/esten/comments/138814.aspx</wfw:comment><comments>http://blogs.wankuma.com/esten/archive/2008/05/21/138814.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/esten/comments/commentRss/138814.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/esten/services/trackbacks/138814.aspx</trackback:ping><description>&lt;p&gt;ダウンロードは以下で&lt;/p&gt; &lt;p&gt;&lt;a title="http://www.microsoft.com/downloads/details.aspx?displaylang=ja&amp;amp;FamilyID=7edaa89f-9f64-488d-93c0-858d2d8799df" href="http://www.microsoft.com/downloads/details.aspx?displaylang=ja&amp;amp;FamilyID=7edaa89f-9f64-488d-93c0-858d2d8799df"&gt;http://www.microsoft.com/downloads/details.aspx?displaylang=ja&amp;amp;FamilyID=7edaa89f-9f64-488d-93c0-858d2d8799df&lt;/a&gt;&lt;/p&gt; &lt;p&gt;といっても、日本語対応となるのはもうちょっと後？&lt;/p&gt; &lt;p&gt;今年の夏にむけて順調に？近づいてきてる感じです。それよか、LinuxIntegrationKitが早く正式公開しないかなー。試したくてウズウズなんですけど（笑）&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/esten/aggbug/138814.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>片桐　継（Tugu Katagiri）</dc:creator><title>やまたのおろちvsキングギドラ　FinalWars　その２</title><link>http://blogs.wankuma.com/esten/archive/2008/04/10/132593.aspx</link><pubDate>Thu, 10 Apr 2008 20:04:00 GMT</pubDate><guid>http://blogs.wankuma.com/esten/archive/2008/04/10/132593.aspx</guid><wfw:comment>http://blogs.wankuma.com/esten/comments/132593.aspx</wfw:comment><comments>http://blogs.wankuma.com/esten/archive/2008/04/10/132593.aspx#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://blogs.wankuma.com/esten/comments/commentRss/132593.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/esten/services/trackbacks/132593.aspx</trackback:ping><description>&lt;p&gt;その発端&lt;br&gt;&lt;a href="http://blogs.wankuma.com/esten/archive/2008/03/22/129035.aspx"&gt;http://blogs.wankuma.com/esten/archive/2008/03/22/129035.aspx&lt;/a&gt;&lt;/p&gt; &lt;p&gt;FinalWars その１&lt;br&gt;&lt;a href="http://blogs.wankuma.com/esten/archive/2008/04/09/132463.aspx"&gt;http://blogs.wankuma.com/esten/archive/2008/04/09/132463.aspx&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#800080"&gt;オブジェクトのブロッキングで絡まってしまったおろちの首。絡まらないで仕事をさせるには、ロックをはずせば良い。そう考えた胡桃の脳な私は、ちょこっと細工をした。&lt;/font&gt;  &lt;p&gt;「インデックスの行ロック」「インデックスのページロック」  &lt;p&gt;チェックボックスをOFF。インデックスを再構築して、再び、おろちで仕事。  &lt;p&gt;でも、止まる。おんなじところで「ScanStart/End」。いや、こんどの場合は &lt;p&gt;&lt;font color="#ff0000" size="4"&gt;&lt;strong&gt;利用状況の画面に「X」がさらに倍にどばーーっ！ &lt;/strong&gt;&lt;/font&gt; &lt;p&gt;&lt;font color="#ff0000" size="4"&gt;&lt;strong&gt;最悪やん！ &lt;/strong&gt;&lt;/font&gt; &lt;p&gt;&lt;font color="#ff0000" size="4"&gt;&lt;strong&gt;なんでやねーーんっ！ &lt;/strong&gt;&lt;/font&gt; &lt;p&gt;しかもトランザクションロックが動いて、ブロッキングも頻繁してえらいことに。で、このロック、運悪くTransactionScopeの中、はい、DTSががーーーーーっつり掴んでます。強制終了なんて効きやしねぇ。あー、もう、&lt;font color="#ff0000"&gt;ど・う・に・も・とまらない～（号泣）SQLServer強制再起動（恐）&lt;/font&gt;&lt;br&gt;周りに謝りまくり、始末書もどき書き、ごめんなさい会議までやっちゃう羽目に（大汗）&lt;strong&gt;これで一日丸つぶれ（はぁと） &lt;/strong&gt; &lt;p&gt;というわけで、これはやっちゃいけないことだったんだね。うん、反省。ちょっと色々といぢりすぎた。  &lt;p&gt;&lt;strong&gt;&lt;u&gt;&lt;font color="#000080"&gt;で、気持ちを切り替えて、&lt;/font&gt;&lt;/u&gt;&lt;/strong&gt; &lt;p&gt;別の方面からのアプローチ。問題のSQLの実行プランをだしてみた。実行プランは出てくる。「なーんだ、ちゃんと解析できてるやん」とホッとしたのもつかの間、ふと、比べていて気がついた。おろちとギドラ、同じレコード同じテーブル同じ件数同じデータでありながら、実行プランが微妙に違う。  &lt;p&gt;ギドラはテーブル副問い合わせにはクラスタインデックスを使用せず、おろちはそこにクラスタインデックス。両方とも内部パラレル処理なのは同じなんだけど……  &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;何で違うん？&lt;/font&gt;&lt;/strong&gt;  &lt;p&gt;ギドラとおろちはテーブル構成も一緒、作りも一緒。違うのはCPUの数、メモリの量。それに……それに、実行回数（爆死）で、はたと考えた。&lt;font color="#008000"&gt;テスト機のギドラはそりゃもう、とんでもない回数をこなしてきた百戦錬磨の練りこまれた統計情報を持っている。一方おろちは、必要な時に必要な回数だけをピンポイントに実行してきた、いわば世間知らずな深窓のおぜうさまｗ&lt;/font&gt;  &lt;p&gt;まさか、まさかぁ、ねぇ？　なんて思いながら、蓋を開けてみた。  &lt;p&gt;　統　計　情　報　&lt;font color="#c0c0c0"&gt;それはパンドラの箱ｗ&lt;/font&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;うそぉぉん。全然違う、チャウチャウチャウチャウ！ちゃいすぎぢゃっ！　&lt;/font&gt;&lt;/strong&gt;回数をこなしたギドラがこのSQLを実行するときに選択する最適なプラン、クラスタインデックスを外のDで使い内側のSではあえて別のインデックス（まぁちょっと似てるようなやつなんだけど、スキーマバインディングしていたビューのクラスタインデックスｗ）を使っていた理由はそこかぁ！（&lt;font color="#404040"&gt;意義ありぃっ！びしぃっ！画面が揺れるっってくらいの衝撃ｗ）&lt;/font&gt;。恐らくはテストで張ったりはずしたりしたインデックスの情報さえも残すのかナンなのか、ギドラはすでにロックをうまくすりぬける方法をマスターしていてそれを駆使して仕事をする荒業をやってのけていた。さすがギドラだぜ！空間移動で光りながら現れてピロピロピロだぜ（昭和）！地球守護聖獣千年龍王だぜ（平成）！引力光線吐きまくって空飛ぶぜ（共通ｗ）！  &lt;p&gt;さらに、その観点から再度両方のProfilerログを見直して、ふと、気づいた。&lt;font color="#008000"&gt;&lt;strong&gt;ブロッキングが頻発していたおろちの自動統計情報更新処理はトランザクションロックタイムアウトでことごとくダウンして中断。バックグラウンド処理のために、誰にも注意を払われていなかったのだけれど、これがジワジワと効いていて、気がつけば必要な情報がろくに揃ってない状態になっていたらしい。&lt;/strong&gt;&lt;/font&gt;そんな中で、それでも首はある限りの情報で仕事を計画し、働こうとして、でもやっぱり首が絡まって……かわいそう、&lt;strong&gt;&lt;font color="#ff0000"&gt;なんてかわいそうなんだ！やまだのおろち！&lt;/font&gt;&lt;/strong&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#000080"&gt;ひととおり同情したら、基本に立ち返ろう。&lt;/font&gt;&lt;/strong&gt; &lt;p&gt;問題のSQLにある外SQLのDと副問いSQLのS、ギドラがやろうとしたように異なるインデックスで実行すれば、おろちでも早くなれるはず。確かにSQLServerは与えられているリソースの中で最適な方法で処理をしようとプランをつくるけど、しょせんはロジック、機械、AIじゃない。人間がなんとかしようとしなければ、結局はハコの中で動作する０と１の電気信号にすぎないと思うの。そこをキチンと把握して、うまく仕事ができるようにしてやらないとイカンのではない？  &lt;p&gt;というわけで  &lt;p&gt;&lt;font color="#008000"&gt;&lt;strong&gt;&amp;nbsp; UPDATE D SET D.ID = S.ID FROM HOGE1 D , (SELECT　A1,A2,A3, ROW_NUMBER over (Order by A1 ) as ID FROM HOGE1 WHERE A4 is null ) S WHERE D.A1 = S.A1 AND D.A2 = S.A2 AND D.A3 = S.A3 &lt;/strong&gt;&lt;/font&gt; &lt;p&gt;&lt;font color="#800080"&gt;HOGE1テーブル用に、クラスタインデックス（A1,A2,A3）とは別に、A1とA4の非クラスタ（付加列A2,A3）を追加。そして最重要？おろちのメンテ。DBCC　CHECKDBと統計情報更新とインデックス再構築を手動で実行！ついでにSQLServerも再起動！&lt;/font&gt;で、まっさら？なギドラとおろち、再び、ゴング！  &lt;p&gt;&lt;strong&gt;ギドラで実行→５分４２秒&lt;/strong&gt;、うん、なんか、心持ち早い（笑）&lt;br&gt;&lt;strong&gt;おろちで実行→&lt;font color="#ff0000"&gt;１分５３秒&lt;/font&gt;&lt;/strong&gt;、うおー！すげーーーっ！はええぇぇっっ！  &lt;p&gt;というわけで、おろち、復活。つか、前より早くなってねぇかい？  &lt;p&gt;あらためて、ProFilerとパフォーマンスモニターでチェックしてみたところ、新しいインデックスが参戦したことで統計情報が一新されたらしくHOGE1の処理をしていた他のSQLまでもが高速化（笑）統計情報更新もロックタイムアウトすることなく全ての処理を美しく完了。&lt;font color="#ff0000"&gt;ブラボー♪それってなんて素敵だし爽やかなチューニング！！&lt;/font&gt;（自画自賛！）  &lt;p&gt;&lt;strong&gt;&lt;font color="#000080"&gt;つまりはだ、&lt;/font&gt;&lt;/strong&gt;おろちでは  &lt;p&gt;&lt;font color="#008000"&gt;副問い合わせと本体が同一テーブルのUPDATEを行おうとしたときに統計情報の不足から同一のテーブルしかも同一のインデックスを使って処理を行うプランが作成され、それを実行しようとして自分で自分の使いたいリソースをロックして自分で自分をロック解除待ちにしてしまい、それによってその接続プールのトランザクションがロック状態。マルチスレッド上の別のSQL実行もそのトランザクション処理を待ってしまうために統計情報自動更新の処理さえもトランザクションタイムアウトを発生して全体が鈍足化してしまっていた。CPUとメモリが豊富なマシンでは同時に走る事のできるスレッドの数もふえるため、少ないマシンに比べてロック待ちとなる処理も増える。 &lt;/font&gt; &lt;p&gt;ということだったんだな。&lt;font color="#ff0000"&gt;おろち、てめぇ、らめぇ（笑）&lt;/font&gt;  &lt;p&gt;&lt;font color="#000080"&gt;&lt;strong&gt;やらなくちゃいけなかったこと&lt;/strong&gt;&lt;/font&gt;  &lt;p&gt;&lt;font color="#008000"&gt;同一テーブルへの処理であっても、副問い合わせを使うということは別テーブルをメモリというか一時テーブルに展開するのと同意。なので、本体処理と別のインデックスを提供もしくはスキーマバインドビューをつかって競合を避けさせる必要がある。その処理が複数CPUによるパラレル処理を実行プランに持つ場合、自身のリソース同士のブロッキングを引き起こしやすい状況になることも考慮すること。そして、サーバーでの統計情報更新、インデックスの再構築、データベースファイルおよびトランザクションログファイルの適切なメンテナンスはデータベースサイズが大きくなり、かつ使用するCPUとメモリが多いほど不可欠な作業、怠ると劣化鈍足化の原因になる。 &lt;/font&gt; &lt;p&gt;小回りなギドラにくらべ、おろちはずっと手のかかる構ってチャンだったわけだね。だからこそ、きちんと手をかけてやればそれだけの働きもするってことで（笑）&lt;br&gt;まぁ、これで、おろちはギドラに勝った……んだけどさ。おろちの追加インデックス作成の申請を通せるのかどうかは、大人の事情だな。でもね、一つ、すごいこと。&lt;strong&gt;この実行テストの後に追加したインデックスを削除したとしても、それ以降ロックを起こした実行プランを使うことは全く起きなかった、どころか、回数を重ねれば重ねるほど高速化して、最後には1分10秒台に。ギドラで57分掛かっていたデータ処理も最終的には16分で処理するところまでやりきれた。&lt;/strong&gt;なんだかもう、カイザーギドラおろちモードってカンジだったね、ラストは（謎）&lt;font color="#ff0000"&gt;プランキャッシュとリコンパイルを徹底的に意識したSQL文を作って処理させたというのはあるにせよ、それにしても統計情報の蓄積とプランキャッシュの有効活用によって起きる効果ってのはホント絶大なんやねぇ。それゆえに、うまくいかないとボロボロにもなるわけだがｗ&lt;/font&gt;　うん、良い経験をした、ってことにしておこう（笑）  &lt;p&gt;&amp;nbsp; &lt;p&gt;&lt;strong&gt;&lt;u&gt;今回、読みまくって、脳みそを胡桃味噌に発酵させてくれたモノたち &lt;/u&gt;&lt;/strong&gt; &lt;p&gt;Microsoft SQL Server 2005 のクエリ オプティマイザが使用する統計情報&lt;br&gt;&lt;a href="http://www.microsoft.com/japan/technet/prodtechnol/sql/2005/qrystats.mspx"&gt;http://www.microsoft.com/japan/technet/prodtechnol/sql/2005/qrystats.mspx&lt;/a&gt; &lt;p&gt;SQL Server 2005 のバッチのコンパイル、再コンパイル、およびプランのキャッシュに関する問題&lt;br&gt;&lt;a href="http://www.microsoft.com/japan/technet/prodtechnol/sql/2005/recomp.mspx"&gt;http://www.microsoft.com/japan/technet/prodtechnol/sql/2005/recomp.mspx&lt;/a&gt; &lt;p&gt;ぷらす、SQLServer2005 Books Online &amp;amp; TechNet &amp;amp; MSDN あちこち  &lt;p&gt;以下、海の向こうのサイト（おい）  &lt;p&gt;よく出入りしている、SQLServerPeformance.com の記事から、  &lt;p&gt;統計情報更新について&lt;br&gt;&lt;a href="http://www.sql-server-performance.com/tips/update_statistics_p1.aspx"&gt;http://www.sql-server-performance.com/tips/update_statistics_p1.aspx&lt;/a&gt; &lt;p&gt;インデックスを作って使う時のツボ系ｗ&lt;br&gt;&lt;a href="http://www.sql-server-performance.com/tips/index_main.aspx"&gt;http://www.sql-server-performance.com/tips/index_main.aspx&lt;/a&gt; &lt;p&gt;パフォーマンスチューニングのツボ。とりあえずひととおりｗ&lt;br&gt;&lt;a href="http://www.sql-server-performance.com/tips/performance_main.aspx"&gt;http://www.sql-server-performance.com/tips/performance_main.aspx&lt;/a&gt; &lt;p&gt;後、ここいらの本。めっちゃ勉強になった良書。SQLServerいぢるなら読んどいて損はないです。でも日本語版ないよね……翻訳してみたいくらいなんだけど（笑）  &lt;p&gt;Inside Microsoft SQL Server 2005: Query Tuning and Optimization&lt;br&gt;&lt;a href="http://www.amazon.co.jp/Inside-Microsoft-SQL-Server-2005/dp/0735621969/ref=sr_1_1?ie=UTF8&amp;amp;s=english-books&amp;amp;qid=1207789032&amp;amp;sr=1-1"&gt;http://www.amazon.co.jp/Inside-Microsoft-SQL-Server-2005/dp/0735621969/ref=sr_1_1?ie=UTF8&amp;amp;s=english-books&amp;amp;qid=1207789032&amp;amp;sr=1-1&lt;/a&gt; &lt;p&gt;Inside Microsoft SQL Server 2005: T-sql Querying &lt;br&gt;&lt;a href="http://www.amazon.co.jp/Inside-Microsoft-SQL-Server-2005/dp/0735623139/ref=pd_sim_fb_img_1"&gt;http://www.amazon.co.jp/Inside-Microsoft-SQL-Server-2005/dp/0735623139/ref=pd_sim_fb_img_1&lt;/a&gt; &lt;p&gt;いぢょ♪&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/esten/aggbug/132593.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>片桐　継（Tugu Katagiri）</dc:creator><title>やまだのおろちvsキングギドラ　FinalWars その１</title><link>http://blogs.wankuma.com/esten/archive/2008/04/09/132463.aspx</link><pubDate>Wed, 09 Apr 2008 21:45:00 GMT</pubDate><guid>http://blogs.wankuma.com/esten/archive/2008/04/09/132463.aspx</guid><wfw:comment>http://blogs.wankuma.com/esten/comments/132463.aspx</wfw:comment><comments>http://blogs.wankuma.com/esten/archive/2008/04/09/132463.aspx#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://blogs.wankuma.com/esten/comments/commentRss/132463.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/esten/services/trackbacks/132463.aspx</trackback:ping><description>&lt;p&gt;&lt;strong&gt;&lt;font color="#004080"&gt;やまだのおろちのスペック&lt;br&gt;　CPU８個&lt;br&gt;　メモリ32G &lt;/font&gt;&lt;/strong&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#004080"&gt;キングギドラのスペック&lt;br&gt;　CPU２個&lt;br&gt;　メモリ４G &lt;/font&gt;&lt;/strong&gt; &lt;p&gt;それ以外は全部一緒。OSも設定もほとんど一緒。まぁ本番擬似サーバーと開発サーバーだから、似ててないと困るんだけど、色々と。&lt;br&gt;そもそもの話、キングギドラで６分の処理が、おろちで30分近くかかること、から全ての話は始まった。  &lt;p&gt;&lt;strong&gt;SQLServer2005でのモニター&lt;/strong&gt;  &lt;hr&gt;   &lt;p&gt;&lt;font color="#ff0080"&gt;使うもの。&lt;br&gt;　パフォーマンスモニタ&lt;br&gt;　SQLServer2005 ProFiler　と　利用状況画面 &lt;/font&gt; &lt;p&gt;おろちとギドラのそれぞれで、同じログ情報を取得します。  &lt;p&gt;　&lt;strong&gt;パフォーマンスモニタで監視するもの&lt;/strong&gt;  &lt;p&gt;&lt;font color="#008000"&gt;Memory\Available MBytes&lt;br&gt;Memory\Cache Faults/sec&lt;br&gt;Memory\Page Reads/sec&lt;br&gt;Memory\Pages/sec&lt;br&gt;Memory\Pool Nonpaged Bytes&lt;br&gt;PhysicalDisk(_Total)\Avg. Disk Queue Length&lt;br&gt;PhysicalDisk(_Total)\Avg. Disk Read Queue Length&lt;br&gt;PhysicalDisk(_Total)\Avg. Disk sec/Read&lt;br&gt;PhysicalDisk(_Total)\Avg. Disk sec/Transfer&lt;br&gt;PhysicalDisk(_Total)\Avg. Disk Write Queue Length&lt;br&gt;Process(_Total)\Private Bytes&lt;br&gt;Process(_Total)\Working Set&lt;br&gt;Processor(_Total)\% Privileged Time&lt;br&gt;Processor(_Total)\% Processor Time&lt;br&gt;Server\Pool Nonpaged Peak&lt;br&gt;Server\Pool Paged Failures&lt;br&gt;System\Context Switches/sec&lt;br&gt;System\Processor Queue Length &lt;/font&gt; &lt;p&gt;　&lt;strong&gt;SQLServer2005　ProFilerで監視するもの&lt;/strong&gt;  &lt;p&gt;&lt;font color="#008000"&gt;SQL:StmtStart/Completed&lt;br&gt;SQL:BatchStart/Completed&lt;br&gt;SP:StmtStart/Completed&lt;br&gt;Data File Auto Grow/Shrink&lt;br&gt;Log File Auto Grow/Shrink&lt;br&gt;Lock:Cancel/Deadlock/Timeout&lt;br&gt;Degree of Parallelism&lt;br&gt;Server Memory Change&lt;br&gt;Scan Started/Stoped &lt;/font&gt; &lt;p&gt;　まぁ、こんなもん。で、実際にとってみたわけですよ。&lt;br&gt;　ちなみに、SQLServerでのSQL構文実行プロセスは  &lt;p&gt;&lt;strong&gt;●SQLServerのSQL実行動作 &lt;/strong&gt; &lt;p&gt;&lt;strong&gt;　SQL構文の解析&lt;br&gt;　コンパイル有無の判断&lt;br&gt;　実行プランの策定&lt;br&gt;　SQL構文実行&lt;br&gt;　取得結果展開 &lt;/strong&gt; &lt;p&gt;おおざっぱにこんなカンジ。なんで、これらの動きの時に、メモリやCPUがどう動き、接続プールがどうなっていてSQLServer内部で何が起きているのかをとりあえず記録にとるってことからとりあえず。  &lt;p&gt;で、実際にギドラとおろちで動かした結果。やっぱおろち、遅い、つか、&lt;font color="#ff0000"&gt;んんん？止まってないか？こいつ？ &lt;/font&gt; &lt;p&gt;　SQLServerには利用状況を表示できる画面があるのだけれど、そこには、この問題のSQLを実行しようとしているプロセスがいる。こいつが延々とRunnableとSuspendを繰り返していたのだけれど、ProfilerにはそのSQLのSQLｓｔｍｔSTARTが表示されていない。さらにProFiler画面をよく見てみると、ScanStarted/Stopedを延々と繰り返していて無限ループっぽい動き。んでもって、もつっと利用状況画面から問題のプロセスをあけてみると、件のプロセスではSch-SとXがどばーーっ！&lt;br&gt;&amp;nbsp; つまり、確かにSch-S（SchemaScan）してるんだよね。ProFilerの動きとあってる。SQLServerにしてみたら、実行プラン作るために必要な情報をScanしてんのにうまく情報を取れなくて、諦めないでひたすら仕事。探し物はナンですか～♪と見てみると、微妙にロック要求（Ｘ）が出てる、そのオブジェクト。つまり、自分で自分にロックして自分で自分を探してる、それなんて自虐？。クラスタインデックスオブジェクトでガッツリロック掛かってんじゃん、インデックスよめねーよ！おろちの首、絡まってます～（笑）。そのせいで恐ろしく時間がかかっていたわけだね。その他はまぁらくちん♪ってカンジで動いてくれてたのに。  &lt;p&gt;　で、その止まっているSQL  &lt;p&gt;&amp;nbsp;&lt;font color="#008000"&gt;&lt;strong&gt; UPDATE D SET D.ID = S.ID FROM HOGE1 D , (SELECT　A1,A2,A3, ROW_NUMBER over (Order by A1 ) as ID FROM HOGE1 WHERE A4 is null ) S WHERE D.A1 = S.A1 AND D.A2 = S.A2 AND D.A3 = S.A3&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;br&gt;&amp;nbsp; みたいな、自テーブルのある条件で連番したレコードの番号で自テーブルのIDをセットする、みたいな自虐なUPDATESQLだったのさ。該当レコードは数万ってとこかな。クラスタインデックスはA1,A2,A3。うん、勘の良い人っつか、某パパさんとかにはこの辺りでもうすでにネタばれだと思うんだ。&lt;/p&gt; &lt;p&gt;&lt;br&gt;&lt;strong&gt;&lt;font color="#800080"&gt;&amp;nbsp; でもね、当時の私はここで、んじゃ、このオブジェクトロックはずせば良いんじゃね？としか考えなかったわけ（笑）＜単純な胡桃脳ｗ&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;br&gt;　ああ、地獄のはじまりだったさ（笑）&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/esten/aggbug/132463.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>片桐　継（Tugu Katagiri）</dc:creator><title>やまだのおろちvsキングギドラ　FinalWars予告編</title><link>http://blogs.wankuma.com/esten/archive/2008/04/08/132295.aspx</link><pubDate>Tue, 08 Apr 2008 23:32:00 GMT</pubDate><guid>http://blogs.wankuma.com/esten/archive/2008/04/08/132295.aspx</guid><wfw:comment>http://blogs.wankuma.com/esten/comments/132295.aspx</wfw:comment><comments>http://blogs.wankuma.com/esten/archive/2008/04/08/132295.aspx#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://blogs.wankuma.com/esten/comments/commentRss/132295.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/esten/services/trackbacks/132295.aspx</trackback:ping><description>&lt;p&gt;えーっと、つまりですね……いちおの解決はしました。&lt;/p&gt; &lt;p&gt;キーワードは、「インデックス」そして「トランザクション」&lt;/p&gt; &lt;p&gt;詳しく書くと時間かかるので、きっちりまとめてからアップしようかと思っています。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;にしても、深いわ～、.NetFrameworkのプログラミングって……（遠い目）&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/esten/aggbug/132295.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>片桐　継（Tugu Katagiri）</dc:creator><title>マーズアタック！ MARS ATACK!</title><link>http://blogs.wankuma.com/esten/archive/2008/03/26/129657.aspx</link><pubDate>Wed, 26 Mar 2008 00:01:00 GMT</pubDate><guid>http://blogs.wankuma.com/esten/archive/2008/03/26/129657.aspx</guid><wfw:comment>http://blogs.wankuma.com/esten/comments/129657.aspx</wfw:comment><comments>http://blogs.wankuma.com/esten/archive/2008/03/26/129657.aspx#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://blogs.wankuma.com/esten/comments/commentRss/129657.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/esten/services/trackbacks/129657.aspx</trackback:ping><description>&lt;p&gt;&lt;font color="#808080"&gt;あー、それなんて六神合体？＜違っ&lt;/font&gt;  &lt;p&gt;今は、やまだのおろちの何が悪いねん、ギドラの何が強いねん、と模索のための調査中。&lt;font color="#00ffff"&gt;引力光線でも出とんのかマヂで。&lt;/font&gt;トレースとってパフォーマンスログとって、いっぱいいっぱいの数字をEXCELで一覧にしつつ脳みそがコネコネしてます。そろそろグルテンが粘りそうです。  &lt;p&gt;&lt;font color="#ff00ff"&gt;で、Ｘ星人な気分で妖星ゴラスを目の前に、片桐はここでガス抜きする（笑）、いや、させてください（おいこら） &lt;/font&gt; &lt;p&gt;判ったのは、おろちがまだギドラに圧勝していた頃（まちがっても木下藤吉郎ではない）、確かに接続プロセス番号（SPID）は一つだけだった。&lt;font color="#ff0000"&gt;つまり単純に考えると、仕事のためにSPIDを増やして処理させることはギドラにとっては高速化の道であったのに、おろちにとっては鈍足化の道だったって事になる。&lt;/font&gt;まぁたぶん、色んな原因要素があるのだろうけれども、ここは単純な結果論から責めるとそうなるｗ。&lt;font color="#ff0000"&gt;ギドラでは確実にできていた仕事が、おろち上においてギドラとの相対速度で処理出来なくなった理由がSPIDの増殖にあるのなら、やはりそれはMTAの大罪、SPIDを増やして処理をすることでパフォーマンスが劣化した、という結論になってしまうのだが&lt;/font&gt;、周りはそもそもそれを認めない（おろちが早いに決まってんだろう！　８ＣＰＵだぜ？　めもりすっげーんだぜ？　ＭＴＡなんだぜ！　並列化なんだぜ！的に）&lt;/p&gt; &lt;p align="center"&gt;&lt;br&gt;&lt;font color="#008000"&gt;&lt;strong&gt;でも、ここで疑問。&lt;/strong&gt;&lt;/font&gt;&lt;br&gt;&lt;/p&gt; &lt;p&gt;まず、&lt;font color="#000080"&gt;最初に組んだプロトタイプは、Endxxxxシリーズを使った、ただのＡＤＯ非同期アプリだった。&lt;/font&gt;こいつがおっそろしく処理が早かったのがそもそもの始まり。ベストタイム７分52秒をたたき出したのはこの形式だったから。で、これに調子こいてそこから規模？が大きくなり、ちいさなプログラムがいつのまにかMTAのスレッドクラスに成長し、スレッド処理とは何ぞや的鎧クマーな世界が展開、気がつけば釣られ踊らされてしまったぷろぐらま♪ってっゆっかー♪そうゆうことで～♪こっちに戻ってきたら、他人～？みたいな～？（壊）&lt;br&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;MTAアプリで動かすのと、ADO非同期メソッドで動かすのと何が違うのか？　恐らくはそこが今回の一つのポイントだと思ってて、これをうまく検証、切り分けられれば何かがわかる予感はしてる。&lt;/strong&gt;&lt;/font&gt;でもそこまでサンプル作ってる余裕がない（＾－＾；；　でも、そんな中にあっても、実は今、（こんなこともあろうかと）そういう抜本処理方式変更対応を抜きにしてできる限りの範囲で片桐がさらに育て上げているギドラのプログラムは、初代ギドラの約1.5倍の処理速度が出ている。これは実は、&lt;/p&gt; &lt;ul&gt; &lt;li&gt;スキーマバインドビューの生成タイミングを変更&lt;/li&gt; &lt;li&gt;クラスタインデックスの列項目と非クラスタインデックスの付加列の見直し&lt;/li&gt; &lt;li&gt;サーバーのパラレルしきい値を変更&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;をしているだけのバージョン。サーバーオプションはカンタンにいじる事がゆるされないのでこれはまぁ忘れるとしても、&lt;font color="#0000ff"&gt;ビューとインデックスの見直しだけでも効果があることがわかっているにも関わらず、実際にその処理時間もトレース情報も提示しているにも関わらず、それは「ユーザーとの仕様取り決めに無いから」と却下されており、片桐苦境。&lt;/font&gt;では、仕様変更についてネゴを取れるように計るのかといえば、これも却下。まぁ諸般オトナの事情ってヤツだね。先に仕様書だしちってるからｗ &lt;/p&gt; &lt;p&gt;ようするにだ、カンタンに言えば、おろちに新しいプログラム処理を入れる＝プログラムを置き換える＝理由が必要→ギドラがおろちより早いという事実を表に出さねばならない、という図式が目の前にあり、問題をややこしくしているというわけだ。ギドラ＞おろちの原因を突き止め、&lt;a href="http://blogs.wankuma.com/esten/archive/2008/03/04/126071.aspx" target="_blank"&gt;いつかのＮＵＬＬ事件を引き起こしてくれた人&lt;/a&gt;向けに納得できる資料を作り上げて会議を設けて説得し、はじめて、何か働きかけられるってことらしいんだな（遠い目）  &lt;p&gt;&lt;font color="#008080"&gt;なんか、ちめーてきなバグでないかなー。そしたらガサーッと入れ替えてやるんだが＜おい&lt;/font&gt;  &lt;p&gt;&lt;strong&gt;てなわけで、この戦い、恐らくは長いと思う。&lt;/strong&gt;いっそヴァルハラまで持ってくかー？　&lt;br&gt;でもそこはほら、&lt;a href="http://blogs.wankuma.com/esten/archive/2008/03/04/126071.aspx" target="_blank"&gt;危機迫る納期越えの記憶～♪失意にのまれ立ち尽くす狂おしき日々～♪&lt;/a&gt;  &lt;p align="center"&gt;&lt;font color="#008000"&gt;&lt;strong&gt;閑話休題&lt;/strong&gt;&lt;/font&gt;  &lt;p&gt;&lt;u&gt;そんな中、みつけたのが、MARS。（やっとタイトルの話らしい）&lt;/u&gt;  &lt;p&gt;MultipleActiveResultSets　というらしい  &lt;p&gt;くわしくは、作った人？のブログとか&lt;br&gt;&lt;a href="http://blogs.msdn.com/dataaccess/archive/2005/08/02/446894.aspx"&gt;http://blogs.msdn.com/dataaccess/archive/2005/08/02/446894.aspx&lt;/a&gt;&lt;br&gt;いつもの橙色のページとか&lt;br&gt;&lt;p&gt;むぅ、どんなかんじやろ。実装してみたら、ギドラで2分かかってた処理が２分掛からなくなってまた10秒ほど縮まりよったけれどもｗ　育て上げた新ギドラのプログラム、こいつが、やまだのおろちでどれだけのパフォーマンスをたたき出すのかは見てみたい。（本題終わり）  &lt;p&gt;でも今、片桐には、おろちを直接触る権限がない（つ＿；）&lt;br&gt;ボスに許可とって作業依頼書作ってスタンプリレーしなきゃならんのよ……  &lt;p&gt;&lt;strong&gt;-----業務連絡～&lt;/strong&gt;  &lt;p&gt;某対応のツールとして、Office2007を買っちまいました＜ぉ&lt;br&gt;所持金尽きたよ（笑）飯代がんばって倹約だよ、つか、オブ熱どーするよ、おいら（笑）&lt;br&gt;いや、何とかなるさ。金が無いなら稼げば良い（By楽俊）＜この言葉好きだｗ  &lt;p&gt;でもそれよかさらなる問題は、これを動かす事のできるマシンが我が家にいるのかどうか、って事　（＾－＾；；；；&lt;br&gt;PentuimDのメモリ640MBが最良スペックなんだけど、XP乗っけて使える？&lt;br&gt;昔にソラリス評価用に分捕ってきた&lt;font color="#800080"&gt;つぎはぎマシン&lt;/font&gt;で蓋もちゃんと閉まらん子なんやけど（＾＾；  &lt;p&gt;&lt;strong&gt;-----&lt;/strong&gt;  &lt;p&gt;いぢょ、やまだのおろちvsキングギドラ、キングギドラ圧勝の現実に凌駕している現場よりお送りしました。そして片桐は密かに、カイザーギドラを育成中（おい）  &lt;p&gt;あー、なんだかファイナルウォーズ見たくなってきた（笑）  &lt;p&gt;PS．&lt;br&gt;ええい、中ボスはクリストファー・リーに決まっとる！　危ないときに「キター！」とお約束なのはイアン・マッケランのクマだろーが！クマ軍団率いて崖から駆け下りてくるんだよっ！！（握り拳）　などと思いながら見てしまった「黄金の羅針盤」ｗ　某ゲームの映画化だと真面目に信じた自分はオバカですｗ&lt;br&gt;それにしても洋画で描かれるオヤジ達って、んっとに良い仕事するよなぁ（笑） &lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/esten/aggbug/129657.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>