プロが教える店舗&オフィスのセキュリティ対策術

ビューにて下記のように設定し「SQLの実行」は指定通りソート
されましたが、「ビューを開く」では、ソートされずテーブルの
並びのままでした。

SELECT TOP (100) PERCENT 端末コード, 端末番号
FROM dbo.T_端末
ORDER BY 端末コード

そこで、下記のように設定を変更したところ「ビューを開く」でも
ソートされるようになりました。

SELECT TOP (1000) 端末コード, 端末番号
FROM dbo.T_端末
ORDER BY 端末コード

TOP (件数) に全データ数以上を指定すれば機能するのは解りますが
「ビュー」とはそんな使い方なのでしょうか?

A 回答 (4件)

ビューを単純に照会したときにORDER句を切らなくても希望する並び順でSELECTできれば、運用上は便利なことが多いです。



そのため、SQL Serverでは昔からTipsでTOP 100 PERCENTで並び替える方法が認識されていました。
(Tipsとある通り、普通はViewの外でOrder切ります)
ただし、SQL Server 2005になって、TOP 100 PERCENTは「並び替えの必要なし」とオプティマイザが判断するように仕様が変更されてしまいました。そのため、SQL Server 2005ではTOP 100 PERCENT句をViewに切っても並び替えは起こりません。

それだけなら分かりやすいのですが、やはりこの技を使っていた人が多かったためでしょうか。SP2の後の累積パッチ「SP2の累積プログラムその2」でこれを修正するモジュールが提供されています。
SP2には入っていないし、わざわざ当てる人も少ないと思うので、次のSP3が出たとして、それ当てた時からTOP 100 PERCENTが効くようになるでしょう。

ちなみにSQL Server 2008でも初期バージョンではTOP 100 PERCENTが効かず、累積パッチが提供されています。

ということで、そのようなビューの使い方は正しいアプローチではありませんが、SQL Serverの裏ワザの一つですと認識ください。
    • good
    • 0
この回答へのお礼

この数日悶々としていましたが、スッキリしました。
本当にありがとうございます。

ACCESSのMDBからADP+SQLに変えようとしているのですが・・・
このビューを表示させる(並び替える)のに、SELECTを使うとビューの
SELECTと合わせて二回のSELECTをサーバー側とクライアント側で
一回ずつ実行する訳ですよね?
効率が悪い様な気がして一回で済ませようと考えています。
そんな事はないのでしょうか?
(今は数は増えるかもしれませんが、基本的にビュー側でSELECTして、
ACCESS側はそのクエリーを表示させるように作ろうと考えています)

ビューだけでなく関数も同様ですのでパッチをあてたいのですが、
SP2の後の累積パッチ「SP2の累積プログラムその2」を見つける事が
出来ません、所在を教えて頂けると助かります。

お礼日時:2008/10/22 17:38

>

http://support.microsoft.com/kb/936305/
↑の先頭にある「修正プログラムのダウンロード」だと
64bitの環境しかありません、32bitのパッチは何処にあるのでしょうか?

これは気づきませんでした。32bit版だけ提供を打ち切っているのですね。その場合は累積プログラム3以降を使えばよいです。
http://support.microsoft.com/kb/939537/
ちなみに累積プログラムは文字通りそれまでのパッチが含まれます。
(すでに累積プログラムは9まで出ています)

>ビューは細工をせずに使い、細工する場合はテーブル値関数を使った方がいいと言うことでしょうか?
基本的にはその通りです。もし極力すべて(抽出も並び替えも)をサーバ側のオブジェクトに含めて処理してしまい、Accessは表示に徹するという考えなら、むしろストアドプロシージャを使う方がよいと思います(TOP 100 PERCENTをあてにする必要もなくなりますし)。

まあ、adpとの相性やそれ以外の使い勝手もあるでしょうから一概にはいえませんが。まあいろいろ試してみてください。
    • good
    • 0
この回答へのお礼

深夜の回答ありがとうございました。

結果を報告しますと、2をDLしてインストールしようとしたのですが、
更新する項目にチェックが入れられず、結局9をDLしてインストール
しました。
しかし、改善はされませんでした。

あれこれ変なパッチをあてようとしたのが原因だと思います。
現在は180日の評価版を使っていますので、サーバーを導入する時は
この辺を注意して作業します。
ビューについては教えていただいた方法で検討する事にします。

本当にありがとうございました、今後も質問することが多々あると思いますが、
何卒よろしくお願いします。

お礼日時:2008/10/23 11:25

ビューの中にORDERを切ると、そのビューを照会するたびにORDERが実行されますので、基本的には非効率です。


たとえば、毎回Accessで抽出するデータは数十件なのに、テーブルには数万件のデータが入っているケースを考えてみてください。
テーブル関数ならば結果を絞って返すこともできますが、ビューの場合は本来なら数十件の並べ替えで済むところを、データベース側で毎回数万件の並べ替えを行うことになりかねません。

従って、常に全件近く戻す場合を除いてはビューの中にはORDERを切らない方がいいと思いますよ。

なお、累積プログラム2は以下です。
http://support.microsoft.com/kb/936305/
累積プログラムはSPに含まれるまでは、基本的に自己責任で当てると思った方がよいです。十分確認してからの適用をお勧めします。
    • good
    • 0
この回答へのお礼

何度も回答いただきありがとうございます。

あっちこっち探したのですがスキル不足で見つかりませんでした。
http://support.microsoft.com/kb/936305/
↑の先頭にある「修正プログラムのダウンロード」だと
64bitの環境しかありません、32bitのパッチは何処にあるのでしょうか?

> ビューを照会するたびにORDERが実行されますので非効率です。
ビューは細工をせずに使い、細工する場合はテーブル値関数を
使った方がいいと言うことでしょうか?
(イマイチビューと関数の使い分けが理解できておりません)

お礼日時:2008/10/23 00:49

>「ビュー」とはそんな使い方なのでしょうか?


の意図するところはよくわかりませんが..

ビューを使用する目的としては、
セキュリティ上、全データでは無く一部のデータを見せるために使用するのが一般的ではないかと思います。(元のテーブルはセキュリティで制限して直接見えない様にして、ビューだけを見せる様にする)
または
よく使用する条件でビューを作成して使用する。

質問の例の、 TOP (100) PERCENT は意味が無いですね。
TOP句は書く必要がありません。
二つ目は、端末コードの若い順に1000行を選択する意味になります。

この回答への補足

ありがとうございます。 もう少し教えて下さい。

> TOP (100) PERCENT は意味が無いですね。
ORDER句があるとTOP句は自動で付与されてしまいます。
(本を読むと「ビュー」ではTOP句が無いときはORDER句も
指定できないからだと思います)
ただ、TOP (100) PERCENT だと並び替えされないのです。

「ビュー」で全件表示でソートするには最大件数以上の行数を
指定しないとソートできないのでしょうか?

TOP (100) PERCENT・・・並び替えしない
TOP (1000)・・・並び替わる

補足日時:2008/10/22 15:23
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す


このQ&Aを見た人がよく見るQ&A