検索すると、びっくりするぐらい遅い。ado.netのデフォルトタイムアウト30秒が発生しない方が稀。
みてみると、インデックスが効かないことが原因。
つい最近書いた検索条件がダメだったらしい。
あの記事に追記しておきます。
2009年7月25日土曜日
2009年7月4日土曜日
SQL文で失敗 の続き
前の記事のやつは、SQL SERVER 2005では、APPLYを使えばよさそう。
こんなテーブルがあったとして、
(下線は主キー)
TBL_A(ID,NAME,ADDRESS),
TBL_B(ID,START_DATE,JOB)
SELECT A.NAME, B.JOB_NAME
FROM
TBL_A AS A
OUTER APPLY
(SELECT TOP(1) JOB AS JOB_NAME ,ID FROM TBL_B AS BB
WHERE A.ID=BB.ID ORDER BY START_DATE DESC) AS B
CROSS APPLYだと、左入力のみに発生するデータを検索できないためOUTER APPLYです。
こんなテーブルがあったとして、
(下線は主キー)
TBL_A(ID,NAME,ADDRESS),
TBL_B(ID,START_DATE,JOB)
SELECT A.NAME, B.JOB_NAME
FROM
TBL_A AS A
OUTER APPLY
(SELECT TOP(1) JOB AS JOB_NAME ,ID FROM TBL_B AS BB
WHERE A.ID=BB.ID ORDER BY START_DATE DESC) AS B
CROSS APPLYだと、左入力のみに発生するデータを検索できないためOUTER APPLYです。
SQLの検索条件メモ
検索SQLのWHERE句:
条件1:
検索条件の指定有無@Aが指定されていなかったら(=NULL)検索条件を指定しない。指定されていたらCOL1と比較する。
WHERE
...
(@A IS NULL OR COL1 = @A)
条件2:
検索条件のAND/OR切替@Aが1の場合COL1=@B AND COL2=@C,@Aが2の場合COL1=B OR COL2=@Cを指定する。
WHERE
...
((@A = 1 AND (COL1 = @B AND COL2 = @C)) OR
(@A = 2 AND (COL1 = @B OR COL2 = @C)))
条件3:
ソート順 @Aが1ならCOL1,COL2 @Aが2なら COL3 降順,COL4
ORDER BY
CASE @A WHEN 1 THEN ROW_NUMBER() OVER (ORDER BY COL1,COL2)
WHEN 2 THEN ROW_NUMBER() OVER (ORDER BY COL3 DESC,COL4)
END
こんなのでうまくいくのかな?
ダメだった。条件1をやると、インデックスを使ってくれない。開発者には、「処理中は固定のものだから速度は遅くならないはず」と答えたのにこのありさま。。。あ~あ、またひとつメッキがはがれた感じ。SQL Server2005はそんなに賢くないのかな?
さらにダメダメでした。
全部だ~め。
理由は、非効率なクエリプランができるためです。で、なんでそうなるかというと、、、最近買ったインサイドSQL Server2005に書いてありました。あの本では、ダメな理由と、代替策として、パラメタライズドクエリを組み立てて実行する方法が紹介されていました。
あ~あ。
条件1:
WHERE
...
(@A IS NULL OR COL1 = @A)
条件2:
検索条件のAND/OR切替@Aが1の場合COL1=@B AND COL2=@C,@Aが2の場合COL1=B OR COL2=@Cを指定する。
WHERE
...
((@A = 1 AND (COL1 = @B AND COL2 = @C)) OR
(@A = 2 AND (COL1 = @B OR COL2 = @C)))
条件3:
ソート順 @Aが1ならCOL1,COL2 @Aが2なら COL3 降順,COL4
ORDER BY
CASE @A WHEN 1 THEN ROW_NUMBER() OVER (ORDER BY COL1,COL2)
WHEN 2 THEN ROW_NUMBER() OVER (ORDER BY COL3 DESC,COL4)
END
こんなのでうまくいくのかな?
ダメだった。条件1をやると、インデックスを使ってくれない。開発者には、「処理中は固定のものだから速度は遅くならないはず」と答えたのにこのありさま。。。あ~あ、またひとつメッキがはがれた感じ。SQL Server2005はそんなに賢くないのかな?
さらにダメダメでした。
全部だ~め。
理由は、非効率なクエリプランができるためです。で、なんでそうなるかというと、、、最近買ったインサイドSQL Server2005に書いてありました。あの本では、ダメな理由と、代替策として、パラメタライズドクエリを組み立てて実行する方法が紹介されていました。
あ~あ。
2009年7月1日水曜日
インサイドSQL Server2005 3冊目
今回のは、T-SQL編。
「T-SQL Querying」と「T-SQL Programing」からちょっとづつ取って1冊にまとめたとのこと。
どうせなら2冊の翻訳本がほしかったところだけど、この本と同時発売の「プログラミングSQL Server2008」があるところをみると、時間制約のため仕方がなかったのかもね。
ちなみに、今回のは6600円でした。ページ単価でも本の値段でも、前2冊のインサイドSQL Server2005と比べて一番高いです。
「T-SQL Querying」と「T-SQL Programing」からちょっとづつ取って1冊にまとめたとのこと。
どうせなら2冊の翻訳本がほしかったところだけど、この本と同時発売の「プログラミングSQL Server2008」があるところをみると、時間制約のため仕方がなかったのかもね。
ちなみに、今回のは6600円でした。ページ単価でも本の値段でも、前2冊のインサイドSQL Server2005と比べて一番高いです。
2009年6月21日日曜日
SQL文で失敗
こんなテーブルがあったとして、(下線は主キー)
TBL_A(ID,NAME,ADDRESS),TBL_B(ID,START_DATE,JOB)
各人の名前と直近の仕事名を記述するSQL文で、プログラム仕様書では以下のように書いてしまいました。
SELECT
A.NAME, B.JOB_NAME
FROM
TAB_A AS A JOIN (SELECT TOP(1) JOB AS JOB_NAME ,ID FROM TAB_B AS BB
WHERE A.ID=BB.ID ORDER BY START_DATE DESC) AS B
ON
A.ID=B.ID
で、プログラマから、できませんよ。という冷たいお言葉。
JOIN句で、同列に配置したテーブルと副問い合わせでは、副問い合わせの中で、利用できないみたい(斜体の部分がバインドできないエラー)。副問い合わせの中でTOP 1 で絞り込んでいるので、副問い合わせの中で条件を入れないといけないのだが、さて困った。
追記:
そうそう、以下のように書けば言いなんていわないでね。TAB_Bで今回引っ張ってきたJOBをキーに別の2テーブルから合計4列抽出するSQLをデフォルメして説明しているのだからね。
SELECT
A.NAME,A.AGE,
(SELECT TOP 1 JOB FROM TAB_B AS B WHERE A.ID=B.ID ORDER BY START_DATE DESC)
FROM TAB_A AS A
TBL_A(ID,NAME,ADDRESS),TBL_B(ID,START_DATE,JOB)
各人の名前と直近の仕事名を記述するSQL文で、プログラム仕様書では以下のように書いてしまいました。
SELECT
A.NAME, B.JOB_NAME
FROM
TAB_A AS A JOIN (SELECT TOP(1) JOB AS JOB_NAME ,ID FROM TAB_B AS BB
WHERE A.ID=BB.ID ORDER BY START_DATE DESC) AS B
ON
A.ID=B.ID
で、プログラマから、できませんよ。という冷たいお言葉。
JOIN句で、同列に配置したテーブルと副問い合わせでは、副問い合わせの中で、利用できないみたい(斜体の部分がバインドできないエラー)。副問い合わせの中でTOP 1 で絞り込んでいるので、副問い合わせの中で条件を入れないといけないのだが、さて困った。
追記:
そうそう、以下のように書けば言いなんていわないでね。TAB_Bで今回引っ張ってきたJOBをキーに別の2テーブルから合計4列抽出するSQLをデフォルメして説明しているのだからね。
SELECT
A.NAME,A.AGE,
(SELECT TOP 1 JOB FROM TAB_B AS B WHERE A.ID=B.ID ORDER BY START_DATE DESC)
FROM TAB_A AS A
今年は論文部門かな?
社内のものです。前回は、プロコンを出しましたが今回は、論文。
ねたは、、、、、構成管理とアプリケーションビルド環境構築の狙い。
理由は、2期連続の構成管理担当になったから。
次点は、Webアプリのメモリ不足不具合の現象と対応。
こちらは私が(種を振りまいただけで)刈り取りしていないので、次点扱いです。
ねたは、、、、、構成管理とアプリケーションビルド環境構築の狙い。
理由は、2期連続の構成管理担当になったから。
次点は、Webアプリのメモリ不足不具合の現象と対応。
こちらは私が(種を振りまいただけで)刈り取りしていないので、次点扱いです。
2009年6月6日土曜日
カスタムコントロールにascxファイルを作る理由がわからない。
asp.netのWebControlのカスタマイズで、ユーザコントロールっていうものとカスタムコントロールっていうのがあって(他にもあるかもしれないがとりあえずここではこの2つ)両方を開発することがあったのですが、ソースを見てみると、どちらもascxファイルを作ってあった。ただユーザコントロールは派生元がUserControlなのに対し、カスタムコントロールの派生元がLabelなどに置き換わっていました。
なので、ソリューションエクスプローラにascxが表示されるのだけれど、本来のユーザコントロールと違って、カスタムコントロールの場合はソリューションエクスプローラからドラッグ&ドロップでページに配置する使い方はできない。(UserControlから派生していないので)
で、もうちょっと調べてみたらascxのファイルは使っていないみたい。
なんでカスタムコントロールにascxを使ったのかと開発者に聞いてみたら、Webパーツだからとのこと。
使ってもいないファイルなのに(ascxファイルなので使っているaspxと同じように)本番環境に入れてしまうのだけれど、別に有ったからといって問題にならないからいいのかな?
カスタムコントロールのクラスライブラリ化する際にascxのファイルが問題になりそうだけど、今回のものはカスタムコントロールのクラスライブラリ化をしないみたいだし、こちらも問題ないか。
でも、やっぱりなんでascxファイルを作ったか、そのメリットも全然わからない。なんでだろう?
なので、ソリューションエクスプローラにascxが表示されるのだけれど、本来のユーザコントロールと違って、カスタムコントロールの場合はソリューションエクスプローラからドラッグ&ドロップでページに配置する使い方はできない。(UserControlから派生していないので)
で、もうちょっと調べてみたらascxのファイルは使っていないみたい。
なんでカスタムコントロールにascxを使ったのかと開発者に聞いてみたら、Webパーツだからとのこと。
使ってもいないファイルなのに(ascxファイルなので使っているaspxと同じように)本番環境に入れてしまうのだけれど、別に有ったからといって問題にならないからいいのかな?
カスタムコントロールのクラスライブラリ化する際にascxのファイルが問題になりそうだけど、今回のものはカスタムコントロールのクラスライブラリ化をしないみたいだし、こちらも問題ないか。
でも、やっぱりなんでascxファイルを作ったか、そのメリットも全然わからない。なんでだろう?
登録:
投稿 (Atom)