ヘッダーイメージ 本文へジャンプ
日記

2012年02月20日 21時21分
SqlServerの不思議
お客さんのところで SqlServer の 2005 を分散DBとして使っているのですが、ちょっと不審な動きをします

リンクサーバーと言う、ORACLE で言うデータベースリンクを作ってそれ経由でリモートデータベースにアクセスできるのは同じなんですが、それをローカールテーブルとJOINして読ませると、エラーになることがあるんです

「このトランザクションのリソース マネージャとして Microsoft 分散トランザクション コーディネータ (MS DTC) に登録できませんでした」
とか
「トランザクション (プロセス ID XX) が、ロック | 通信バッファ 個のリソースで他のプロセスとデッドロックして、このトランザクションがそのデッドロックの対象となりました。」
とか

どちらも、リモートテーブルとJOINしたSQLを実行したときになっています

最初は意味がわからなかったんですが、傾向を見ているとデータ量が多くなってくると出安くなりますし、統計の更新をすると動くようになったりするので、リモート側のタイムアウトではないかと思うのですが、設定の変更ができるのか定かではないです

で、経験則ですが SQLでリモート側のテーブルをサブクエリーにすると動くことが多いです

SELECT ・・・・・・
 FROM ローカルテーブル名
 LEFT JOIN リモートテーブル名
  ON リモートテーブルの検索条件いろいろ
 WHERE ローカルテーブルの検索条件いろいろ

とか書いてるところを

SELECT ・・・・・・
 FROM ローカルテーブル名
 LEFT JOIN ( SELECT * FROMリモートテーブル名 ) AS リモートテーブル名
  ON リモートテーブルの検索条件いろいろ
 WHERE ローカルテーブルの検索条件いろいろ

ってやると動いたりするんですよ!

また、分散パーティションビューの分散キーの種類が3つだったんで、分散のキーを指定したSQL展開してUNIONしたりとか

なんで?って感じです

でもって、上記のようにSQLを修正すると大概の場合検索が速くなるんですよね!
なので、タイムアウトじゃないかなぁと思っているんですが・・・



・SqlServer2008Express のインストール
・リモートPCからSQLServerに繋ぐ
・SqlServer壊してしもた・・・
・SqlServerの不思議
・SQLServer のチューニング
・SQLSERVER のリストア
・NetFx3 ってなんだ?
・RDゲートウェイを入れてみました
・Windows上のApcheでASP.NETを動かす
・SQLServer に、大量データのインサート
・Windwos で mono
・Windows10 のシステムイメージの作成
・SQL Server 2017 RC2 評価期限切れ

カテゴリー:日記
目次へ戻る


フッターイメージ