タグ付けされた質問 「sql-server」

Microsoft SQL Serverのすべてのバージョン(MySQL以外)。sql-server-2016のようなバージョン固有のタグも追加してください。これは、質問に関連することが多いためです。

2
オプティマイザーに必要な時間を増やすことはできますか?
オプティマイザーは、実行可能なすべての実行計画を調査するために必要な時間をすべてとることができないため(実行時間を最小化する必要があります)、カットされることがあります。 これをオーバーライドして、オプティマイザーに必要に応じて常に(または一定のミリ秒単位で)渡すことができるかどうか疑問に思っていました。 この(atm)の必要はありませんが、複雑なクエリがタイトループで実行され、最適なプランを考え出し、それを事前にキャッシュするシナリオを想像できます。 もちろん、ループがタイトであるため、クエリを書き換えて、それがなくなるようにしてください。 これは、好奇心からの質問であり、短絡最適化と完全最適化の間に時々違いがあるかどうかを確認することでもあります。 トレースフラグ2301を使用すると、オプティマイザーにより多くの時間を与えることができます。これは、私が求めていたものとはまったく異なりますが、近づいています。 これについて私が見つけた最高の情報は、Ian JoseによるSQL Server 2005 SP1のQuery Processor Modeling Extensionsにあります。 このトレースフラグは注意して使用してください!しかし、より良い計画を思いつくときに役立ちます。こちらもご覧ください: Grant Fritchey が「最適化レベル」とタグ付けした記事。 SQL Server 2008にアップグレードする前に… Brent Ozar作。 Microsoftサポートにより、高パフォーマンスのワークロードで実行されている場合のSQL Serverのチューニングオプション。 結合順序のソリューション空間が指数関数的に爆発する、多くの結合を持つクエリについて考えていました。SQL Serverが使用するヒューリスティックは非常に優れていますが、時間があれば(数秒から数分)オプティマイザーが別の順序を提案するのではないかと考えていました。

1
データベースのエイリアスまたはシノニムを作成することはできますか?
データベースのエイリアスまたはシノニムを作成することはできますか?私ができることを望んでいるのは、NewDatabaseNameをOldDatabaseNameとしてエイリアス化して、大量のコードを書き直さなくて済むようにすることです。 バックストーリー:私はばかげた自己誘発問題を抱えたクライアントからアプローチされました。SQL Serverバックエンドを備えたサードパーティアプリケーションがあります。ユーザーは、Visual Basicを使用してこのデータベースに対してカスタムレポートを作成し、すべてのデータベース接続情報をプログラムにハードコーディングしています。 最近、サードパーティのソフトウェアはデータベースの名前を変更しました。これで、すべてのレポートEXEが失敗しています。 ああ、彼らは多くのソースコードも持っていません。 私は笑いを抑えて、自分に何ができるか見てみようと言いました。

