Microsoft SQL Server 総合スレ 12
alter view ではtime outはよくある
使ってるviewをalterするとデットロックする sqlの中の括弧の対応関係を色付けしてくれる機能ってssmsであります? >>539
deadlockとtimeoutはエラーメッセージが違う 単なるタイムアウトをデッドロックとか言う人多いよね
まあSQL Serverはalter viewもトランザクション内でできたはずだから
デッドロックすることもなくはないんだろうけど 排他ロックとデッドロックを間違えるレベルはひどいなw csvファイルでテーブルをキーが一致したらレコード洗い替えたい。バッチファイルとか実行すると作動するようにしたい。
可能ですか? Accessはもう諦めたのか?
そんなんじゃ何一つ出来ないぞ sqlcmdをサーバはインストールしてるけど
クライアントはしてない場合にも
実行できる方法ない? >>550
何らかの方法でサーバーにログインして実行すればいいんじゃね? >>550
SQLServerのドライバはOS標準で組み込まれてるんだから、バッチ処理で良いんならJSやVBSを使えば良いんじゃないの
PSよりはVBSの方が情報が多いように思うし、OFFICEが使えるならVBAでも良いんじゃないの
というかOFFICEが入ってるならMSクエリとかが使えるか
>>553
クライアント環境にはできるだけツール類はいれたくないだろ >>554
>クライアント環境にはできるだけツール類はいれたくないだろ
DBを直接操作する人間のクライアントにsqlcmdとかSSMSが入ってないほうが意味がわからないんだけど?
まさかエンドユーザーにやらせようとしてんの? >>555
そう
一般利用ユーザーにテーブル更新させる
別にそういうとこあるでしょ >>556
そういうのは普通アプリケーション経由で処理するから
エンドユーザーのクライアント環境でバッチを流したりはしない
入力データが不正だったり更新が競合したりしても
エンドユーザーレベルのリテラシーで対応できるようなものを作る
各ユーザー専用のテーブルのみ更新するような場合で
データが壊れても再作成すればいいような重要度の低いものなら
そういうやり方もありえるのかもしれないが
問い合わせが増えるだけだからまずやらない >>557
クライアント側のアプリケーションだと
レコード削除はできない制約あるパッケージとか多くない?
スクラッチならやるけど クライアントアプリが制限されているから
BATでやりたいと……
なるほど!理解した! データの洗い替えをユーザーにやらせるのは聞いたことないな
マスタメンテで複数件一括更新することを洗い替えと呼んでるのかもしれないが トランザクションなら本来の意味での「洗い替え」っぽいけど
だとしたらユーザー入力のcsvファイル使って
ユーザー環境でバッチ実行させる意味がますますわからん
わかる人いたら解説してくれ こういう当たり前のアプリケーション設計知識って実務経験以外で手に入れるのは難しいのかもね >>564
話を聞いてて、うちの会社でも同じような例があった
本社のシステム部門がDBを管理していて、事業部のシステム部門がマスタを更新したいって例があった。
本社部門は、テーブルを直接操作する権限は与えたくないんだけど、更新作業を自分たちでやりたくない、インターフェースのアプリを作りたくない
というような流れ、本社部門がしっかり作りこめば良いだけなのにね システム部門がユーザーの場合は全然話が違うでしょ
やり方はいろいろ有るけど単純なのはファイル連携で定期スケジューリングしたバッチジョブ流すだけ
エラー時は入力データを用意した関係者にエラー内容を通知するようジョブを組んでおけば十分なので
ユーザーインターフェースを用意しなきゃいけないような話ではない
自分たちが管理してないDBを直接SQLで更新したいってのも論外だし
事業部のシステム部門があるような大企業でマスタの更新バッチすら作らないような本社システム部門はかなりヤバい てか、事業部がどんな大きさなのかわからんけどシステム部門を抱えてるレベルなら事業部のDB持ってないの?
コンプライアンスとかで本社のシステム部門が統括管理してるのかな?
それであっても簡単なメンテツールを事業部システム部門が作ればいいだけだと思うけど… updateなのに重複するキーを挿入できませんと怒られる
そんなこと有り得るのかな キー値を書き換えた
トリガーでなんかした
まあ他にもあるかもしれんが、ありえる >>567>>568
おっしゃる通りです
日立とかIBMのホスト系しか扱ったことがない方が多くて、人員も世代交代に失敗していて古いシステム構成のまま改悪が続いてる
事業部側も人員がいなくてシニア契約社員が主戦力になってるような会社なんです
若い有能な人は見切りをつけて転職していく
個々の担当者はそれなりなんだと思うけど、経営がちょっと抜けてる感じでどうしようもない >>570
ありえました
と同時に絶望しました
もう作った人に修正させてと思いました 付加列インデックスって関数の引数に使ってくれる?
where句、select句どっちも使う、使わない、どっちかしか使わないとかわかる資料ってどっかにあるかな? SQL Serverは関数インデックスをサポートしてないから
付加列インデックスかどうかやkeyかnon-keyかに関係なく
関数の引数に使った場合はindex seekにはならないよ
computed columnでkeyならwhere句で使える
non-keyはwhere句では使えない >>575
やっぱそうだよね。
なんか遅いクエリの実行プラン確認したときに出てきた足りないindexの中の付加列にisnull関数噛ませてるカラムが出てたんでもしやと思ったんだけど。
バージョンは2017です
ありがとうございました ん?
isnullってことはwhere句で使ってるんじゃないの?
であれば付加列インデックスの使い方間違ってる
あとちゃんとインデックス作っても
isnull自体にパフォーマンスの問題あるから違う方法に変えたほうがいいかもしれない >>577
そう。where句で使っていてselect句にはないカラムです。
付加列インデックスの使い方の件はわかってたんだけど、実行プランの足りないインデックスにisnull関数に噛ませてるカラムが付加列に入ったインデックスが出てきたんで、あれ思い違いしてたんかな?と思って質問させていただきました。
違う方法についてはよくある触りにくい、他の方法はコストがかかるってやつです。
まぁ、インデックスの追加も方法の一つとして、他の案も含めて考えます。 この一連のやり取りが理解できないのは俺だけか?
とりあえず、その他の条件が満たされるなら
関数の引数でも、付加列の目的である余計なキー参照はしなくて済むぞ >>579
分かりづらかったのならすまんね。
今回の質問は問題解決ではなく仕様確認になるのかな
とある遅いクエリ流したら実行プランの確認でこれが足りないよって言われたインデックスにwhere句のisnull関数の引数に使ってるカラムが付加列として出てきました。
関数の引数にインデックスのカラムは使えないと思ってたんだけど、付加列ならいけるの?ってことで質問しました。
とある遅いクエリの改善についてはどうでもいいです 使えないとはどういうことを言ってるんだ?
インデックスはってもそのカラムが使えなくなることなんてないぞ
実行時にそのインデックス使うかどうかはわからんがな
そのパターンでインデックス使って早くなるのは大体はキー参照しなくて済むパターン
だから通常のインデックス列ではなくて付加列で良いというお薦めだろう >>582
日本語下手でごめんね。
例えば、
create table AAAA
(
colmun01 char(4) not null
,colmun02 char(4) not null
,seq int not null
,first_date varchar(8) null
,last_date varchar(8) null
,primary key
(
colmun01
,colmun02
,seq
)
)
ってテーブルがあって
select colmun01
from AAAA
where colmun02 = 'BBBB'
and '20210401' between isnull(first_date, '00000000') and isnull(last_date, '99999999')
ってクエリを実行して実際の実行プランを確認したら
CREATE INDEX CCCC
ON DDDD( colmun02)
include(first_date,last_date )
が足りないんじゃない?
って出ました。
付加列の中のカラムはisnull関数の引数なんだけどなんで?
ってなったんで最初の質問になりました。
(WEBだけだけど)調べても出てこなかったんで
first_date、last_date が date型じゃなくてvarchar型 なのは許して。元のテーブルがそうなんで サジェストされてるインデックス追加すれば付加列としての効果はあるね
でもそもそもBETWEENの左側に固定値をもってくる書き方って有りなのかなぁ
isnull不要にしてfirst_data, last_dateをキーとしてインデックスはっても
Index Seekにはならないような気がするんだけど実際どうなんだろ >>585
付加列の効果あるんですか。
>でもそもそもBETWEENの左側に固定値をも>ってくる書き方って有りなのかなぁ
なるでしょっ、て思い込んでたんで改めて
isnull不要にしてfirst_data, last_dateをキーとしてインデックスはってfirst_data, last_dateのbetweenのみで実行してみたら、最適化の段階で大なり小なりに展開されてindex seekになってますね。実行プラン見る限りは ☓ isnull不要にしてfirst_data, last_dateをキーとしてインデックスはってfirst_data, last_dateのbetweenのみで実行してみたら
○ first_data, last_dateをキーとしてインデックスはってisnull不要にしたfirst_data, last_dateのbetweenのみで実行してみたら >>585
もうあんたの書き込みはネタとしか思えないんだけど? >>591
こだわっている理由というか、このクエリでなんでこの条件がパフォーマンス改善の候補として上がってきたのかの理由が知りたい。
自分の今持っている知識が間違っているのだろうけど、この付加列が入ってくる理由がわからないので
前にも書いたけど、元の処理のパフォーマンス改善自体はどうでもいい isnull関数を使っているから、他人には何を知りたいのかわからない。 インデックスに付加列しとけばインデックスの読み込みだけで済むからでしょう
付加列にないカラムを参照したらインデックス以外にテーブルも読み込みしないといけないから遅くなる インデックススキャンにしなければいけない→テーブル全体のインデックスを作る→このインデックスはいらないのでは? 付加列の話を出したものです。
一応簡易的にデータを作って確認してみたので結果を書きます。
環境:
Microsoft SQL Server 2017 (RTM) - 14.0.1000.169 (X64) Express Edition (64-bit)
on Windows 10 Pro 10.0 <X64> (Build 19043: ) (Hypervisor)
実施内容:
互換性レベル:SQL Server2017 のデータベース上で
create table AAAA
(
colmun01 char(4) not null
,colmun02 char(4) not null
,seq int not null
,first_date varchar(8) null
,last_date varchar(8) null
,primary key clustered
(
colmun01
,colmun02
,seq
)
)
の形のテーブルをAAAA〜EEEEの5つ作成。同一のデータを100万件投入
各々
CREATE INDEX IX_XXXX ON BBBB(colmun02)
CREATE INDEX IX_XXXX ON CCCC(colmun02) include(first_date, last_date )
CREATE INDEX IX_XXXX ON DDDD(colmun02, first_date, last_date )
CREATE INDEX IX_XXXX ON EEEE(first_date, last_date )
のindexを作成
各テーブルに対しての
select colmun01
from <テーブル名>
where colmun02 = 'BBBB'
and '20210401' between isnull(first_date, '00000000') and isnull(last_date, '99999999')
を1クエリでまとめて実行し実際の実行プランを確認 結果:
AAAA Clustered Index Scan となりクエリコスト30%
BBBB Clustered Index Scan となりクエリコスト31% ※作成したindexは効かず
CCCC IX_XXXX がindex Seek となりクエリコスト6%
DDDD IX_XXXX がindex Seek となりクエリコスト6%
DDDD IX_XXXX がindex Scan となりクエリコスト28%
となりました。
この結果からIndexのキー列、または付加列が関数の引数として使用されている場合もindexが効く場合があるようです
ちなみにBBBBテーブルの実行の際にヒント句でindexを強制した場合は
AAAA クエリコスト8%
BBBB クエリコスト81%
CCCC クエリコスト2%
DDDD クエリコスト2%
DDDD クエリコスト8%
となりました。 >>575の通りの理解だったので、なぜこのように動くのかがわかりません。
何か知っている方や理解に誤りなどありましたら教えていただけると助かります >>601
演算のパーセント表示だけで比較されてもわからんがな >>603
では、他にどのような情報がアレバ良いのですか? クエリコストの大小を比較したいなら各クエリ全体のコスト
コスト1000の6%と、コスト10の30%なら後者のほうが効率がいいからね
SET SHOWPLAN_ALL ON;
SET STATISTICS PROFILE ON;
SET STATICTICS IO ON;
↑この3つでそれぞれ表示される値の意味をdocs見て把握しておくといいと思う >>605
ありがとうございます。
ただ今回自分が知りたいことはコストはあまり関係ないんですよね。
違う結果になったことを明示するための情報としてコストを出したつもりでしたが下記の知りたいことからすると不要な情報でした。
すみません。
知りたいことは実行したクエリ
select colmun01
from <テーブル名>
where colmun02 = 'BBBB'
and '20210401' between isnull(first_date, '00000000') and isnull(last_date, '99999999')
のfirst_date,last_dateはisnull関数の引数なのになぜ付加列、またはindexのキー列が利用されて、index seekのみで解決されているのか?
になります。※1
元々indexのキー列、付加列は関数の引数や計算が含まれるとwhere句で利用されない(と思っていた)ため、CCCCテーブル、DDDDテーブルの実行はindex seek後にクラスター化indexのキー参照が起こると思っていました。
これはヒント句でindexの利用を矯正したBBBBの実行と同じ動きです。
一応テストした結果として、※1については解決できる場合があり、そもそもの自分の知識が誤っていることがわかりました。
ので「indexのキー列、付加列が関数の引数や計算が含まれてもwhere句で利用される」のはどのような場合か、明確な基準があるのかなどがわかれば教えていただければとおもいます。
一部表現が適切でなく伝わりにくい部分があるかと思いますが汲み取っていただけると助かります。 利用されないのはオプティマイザが利用しても効果がないと判断したからで、効果があると思えば利用する
それだけのこと
べつに引数や計算だろうと直接の比較だろうと同じなんだが >>606
column02だけでindex seekしてるのか
column02に加えてfirst_dateやlast_date含めてindex seekしてるのかseek predicatesで確認した? >>608
これでした。ありがとうございます。
index seekの中を確認したところ、column02のみがseekでisnull関数の引数になっているfirst_dateとlast_dateはwhereでの参照でした。
CCCCとDDDDのクエリからisnull関数を外したものの実行結果と比較していろいろ合点がいきました。
GUI上のindex seekの表示しか見ていない浅い確認でそれ以降の知識がなかったため、自力でここにたどり着くのは難しかったと思います。
あらためてありがとうございました。
ついでにで申し訳ないのですが、今まで実行プラン上でindex seek、またはindex scanになっていることを「indexが効いている」と表現していたのですが、これは一般的に間違っていますか?
質問の中で色々表現がおかしく、理解しづらい部分もあったと思いますので少しでも修正できればと思っております。 >>607
今迄はあなたと同じように「オプティマイザの気分」で済ませてたのですが、今回は少し突き詰めたかったのです SQLserverのハードを買い替えようと検討してもるんだけどストレージをSSDしても大丈夫か聞きたい。
SSDは書き込みの回数制限があり、頻繁な書き込みのあるSQLserverには向かないと昔聞いた事あったんだけど今は大丈夫か教えて下さい。 >>611
SQLserverに向かないってよりもアクセス頻度の問題のような気がするけど。
ssdって言ってもqlc,tlc,mlcのような種類もあるし。
ただ、前にベンダーに見積もりとった時に聞いたのは利用用途が中規模のwebサービスなら、5年位であればそんなに気にしなくて良いって言われた。(ここでのSSDの種類が何か、中規模がどの程度かは忘れた。参考にならずすまん)
ちなみにどんな利用用途なの?
社内用か、インターネットに公開してるサービスなのか(1日のアクセスはどの程度か)、それとも個人用か
個人用でもなければどこかのベンダーに話聞いちゃった方がいいかも >>612
アドバイスありがとう
用途は会社でデータウエアハウス的利用です。日次で基幹システムからデータ取得して蓄積するようなデータサーバです。
DELLの直販で買う予定でサーバ向けSAS接続のSSDだから大丈夫だと思う。
一応DELLに問い合わせしときました。 レプリケーションというのを初めて設定しているのですが
「スナップショットエージェントが起動していません」のMSGが
出てスナップショットが取れません。
これってSQL Server エージェントとは別物ですか?
SQL Server エージェントは起動しているのに…。
すみませんが、わかる方がいたら教えて下さい。 オブジェクト名'sysservers'が無効です。エラー208
これどういった調査をすれば良いのでしょうか? 将来のバージョンで廃止予定とかになってるけど、バージョンいくつ使ってるんだろうな 何をどうしたらそのエラーが出たのかと、エラーメッセージを正確にかけ サブスクリプションの新規ウィザードで
パブリケーションを選択して次へをクリックすると
先のメッセージと一緒に「パブリケーションの
情報が取得できません」のMSGが出て先に進めません。
SQL SERVER2008R2です。
2019の評価版で試すと問題なく設定できます。 パブリケーション側のバージョンが2008なのかな?
SSMSのバージョンを2008をサポートしてる古いやつで試すといいんでない? >>622
パブリケーション側が2008です。
SSMSのバージョンについては
全く頭にありませんでした
試してみます
ありがとうございました >>622
サブスクリプション側のSSMSをver10に変えたら出来ました。
本当にありがとうございました。 大したデータ量でもないのに「クエリの実行中にMemoryGrantを25秒間待機する必要がありました」との警告が出て処理が遅くなるんですが対処法はないでしょうか。
また値が1, (2 or 3), (4 or 5)でそれぞれ集計したいのですがどのようなSQLにすればいいのでしょうか >>625
>大したデータ量でもないのに「クエリの実行中にMemoryGrantを25秒間待機する必要がありました」との警告が出て処理が遅くなるんですが対処法はないでしょうか。
テーブルとインデックスの構成、クエリ内容、実行プランを確認して原因を突き止めてください
原因が分かったらテーブルやインデックスを変更したりクエリを変更して対処してください
>また値が1, (2 or 3), (4 or 5)でそれぞれ集計したいのですがどのようなSQLにすればいいのでしょうか
現在のテーブル構造と欲しい結果のイメージを提示してください >>625
> また値が1, (2 or 3), (4 or 5)でそれぞれ集計したいのですがどのようなSQLにすればいいのでしょうか
select
case when 値 = 1 then '1' when 値 = 2 or 値 = 3 then '2 or 3' when 値 = 4 or 値 = 5 then '4 or 5' end as 値,
sum(集計列) as 集計
from テーブル
group by
case when 値 = 1 then '1' when 値 = 2 or 値 = 3 then '2 or 3' when 値 = 4 or 値 = 5 then '4 or 5' end 開発サーバにいれるSQLServerのエディションをDeveloperにするの問題ないでしょうか
利用目的はシステム改修の開発単体テストから総合テスト、受入テスト
あとは本番サーバで不具合でたときの検証目的で使用するのは数名〜Max20人くらい
バージョンアップの準備してて、経緯不明なんですが開発サーバが今Enterprise入ってて変えて問題ないなら変えたい
本番はEnterpriseです >>625
MemoryGrantで待機ってメモリが足りてない
・SQLServer以外のプロセスがメモリ食ってSQLServerのメモリが小さくなってる可能性
→SQLServerの最大メモリ最小メモリの設定、SQLServerのサービスアカウントにメモリのページロックの特権がついてるか
・メモリめっちゃ使うクエリが同タイミングで動いてる可能性
→パフォーマンスモニタのBufferManagerカウンターで急激な変動がないか確認、動的管理ビューでその時間帯に動いてたクエリででかいのを調べる
・そのクエリがめっちゃメモリ食う
→これは626
昔使うメモリの計算に不具合あった覚えあるけど、あれは2008か2012くらいのSPで解消されてたような Express版は10GBまでは使用できるようですが、
10GBを超えそうだという警告などは設定できるのでしょうか?
定期的に使用領域を確認していないと、ある日突然なにもできなくなってしまうのでしょうか? >>630
このページにあるクエリを実行するスクリプトを作成し、タスクスケジューラで定期実行してみてはどうでしょうか
クエリの結果をもとに、自分で決めたしきいち値超えたら警告メールを送るような処理も加えると監視をほぼ自動化できそうですね >>630
ページの情報が抜けてた。。。
「データベースのデータとログの領域情報を表示する」でググってみてください ディスク容量を常に気にしていない運用という点が突っ込みどころなんだろうな >>631-632
ありがとうございます
クエリで問い合わせられるのなら、いろいろできそうです >>633
ディスク容量を常に気にしたところで役に立たないという点が突っ込みどころなんだろうなww >>636
どこにファイルが作られているのかを気にしてない時点でおかしんだけどな。 > どこにファイルが作られているのかを気にしてない
どこからそんな妄想が?w >>637
知らんのなら大人しくしとけよw
お前のオツムのほうがよっぽどおかしいぞ 今、自分1人で使ってるスタンドアロンのACCESS DBがクソ重くて激不安定なので
同じ事をSQL serverでやろうとしてるんだけど
1人でスタンドアロン使用の場合、Developer版を
「永遠に開発中」という設定にしとけばライセンス違反にならない? >>640
Expressを使わずにDeveloperを使わないといけない理由は? >>641
別にexpressでもいいんだけど
単にdevelopは制限が全くないのでこっち使おっかな、程度の事です >>640
止めとけ
素直にMySQLかPostgreSQL使え >>647
そんな理由で別製品にするなんて素人が言うことだろw SSMSでストアドのテストドライバ生成機能ってありますか?
※Sqldeveloperみたいな感じの、っていう表現で伝わりますかね
あるいは皆さんの、ストアドの単体テストの楽な方法とかも何かtipsがあれば Visual StudioのSQL Server Data Tools(SSDT) >>649
そもそもTransact-SQLをわかってますか? 接続文字列のData SourceとServerに違いはあるの?
どちらもサーバーのインスタンス名かIPアドレスとポートの指定だと思ってるけど SQLServerでServerといったら基本的にはSQLServerがインストールされているサーバーかサーバーとそのインスタンス名まで
DataSourceとなるとSQLServer以外のDBMSやフラットファイルも含まれる 久々にSSMS2008を触ってて
クエリショートカットのカスタマイズした機能が動かなくなってるんだけど
同じようなことしてる人いる?(COMMITとROLLBACK)
https://dotup.org/uploda/dotup.org2767912.png >>656
ごめん自己解決
間違ってF5押してたわ 教えて下さい。
ACCESS2019、SQL Server2012利用しています。
ACCESSからSQL ServerのテーブルへODBCでリンクテーブルを貼っている環境があるんですが、
特定の端末だけ、リンクテーブルを開くと、内容が突然すべて#DELETEになってしまう に現象に見舞われました。
https://pctips.jp/pc-soft/access-sqlserver-deleted
このサイトを始めとして、同様の現象を解説しているサイトには、SQL Server側でbigint型を使ってるせいとありましたが、
bigint型は使っていませんし、特定の端末のみこの現象が発生しています。
再起動やODBC設定の作り直し、リンクテーブルの貼り直しなどしても治りません。
更に不思議なことに、次の日になると治ってしまいます。
で、しばらくたつとまた同じ現象に見舞われます。
(ここ一週間で3回です)
私も長年SE・PGやっていますが、このような現象は初めてで、
途方にくれています。
最悪PC変えれば治りそうな感じではあるのですが・・
なにか情報をお持ちの方のお知恵を拝借したく・・・
何卒よろしくお願いいたします。 bigintだけじゃなくて、bit型で値がNULLだったりしたらそんな感じになった気がする
まあ、クライアントがまったく同じバージョンでまったく同じデータを表示して起こるなら
ネットワーク系の問題の可能性が高そうだけど
それかODBC定義が違ってるとか
ウィルスチェック系のソフトが悪さしてるんじゃね sql serverにアプリから接続しているクライアントPCって
利用状況モニターで確認できますが、過去の履歴ってどこから見れますか? >>663
利用状況モニターってたぶん動的管理ビューから情報とってるから、それの過去データ見たいならそれをとるように設定しないと
データコレクションがそれなんだろうが自作でクエリ組んでSQLAgentで動かすほうがカスタマイズしやすいと思う
あとは、どういう風にデータを見たいかだけど拡張イベントでログインログアウトとるとかも有りかな どういうログがいるのかわからんが、監査ログで良いんじゃないか 監査ログって拡張イベントを監査用にまとめただけでしょ
簡単にやれるぶん融通がきかない
項目とフィルタの設定の自由度ほしいなら拡張イベント一択 sql sever 2019で、ファンクションを作成しています。
その処理の中で、番号を管理する列から最大値を取得して1を加えたものを新しい番号として同じテーブルにインサートしようとしています。
その処理の間に、他からこのファンクションを呼び出されて割り込まれることを防止するため、ファンクションが完了するまでテーブルロック(排他ロック)をかけたいのですが、どのような記述が必要でしょうか。
begin transaction
commit のような感じで関係するステートメントをかこえたらよいのですが。 >>667
自作せずにSEQUENCEをNO CACHEで使えばいいよ >>668
早速のレスありがとうございます。
連番はSQL SEVERに自動で振ってもらおうと思います。
そして、INSERTとOUTPUT inserted.*を使って、
その新しい番号を得たいと思います。 >>669
訂正します
INSERTにOUTPUT inserted.*を組み合わせて >>671
エクスプレス版を取りあえずダウンロードだけしといたw
SSMSが同じだからなあ…どうなんだろ 質問です。
テーブルA(1)---(∞)テーブルB(∞)---(1)テーブルA
こういう関係になるテーブルBを考えています。
即ち、テーブルAの外部キーをテーブルBの2列で持つことになります。
同じテーブルAについて外部キーを持っても、テーブルBの2列の意味はそれぞれで異なります。
こういうテーブルBの2列は、テーブルAの外部キーを持つので、列名の設定に困ります。
一列だけならforeignkeyofA_CDという列をテーブルBに設定すれば良いですが、こういう場合はどんなふうに列名を設定するのが良いのでしょうか。 >>674
foreignkeyof ってググっても出ないから、そんな作法は一般的じゃないよね
普通に名詞だけの単語でテーブルA,B共通の名前にして、エイリアス名で分ければ? 悩むくらいなら、
/* コメントxxxxx */
みたいにメモを残すほうが、あとでみてもわかる >>674
列名?
外部キー制約名じゃなくて?
列名ならそのカラムがテーブルAで持つ意味でつければいい
外部キー制約名はFK_テーブルA_テーブルBが一般的
2つ同じテーブル同士で外部キー制約を貼るなら
テーブルA側の列名も使って外部キー制約名を付ける >列名ならそのカラムがテーブルAで持つ意味でつければいい
buyerとsellerとか
primary_contact/secondary_contactとか スレが盛り上がったところで、質問させていただきます
SQLCLRなんですが、複数のアセンブリがあって、その中の、一部のメソッドを仕様変更したとき、アセンブリとストアドの依存関係なしに、全部createやり直すのは普通ですか?邪道ですか? 再作成必要ないものまでcreate assembly、create procedureしてしまうんですよね >>679
普通ではないように思うが署名やテストも含め自動化できてるなら好きにすればいいんじゃない? 皆様、レスありがとうございます。
参考になりました。
結局、次のようにしました。
table_A.列名あいう(table_Aの主キー)
table_B.列名あいう(table_A外部キー)
table_B.列名あいう_用途(table_A外部キー)
このように、用途がわかるように列名を設定しました。
ありがとうございます。 同じ列名で格納かれているデータ異なるけど、関連があるなんてわかりにくいにもほどがあるだろw 1対Nを、1対「無限大」と表記する表記法なんて初めて見たわ。 >>682
わるい
「列名ならそのカラムがテーブルAで持つ意味でつければいい」と書いたけど
「列名ならそのカラムがテーブルBで持つ意味でつければいい」の間違いだったわ
message.sender -> account.id
message.receiver -> account.id 外部キー列と参照される列を混同するのは初心者あるあるだが、
純粋に間を取り持つテーブルを作った方がいい。
説明がいるデータモデルにしておくと、自分でもわからなくなる。 トランザクションデータの親子関係と、マスタデータの関係がごっちゃになっているのかな? table_A.列名あいう(table_Aの主キー)
table_B.列名あいう(table_A外部キー)
table_B.列名あいう_用途(table_A外部キー)
table_Aの外部キーが保存されるこの2列ですが、table_Aの同じ行とリンクするものではありません。
table_B.列名あいう_用途(table_A外部キー)
は、たとえば >>689
table_B.列名あいう_用途(table_A外部キー)
は、たとえば、
table_B.列名あいう_処理ターゲット(table_A外部キー)
とでもして、処理と処理済みであることを銘記するためのものです。
table_B.列名あいう(table_A外部キー)がリンクするtable_Aの行とは違う行とリンクします。 >>686
ありがとうございます。
そのように考えました。 >>685
アクセスのGUIってそうなってなかった? >>690
table_B.列名あいう(table_A外部キー)
table_B.列名あいう_用途(table_A外部キー)
つまり、table_Bは、table_Aのサブテーブルでありながら、処理のターゲットにもされるテーブルということになります。 テーブルAの別のレコードの列を参照する列を同じレコードに持つテーブルB
これCOBOLの発想か? >>693
親子関係なのか
それならそういう命名もある程度納得できる
taskテーブルとtask_dependencyテーブルがあって
task_dependencyテーブルではtask Aが終わったら
task B, C, Dを実行するみたいな依存関係を管理する時に
↓こういうイメージの構成にして(A, B), (A, C), (A, D)の3レコードを登録する形だよね
task.task_id
task_dependency.task_id -> task.task_id
task_dependency.depentent_task -> task.task_id 他サーバーのテーブルを参照するビューがクソ重くて辛い
データ転送バッチ作るしかないのか? >>697
ありがとう
他サーバーは他の人が管理してるものだからいけるか謎だけどちょっと相談してみるわ >>698
SQL Serverはマテリアライズドビューがない
これはかなりの欠点 >>700
それは標準SQLのマテリアライズドビューではなく、データベースそのものの物理的なレプリケーションでしかない。
こんなの乱暴すぎてアプリケーションからは危険すぎて使えない。
マテリアライズドビューがわからないのなら、マテリアライズドビューを知ってから反論した方がいい。 >>701
何いってんのww
レプリとマテリアライズドビューの区別もできない上に
マテリアライズドビューが標準SQLになった妄想見てんのかww
恥ずかしいやつだなwww
オラクルしか知らんとマテリアライズドビューの本来の意味もわからんようになるのか
こうはなりたくないな オラクルだと昔はスナップショットと呼んでたから
マテリアライズドビューをスナップショットレプリケーションだと思い込んでるんだろ おまえらSQL Serverしか知らねえのまるわかりじゃねえかw >>702
あのさ、他のRDBMSではレプリケーションという言葉は広い意味の言葉で、製品ごとに定義が異なる。
さらにマテリアライズドビューはデータベースオブジェクトですよ?
SQL Serverで似たようなことをするには、全レコードをSELECTして他のテーブルに登録するくらいしかない。
他のRDBMSはSQLでマテリアライズドビューの操作ができる。 >>703
「スナップショットレプリケーション」なんて言葉が出てくるのはSQL Serverくらい 日本マイクロソフトのサポートや、日本マイクロソフトが作らせたOracleDBとの比較資料も大間違いだらけなんだぜ?
そのくらいマイクロソフトは自社製品がわからない。
日本マイクロソフトの品川本社のSQL Serverサポートもひどいレベル。
普通のデスクトップPCで試してみているだけ。
さも知ってましたみたいに答えるが、Bing検索で検索して答えるレベル マイクロソフトはSQL Serverの欠点を指摘されて、マテリアライズドビューはあるみたいなことを世界に発信している。
マテリアライズドビューは、ビューにインデックスを作成すれば解決みたいなことを言い出して、そのインデックスが実態がもはやただのテーブルにすぎない。
同じようにロックエスカレーションも悪く言われて、これも正反対のロックエスカレーションはすばらしいと言って回っているので、ますますSQL Serverが売れなくなった。 >>705
> SQL Serverで似たようなことをするには、全レコードをSELECTして他のテーブルに登録するくらいしかない。
よくそんなレベルでレスできるもんだな... >>709
データがそんな大きくなければそうやるよ?
あなたは何と戦っているの?
そうじゃない、そうじゃないと言っていても、ただのイタいおじさんを通りすぎて、追放されるレベルだよ。 > こんなの乱暴すぎてアプリケーションからは危険すぎて使えない。
とか言ってた奴が
> SQL Serverで似たようなことをするには、全レコードをSELECTして他のテーブルに登録するくらいしかない。
とかw
とりあえず何が危険なのか書いてみ
それでお前のレベルがわかる まいどまいど斜め上のレスを上から目線で書いちゃってwww
いつも笑わせてもらってる
こいつは特別アホだとしても
オラクル信奉者ってなぜか低レベルなやつ多いよなぁ よろしくお願いします。
Date型で、日部分のみ指定した値に変更したいのですが、そういう関数はあるでしょうか。
元となる年月日から足し引きするような関数はあったのですが、直接指定するというものが見つかりません。
年、月、日に分解したあとに、日のみ変えてまたDATE型を組み立てるしかないのでしょうか。 >>712
他のDBMSに精通したらオラクルを信奉したりしないからね >>713
SQL-Server 2022 なら
dateadd(day, n - 1, datetrunc(month, 日付))
でできると思うけどどう見ても素直に
datefromparts(year(日付), month(日付), n)
の方がわかりやすいと思う >>715
早速レスをいただき、ありがとうございます。
専用関数がないのは残念ですが、確かにわかりやすいので、組み立て方式でいきたいとおもいます。
参考になりました! >>717
こういうのがあるからアップデートしたくない
最初にテストしたら、そのまま何の変更も加えてほしくない Sql server 2019と、SQL Server Management Studio(SSMS)について
SSMSを使って、Sql serverにsaで接続し、
ファンクションを作成しました。
作成用Create functionスクリプトの実行は完了しました。
しかし、SSMSの左ペインに表示されるはずの作成したファンクションが見つかりません。
そのファンクションも、SSMSには認識されておらず、dbo.ファンクション名を打とうとしても、インテリセンスが機能しません。
このとき、SSMSを再起動したのですが、状況は変わりませんでした。
しかし、Sql serverも再起動した後に試すと、SSMSはさきのファンクションを認識しました。
こういう挙動は普通ですか?
ストアドプロシジャなら、直ぐに認識されなくても、いくらなんでもSSMSで再接続さえすれば認識されたと思います。 >>719
データベースの情報を完璧に取得し直して表示するという仕様は、完璧である必要があると思っているんですか?
データベースオブジェクトを検索して表示するのも負荷のかかることです。
SSMSで一時的に見えなかったことを問題視してますが、そんなに重大な問題ですか?
SSMSではなく、クエリで存在を確認する習慣をつけた方がいいですよ。 ストアドプロシジャ内で、
サブクエリによるテーブルの導出を
テーブル値ファンクションで行うとパフォーマンスは落ちるのでしょうか。
各ストアドプロシジャ内で、同じ導出を行うのも非効率だなと思って、流用しやすい形でfrom 句にファンクションを使おうと思っています。 >>719
SSMSってDB情報とかキャッシュしてるから、まあよくあることなんじゃね
>>721
テーブル値ファンクションって、おそらく実行時に展開されないので
サブクエリより実行計画の幅が狭いはず
なのでサブクエリより実行効率が上がるとは思えん >>719
手動でRefreshしなよ
わからなかったら「SSMS Refresh」でググって
インテリセンスのキャッシュも同じ
DBに不必要な負荷をかけないために昔からそういう仕様だったはず >>721
Inline Table Valued Functionなら
SELECT文を直接書くのと同じように展開されてから
オプティマイザが実行プランを生成するのでパフォーマンスは変わらない >>722
>>724
レスありがとうございます。
テーブル値ファンクションを、From句や、
OUTER APPLYで使うと、パフォーマンスおちないか心配でした。
ストアドプロシジャにベタ書きするように最適化されると聞いて安心しました。
しかし、再利用性を高めるとはいえ、
SQLにサブルーチン的な発想をもちこむのは心が痛みます。 >>725
整合性の取れた最新のデータを取得しないといけない理由があるんですか?
理由がないのならそんなやり方は捨てるべきです。
しかもデータ量について言及がないので、データ量が少なければ、どういう方法でやっても速度性能なんてほとんど変わりません。
パフォーマンスは低下するが、1.00秒かかるクエリが1.01秒になるような性能悪化なら気にしても意味はありません。 >>726
>整合性の取れた最新のデータを取得しないといけない理由があるんですか?理由がないのならそんなやり方は捨てるべきです。
どういうこと?
静的テーブルに、予めデータを用意しておいて、
これを使うということ?? >>725
通常のビューや、CTEでダメな理由がなにかあるのか? >>729
そこで言う再利用って何?
CTEはともかく、ビューが再利用できないわけないんだが >>730
テーブル値ファンクションで、定義しとけば、
他でテーブルのように何度でも使える。
修正も一箇所ですむので簡単。 >>727
そいつはDB板の有名荒らしなので相手にするのは時間の無駄だよ 条件となる値が固定ならビュー
条件となる値が可変ならinline TVF >>734
引数なしのテーブル値ファンクションは駄目? >>731
だからそれだと、ビューがダメな理由にならないんだが? >>736
ビューはかつて使ったことないけど、
from句や、OUTER APPLYできるのかな。
ファンクションで作っておくと、引数追加したくなっても変更しやすそう >>737
>from句や、OUTER APPLYできるのかな。
当然使えるよ
SELECTするだけならTableが使えるところならどこでも使えると思うよ
更新系はいろいろ制約があってそれを満たしてなければ使えない SQL ServerのPKやインデックスは作成後にメモリに常駐し続けるものなんでしょうか? >>740
キャッシュにブロック単位で読み込まれて残ってることはあるけど常駐はしない SQL Server for LinuxでActive×Activeの遠隔地マルチマスター構成作れるの? >>742
WindowsかLinuxかに関係なくSQL Serverが持ってる機能だけじゃできないと思うぞ
Oracleと同じでGoldenGateみたいな3rdパーティの製品依存 大規模システムはOracleDB、
中小システムはSQL Serverという棲み分けは
結局、変わらなかった。
今後も変わることはない。
なぜならマイクロソフトが諦めているから。 十数年前ならともかく
本当に大規模なシステムでは
もうオラクルやSQL Serverを検討するような時代じゃないからな >>747
勘違いしすぎだぞ
クラウドでも大企業はオラクルクラウド、AWSやAzure上で同じ製品を使っている >>749
大規模なシステムと大企業のシステムの違いもわからないのかww
脳みそバグってるね 単にお金がない企業は安いものを選択するしかないだけの話 そうなんだよ
お金がないからAmazonもOracle全部やめようとしてるんだよなぁ Googleもお金がないからオラクルなんてボッ・・・高価なものは使えない
Facebookも右肩下がりだから節約してMySQL AWSなんてすげーお金がかかるのに騙されて契約するのが日本人 本番環境しか見積もらずにAWSに完全移行して、運用保守環境がなくて積む企業が多発しているのが現状。 SSE2017相手なんだけど
SSMS19は18から設定を引き継ぐと繋がるけど
設定をクリアして新規で接続しようとすると
証明書がどうたらって出て接続エラーになる
でアンインストールしてSSMS18を入れ直すと
新規設定からでも接続できた
SSE2019以降の組み合わせだとどうなるか…
検証が非常に面倒だw SSMS19の接続問題は接続の暗号化オプションが原因だった
SSMS18は暗号化が既定でオフだった >>762
SSMSだけの問題じゃなくて、ほかのクライアントでも問題出てるから
サーバーかクライアントドライバでのデフォルト設定が変わってるっぽい
とりあえず接続文字列修正してるけど、デフォルト設定変える方法探さんとなぁ SSMS19は設定ファイル自体を削除しちゃうと
接続暗号化オプションにもチェックが入るけど
詳細メニューで一度リセットボタン押しとくと
その後は既定で暗号化オプションがオフになる Azureの方も更新来てたけど
引継でも新規接続でも問題無いな SQL Serverは他のRDBMSと実装の方向性が違いすぎて、もはや作りが崩壊している。 >>767
特定のインデックスがあるとテーブルが不要になるあたり >>769
列ストアインデックス
根本的に実装がおかしいと言っているようなもの いや、個別の機能とかそういうのはいいから。
それをどう使うとどういう風になにが崩壊するのか実際的に語ってみて。 >>771
テーブルで実装できなかったことをごまかしている データの読み取りだけで高負担という欠点をさらしているわけだが、読み取り一貫性の実装が何度、作り直しても同じという諦めはマイクロソフト自身が諦めていること。
マイクロソフトドキュメントでわかるとおり、技術的にわかる人間を投入していないからこうなる。 >>770
データウェアハウス向けの機能追加したら、他のRDBMSと実装の方向性が違いすぎるってか
>>データの読み取りだけで高負担という欠点
エビデンスは?
>読み取り一貫性の実装が何度、作り直しても同じという諦めはマイクロソフト自身が諦めている
エビデンスは?
>マイクロソフトドキュメントでわかるとおり、技術的にわかる人間を投入していない
たとえばどのドキュメント?
せめて、具体的なURLの一つでもあげてから言えよ SQL Serverの営業職なのか?
SQL Serverは同時実行性を切り捨てている。
2005から2008でコードを書き直したが、結局、仕様がたいして変わらないものが納品されたことぐらい歴史を勉強しろよ。 >>777
他のトランザクションを邪魔する形で、読み取り一貫性を実装している。
データそのものを排他ロックするSybaseの流れから方針転換できなかった。
だから、列ストアインデックスのようにテーブルのコピーを作って、読み取りの並列化をするしかなくなった。
批判をしているんじゃなくて、事実を書かれて頭に来ているのは、ちょっとおかしい。 だからエビデンスを出せと
せめてURLの一つでも張らないと何の説得力もないよ
>>778
>仕様がたいして変わらない
中身のコードはどうでもいいが、バージョン上がって仕様が変わってたら大変なんだが?
>>779
ロックで一貫性を保つのは普通の方針だと思うが、それが実装の方向性が違うって?
で、列ストア以前にスナップショット実装されてるはずだが、それについては?
まあ、どうせ何の根拠もなく使い物にならないっていうんだろけど >>781
他のRDBMSは仕様を変えながら進化している。
後方互換性をマイクロソフトがアピールしていることもないし、そもそも後方互換性を気にしないのがSQL Server。
これを批難されているように受け取るんだろうけど、SQL Serverは日本マイクロソフトが作っているんじゃねえんだぞ? SQL ServerはSQL ServerのDBAはなかなかいなくて、マイクロソフトは売りっぱなしの商売下手。
すでに終わったSQL Serverの資格も普及させる気があるとは思えなかった。いまはAzureのおかげでセット販売ができているからいいけど。 だから、どこが崩壊してるんだよ。
結構真面目に聞いてたつもりだったけど、何の根拠を挙げることもできないのね。
ただのアンチさんの戯言だったわけだ。 SELECTだけで必要以上にレコードを排他ロックすることがいまだにあり、これによる同時実行性の低下対策として、レコードのコピーを使う仕組みが作られて、それを使わされている。
要するにマイクロソフトが指示した仕様を手抜きで前のバージョンのコピープログラムで再構築してしまったのが不幸の始まり。
マイクロソフトはいまだに「ロックエスカレーションは必ずしも悪いことではない」と説明せざるをえない。 >>785
テーブルをSELECTしながら処理するのと、テーブルをSELECTし、同じSELECT結果を登録した一時テーブルや同じデータを持つ列ストアインデックスを参照して処理するのを比べると、後者の方が短時間で終わる。
さらにやばいのがSQL Serverはいまでも単にSELECTしただけで、理由のわからない大幅な性能劣化が起きることがある。
マイクロソフトそのものが諦めているのに、SQL Serverに期待しすぎの人間がこのスレにいるのは、日本マイクロソフトの周知不足なんだろうな。 SQL Serverは同じテーブルに複数のセッションから同時にSELECT文を発行すると、極端に遅くなることがある。
さすがにこう説明すれば、作りに問題があることがわかるだろ? だから、どこが崩壊してるんだよ。
自分の台詞だろ。まずそこを説明しろよ。 何の根拠もなくここまで文句言えるとは
SQL Serverに親でも殺されたのか
>>786
聞いたことないけど、根拠は?
まあ、いまだに自分で明示的にロックかけないとまともに動かないDBを使ってる人は
排他ロックと共有ロックの区別がつかないんだな
>>787
どんな処理をしたらそうなるって?
で、その理由をお前が理解できないから、なぜかそうなるですましてるんだろ
期待してるどうこうではなくて、正しく理解して使いたいだけで
正しいかどうかもよくわからん情報を垂れ流されても困るんだがな 3行めから6行目までのデータを抽出するときってどうやって書いたらいいですか? >>793
SELECT *
FROM テーブル名
LIMIT 4
OFFSET >>794
OFFSET 6;
とするとエラーが出ました この辺りのこと?
ttps://sql-oracle.com/sqlserver/?p=857 >>796
すいません。
これです
調べきれてなかったです。
ありがとうございます。 2行目の5列目のみを抽出したいときってどうすればできますか?
SELECT 5列目の列名
FROM テーブル名
まではわかったのですが。。。 >>799
同じように入力してみます。
すいません。 select s from テーブル名 s where s.email = $1;
この s って何でしょうか?
AS句を省略してる的な感じなのでしょうか? >>802
合ってたんですね。
ありがとうございます。
ググるにも何て調べたら良いかわからず困っていました。 ですか?
同じテーブルを隣同士に繋げても意味ない気がして。。 同じテーブルでも行ごとに中身がちがうんだから
違う行をつなげる意味はあるだろう LEFT OUTERJOINの説明で、結合した時に余計なデータを取ってくるとノイズになるって説明見たんですけど、(ノイズ)ってなんの意味ですか?
NULLばっかりになるってことですか? >>808
行数もそうだがむしろ
select *fromなんて指示したらどえらい列になるってことでは 不要な列のデータ=ノイズって解釈なのだろうとエスパー。 たぶんそういう意味だろうね
(特に右テーブルの)不要な列を取ってくるなってことを言いたかったんだろう >>809
列指定にアスタリスクを使うことはあまりない Developer Editionのライセンス規約数年前に変わったはずなのに、未だに開発者しか使えないと
大手ベンダですら勘違いしているのはマイクロソフトの宣伝周知足りないよな
こっちは損しないからどうでもいいけど、無駄な金払う顧客が可哀想・・・ 昔もいまも開発用途にしか使えないと思うんだが
昔はどうで今はどうなのか詳しく https://www.microsoft.com/ja-jp/sql-server/sql-server-downloads
SQL Server 2022 Developer は、非運用環境におけるデータベースの開発およびテスト向けの、全機能を備えた無料エディションです。
SQL Server 2022 Express は、デスクトップ、Web、小規模サーバー向けのアプリケーションの開発と運用に最適な、SQL Server の無料エディションです。 クエリストア、めちゃくちゃ便利ですね
Oracleから移ってきたけどsql serverの便利さ に驚いています。
ssmsやc#との連携のしやすさなどエコシステム全体がユーザーフレンドリーな感じ
逆にOracleが不便なだけなのかもだけど 公式ドキュメントに問題があるせいで伸びないSQL Server エラーの有無にかかわらずログテーブルへの出力をしたいんですが、オラクルのような自律型トランザクションってないんですよね…
皆さんどうやってます? それってメインの処理は成功してログテーブルへの出力が失敗した場合はどう対処してるの? テキストファイルに吐いといて定期的にログテーブルに乗せるとか
原始的すぎるかな テキストファイルに吐いといて定期的にログテーブルに乗せるとか
原始的すぎるかな テキストファイルに吐いといて定期的にログテーブルに乗せるとか
原始的すぎるかな 本当にロールバックさせたいとこだけ子トランザクションにして全体はコミットする 本当にロールバックさせたいとこだけ子トランザクションにして全体はコミットする トランザクションをハンドリングするレイヤーとログ出力するレイヤーが揃ってないんだろう
テーブル変数やリンクテーブル使った回避策もあるけど揃ってないのがアンチパターンなので設計を見直したほうがいい 設計がおかしいって言っとけばなんかわかってる感が出るから便利よね
どうおかしいかは言ってる本人もわからない ssmsとazure data studioそれぞれで実行計画出したときの不足インデックス提案が微妙に違うことに気づいたけどなんで? azureの料金上がるし、azureからawsに乗り換えるってなるとDBもついでにsql serverからauroraに移行、みたいな話は増えそう オラクルクラウドとか罰ゲーム
VMがタダなのでたまに使うくらい オラクルクラウドはAzureと提携しているんだが? 知らねえだけか
Azureの意味も製品の単位だとまちがって思い込んでいるな awsのマネージドsql serverって実際移行先としてどうなんだろう クラウドはDBが一番コストかかるので頭が痛い
案件ごとにチューニングしてvCore2つなんとか減らせるかどうか…を突き詰めるのしんどいわ インフラメンテコストを丸投げできるなら安い
DBサーバのメンテ不足で痛い目見た経験ある人はこのスレ多いでしょ オラクルクラウドはいいぞ
なんせただでサーバー立てられるからな
ある時よくわからん理由で消されるけどwww 数年前に勝手にインスタンス消されたってツイッターで騒ぎあったね
信用してないからタダでも使わないかなw サブスクがコスト高でオンプレ回帰の流れ
クラウドの役割なんてバックアップ程度が相応しい 定期的にボラクル君が出現するねw
それも決まってなぜかSQL Serverスレww