3
ディメンションの範囲を動的に定義する
キューブを作成するたびに直面する問題があり、それを克服する方法をまだ見つけていません。 問題は、ディメンション内でハードコードすることなく、ユーザーがさまざまなものを自動的に定義できるようにする方法です。例で問題を説明します。 Customersというテーブルがあります: これはテーブル内のデータです。 ピボットスタイルでデータを表示し、以下のように定義された範囲で給与と年齢をグループ化します。 このスクリプトを作成し、範囲を定義しました。 SELECT [CustId] ,[CustName] ,[Age] ,[Salary] ,[SalaryRange] = case when cast(salary as float) <= 500 then '0 - 500' when cast(salary as float) between 501 and 1000 then '501 - 1000' when cast(salary as float) between 1001 and 2000 then '1001 - 2000' when cast(salary …

3
エラーメッセージの「SET」の意味「NULL値は集計またはその他のSET操作によって削除されます」
今日、同僚のスクリプトを実行しているときに、上記の「ANSI警告」メッセージが表示されました(そして、多くのステートメントのどれが警告を表示したのかわかりません)。 過去に私はそれを無視していました。私はヌルを自分で避けているので、それらを排除するものは私の本では良いことです!しかし、今日、「SET」という言葉が文字通り私に叫び、私はこの文脈でその言葉の意味が何を意味するのかわからないことに気付きました。 私が最初に考えたのは、大文字であるという事実に基づいて、SETキーワードを参照しており、「割り当て」を意味しているということです。 UPDATE <table> SET ... ...ON DELETE SET NULL... SET IDENTITY_INSERT <table> ON SQL Serverヘルプによると、「ANSI警告」機能はISO / ANSI SQL-92に基づいています。この仕様では、サブセクションのタイトル、つまりタイトルの場合、データ割り当てセクション。ただし、エラーメッセージをすばやくグーグルで調べた後、SELECT割り当てが関係していないように見えるクエリの例を見ることができます。 SQL Serverの警告の文言に基づいた私の2番目の考えは、集合の数学的意味が暗示されているということでした。ただし、SQLの集約が厳密に言うと集合演算であるとは思いません。SQL Serverチームがそれを集合演算であると見なしている場合でも、「集合」という単語を大文字にする目的は何ですか? グーグル検索中に、SQL Serverのエラーメッセージに気付きました。 Table 'T' does not have the identity property. Cannot perform SET operation. ここでの同じケースでの「SET操作」という同じ言葉は、IDENTITY_INSERTプロパティの割り当てを指しているだけで、最初の考えに戻ります。 誰かが問題に光を当てることはできますか?
18 sql-server 

3
'n'日間のWebサーバーログをSQL Serverに保存する方法は?
より高速なレポートとパフォーマンス分析のために、WebサーバーのログをSql Serverに挿入します。これにより、ほぼリアルタイムでトラフィックパターン、問題、速度低下を確認できます。 ロードバランサーからの要求/応答イベントとデータベースへの一括挿入をリッスンするデーモンがあります。 ただし、1日あたり約1 GBのログを取得するため、約1週間程度(少なくともこの生の形式で)保持するだけで済みます。 このデータを保存する最良の方法と古いエントリを削除する最良の方法は何ですか? 毎日のデータを独自のテーブルに保存することについて説明しました。たとえば、その日のLog_2011_04_07すべてのエントリを取得し、最も古いテーブルを削除します。クエリを簡単にするために、すべての日テーブルにまたがるビューを作成できます。実行可能ですか?

2
デフォルトの制約、それだけの価値はありますか?
私は通常、次のルールに従ってデータベースを設計します。 db_ownerとsysadmin以外は誰もデータベーステーブルにアクセスできません。 ユーザーの役割はアプリケーション層で制御されます。通常、1つのdbロールを使用して、ビュー、ストアドプロシージャ、および関数へのアクセスを許可しますが、場合によっては、一部のストアドプロシージャを保護するための2番目のルールを追加します。 TRIGGERSを使用して、重要な情報を最初に検証します。 CREATE TRIGGER <TriggerName> ON <MyTable> [BEFORE | AFTER] INSERT AS IF EXISTS (SELECT 1 FROM inserted WHERE Field1 <> <some_initial_value> OR Field2 <> <other_initial_value>) BEGIN UPDATE MyTable SET Field1 = <some_initial_value>, Field2 = <other_initial_value> ... END DMLは、ストアドプロシージャを使用して実行されます。 sp_MyTable_Insert(@Field1, @Field2, @Field3, ...); sp_MyTable_Delete(@Key1, @Key2, ...); sp_MyTable_Update(@Key1, @Key2, …

2
Row_GUID列の目的は何ですか?
私はAdventureWorks2012データベースを掘り下げて調査し、いくつかのテーブルでRow_GUIDが使用されていることを確認しました。 私の質問には2つの部分があります。 Row_GUID列を含める必要があるのはいつですか? Row_GUID列の用途と利点は何ですか?
18 sql-server  uuid 

2
ストアドプロシージャ内のこのクエリでSQLインジェクションが発生しないのはなぜですか?
次のストアドプロシージャを作成しました。 ALTER PROCEDURE usp_actorBirthdays (@nameString nvarchar(100), @actorgender nvarchar(100)) AS SELECT ActorDOB, ActorName FROM tblActor WHERE ActorName LIKE '%' + @nameString + '%' AND ActorGender = @actorgender 今、私はこのようなことをしてみました。私はこれを間違っているかもしれませんが、そのような手順がSQLインジェクションを防ぐことができることを確認したいです: EXEC usp_actorBirthdays 'Tom', 'Male; DROP TABLE tblActor' 以下の画像は、上記のSQLがSSMSで実行され、エラーではなく結果が正しく表示されることを示しています。 ところで、クエリの実行が完了した後、セミコロンの後にその部分を追加しました。その後、再度実行しましたが、テーブルtblActorが存在するかどうかを確認したところ、まだそこにありました。私は何か間違っていますか?または、これは本当に注射防止ですか?私がここで尋ねようとしているのは、このような安全なストアドプロシージャですか?ありがとうございました。

3
この結合カーディナリティの推定値が非常に大きいのはなぜですか?
私は、次のクエリのカーディナリティの推定値が非常に高いと思うことを経験しています: SELECT dm.PRIMARY_ID FROM ( SELECT COALESCE(d1.JOIN_ID, d2.JOIN_ID, d3.JOIN_ID) PRIMARY_ID FROM X_DRIVING_TABLE dt LEFT OUTER JOIN X_DETAIL_1 d1 ON dt.ID = d1.ID LEFT OUTER JOIN X_DETAIL_LINK lnk ON d1.LINK_ID = lnk.LINK_ID LEFT OUTER JOIN X_DETAIL_2 d2 ON dt.ID = d2.ID LEFT OUTER JOIN X_DETAIL_3 d3 ON dt.ID = d3.ID ) …

4
OVERを使用したウィンドウ関数でのDISTINCTの使用
OracleからSQL Server 2014にクエリを移行しようとしています。 Oracleでうまく機能するクエリを次に示します。 select count(distinct A) over (partition by B) / count(*) over() as A_B from MyTable これは、SQL Server 2014でこのクエリを実行しようとした後に取得したエラーです。 Use of DISTINCT is not allowed with the OVER clause 誰が問題を知っていますか?SQL Serverではこのような種類のクエリが可能ですか?お知らせ下さい。

2
並列クエリ実行エラーを理解する必要がある
今日、実稼働SQLサーバーのパフォーマンスが低下しました。これが発生した間、いくつかの"The query processor could not start the necessary thread resources for parallel query execution"エラーを記録しました。私が読んだことは、これが複雑なクエリを実行するときに使用するCPUの数に関係していることを示唆しています。しかし、私は停電たちの中にチェックするときCPU Utilization was only at 7%。私がまだ出くわしていない、これが参照している可能性のある他の何かがありますか?これはパフォーマンス低下の原因である可能性がありますか、それともニシンを追いかけていますか? これに対する私のsp_configure値は次のとおりです。 name minimum maximum config_value run_value cost threshold for parallelism 0 32767 5 5

4
GUIDを主キーとして使用してデータベース設計を修正する最適なソリューション
私は、このアイデアをある程度確認した後、パフォーマンスの悪いデータベースを修正するか、データベースがある場合はより良い提案をします。常により良い提案を受け入れます。 GUIDをPKとして使用している非常に大規模なデータベース(1日あたり約20万件増加する2000万件以上のレコード)があります。 私の側の見落としですが、PKはSQLサーバーにクラスター化されており、パフォーマンスの問題を引き起こしています。 GUIDの理由-このデータベースは他の150個のデータベースと部分的に同期されているため、PKは一意である必要がありました。同期はSQL Serverによって管理されるのではなく、システムの要件に合わせてデータの同期を維持するカスタムプロセスが構築され、すべてがそのGUIDに基づいています。 150のリモートデータベースのそれぞれは、中央のSQLデータベースに格納されているような完全なデータを格納しません。実際に必要なデータのサブセットのみを保存し、必要なデータはそれらに固有ではありません(150のデータベースのうち10が他のサイトデータベースからの同じレコードの一部を持っている場合があります-それらは共有しています)。また、データは実際には中央サイトではなくリモートサイトで生成されるため、GUIDが必要です。 中央データベースは、すべての同期を維持するためだけでなく、3000以上のユーザーからのクエリがその非常に大きな断片化されたデータベースに対して実行されます。すでにこれは初期テストの大きな問題です。 幸いなことに、私たちはまだ生きていません。必要に応じて変更を加えてオフラインにすることができます。これは少なくとも何かです。 リモートデータベースのパフォーマンスは問題ではありません。データサブセットは非常に小さく、通常、データベースの合計サイズが1GBを超えることはありません。レコードはメインシステムに非常に定期的にフィードバックされ、不要になったときに小さいBDから削除されます。 すべてのレコードのキーパーである中央DBのパフォーマンスは、その多くのレコードの主キーとしてのクラスター化されたGUIDのために悲惨です。インデックスの断片化はチャートから外れています。 だから-パフォーマンスの問題を修正するための私の考えは、新しい列を作成することです-符号なしBIGINT IDENTITY(1,1)し、テーブルBIGINT列のクラスターPKを変更します。 主キーであるGUIDフィールドに一意の非クラスター化インデックスを作成します。 小規模なリモート150データベースは、Central SQL Serverデータベースの新しいPKについて知る必要はありません。これは、データベース内のデータを整理し、パフォーマンスの低下と断片化を防ぐために純粋に使用されます。 これは機能し、中央のSQLデータベースのパフォーマンスを向上させ、将来のインデックスの断片化を防ぎます(もちろん)。または、ここで非常に重要な何かを見逃したことがあります。

2
SQL Serverで列をintに更新するときにトランザクションログがいっぱいになるのを回避する方法
というSQL Server 2005テーブルBRITTNEY_SPEARS_MARRIAGESがあり、次の列があります。 MarrigeId tinyint, HusbandName varchar(500), MarrigeLength int 今、私は別のテーブルを持っています BRITTNEY_SPEARS_MARRIAGE_STORIES StoryId int, MarriageId tinyint, StoryText nvarchar(max) 問題は、私たちが更新したいですMarrigeIdに列をintからtinyint。私たちは、ブリトニーがすべてのことを言って成し遂げる前にたくさんの結婚をするだろうと感じています。 現在、BRITTNEY_SPEARS_MARRIAGE_STORIESテーブルには1800万行があり(女の子に問題があるので)、更新を行うとトランザクションログがいっぱいになり、SQL Serverボックスが停止します。 どうすればこれを回避できますか? とにかく「SQL Serverをこの列を更新して大きくします。このSQL Serverで信頼してください。すべての検証を試みている間、トランザクションログをいっぱいにしないでください」と言うことはできますか?

2
SQL Server Join / where処理順序
Slow SQLクエリを読んだ後、最適化の方法がわからないので、クエリの一般的なパフォーマンスについて考えるようになりました。クエリをわずかに高速化するために、結合する前に(他のテーブルを結合する場合)最初のテーブルの結果をできるだけ小さくする必要があります(この質問の内部結合)。 例、これが必要です: SELECT * FROM ( SELECT * FROM table1 WHERE col = @val ) t INNER JOIN table2 ON col = col2 以下より良く/速くなる SELECT * FROM table1 INNER JOIN table2 ON col = col2 WHERE table1.col = @val 私の理論は次のとおりです(これは正しい実装ではないかもしれません。私が読んだSQL Server 2008の内部の本(MSFT Press)から思い出そうとしています)。 クエリプロセッサは最初に左側のテーブル(table1)を取得します 2番目のテーブル(table2)を結合し、必要な行をフィルタリングする前にデカルト積を形成します(該当する場合) 次に、SEELCTステートメントを使用してWHERE、ORDER BY、GROUP BY、HAVING句を最後に実行します。 したがって、上記のステートメント#1でテーブルが小さい場合、SQLエンジンはデカルト積を形成するときに行う作業が少なくなります。その後、whereステートメントに到達すると、メモリ内でフィルタリングする結果セットが減少します。 …

2
WITH CHECK CHECK CONSTRAINTとは何ですか?
おそらく自動生成されたT-SQLがいくつかありますが、これはおそらく有効ですが、実際にはわかりません。 ALTER TABLE [dbo].[MyTable] WITH CHECK CHECK CONSTRAINT [My_FORIEGN_KEY]; 私は外部キー制約が何であるか知っていますが、何CHECK CHECKですか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.