データベース管理者

データベースのスキルを向上させ、コミュニティの他の人から学びたいデータベースの専門家向けのQ&A

3
高選択性フィールドと低選択性フィールドを持つ複合インデックス順のフィールド順
30億行を超えるSQL Serverテーブルがあります。クエリの1つに非常に長い時間がかかるため、最適化を検討しています。クエリは次のようになります。 SELECT [Enroll_Date] ,Count(*) AS [Record #] ,Count(Distinct UserID) AS [User #] FROM UserTable GROUP BY [Enroll_Date] [Enroll_Date]は選択可能な値が50未満の選択性の低い列ですが、UserID列は2億を超える個別の値を持つ選択性の高い列です。私の研究に基づいて、私はこれらの2つの列に非クラスター化複合インデックスを作成する必要があると考えています。理論的には、高選択性の列が最初の列である必要があります。しかし、私の場合、group by句で低選択性カラムを使用しているため、うまくいくかどうかはわかりません。 このテーブルにはクラスター化インデックスがありません。

1
インデックスSEEKは、OPTION(RECOMPILE)でない限り使用されませんか?
(質問はSOから移動しました) クラスタ化インデックス付きのテーブル(ダミーデータ)に2つの列が含まれています。 次に、これら2つのクエリを実行します。 declare @productid int =1 , @priceid int = 1 SELECT productid, t.priceID FROM Transactions AS t WHERE (productID = @productid OR @productid IS NULL) AND (priceid = @priceid OR @priceid IS NULL) SELECT productid, t.priceID FROM Transactions AS t WHERE (productID = @productid) AND (priceid = @priceid) …

1
インデックスシークが正しい行数を推定でき、ソート演算子が推定できないのはなぜですか?
次のような述語の関数を使用するクエリがあります。 commentType = 'EL' AND commentDateTime >= DATEADD(month,datediff(month,0,getdate()) - 13,0) 40000行のcommentTypeにフィルター処理されたインデックスがあり、クエリを実行すると、インデックスシークの推定行数は非常に正確(約11K)ですが、次のステップ(ソート演算子)では、統計を完全に無視し、フィルターされたインデックスの行の総数を推定するだけです。 なんでこんなことが起こっているの?私はsargabilityの基本を知っており、正気を期すために、dateaddを実際の日付(2014-01-01)と実際の日付で置き換えてテストしました...ソートは行数を正しく推測し始めました... なぜこれが起こっているのですか、どうすれば修正できますか?決まった日を渡すことはできません...

1
sp_AskBrentの出力をエクスポートする方法
CPUをランダムにスパイクするインスタンスがあります。CPUで90%を超えて起動し、実行するジョブを自動的に呼び出しsp_AskBrentて出力をメールで送信するアラートを作成します。ただし、テキストまたはHTML出力では、出力を読み取ることができません。それはExcelスプレッドシートにもうまく行きません。読みやすい形式で情報を取得するにはどうすればよいですか?

2
SELECT…WITH XLOCKを使用する理由は何ですか?
私はいくつかの再発するデッドロックに直面しています。そのうちの1つはキーロックであり、デッドロックの犠牲になるXLOCKヒントを含むSELECTクエリが含まれています。もう1つのステートメントは、最初のクエリのビューの一部であるテーブルの1つへのINSERTです。 見る: create view dbo.viewE as select * from dbo.E where myValue > 13000 クエリを選択: select * from dbo.viewE with (XLOCK) where A > GETUTCDATE() INSERTステートメント: INSERT INTO [dbo].[E] (myValue,A) VALUES (10,GetDate()) 基になるテーブルdbo.Eは、約20列に約300万行を保持しています。それらの一部はntextです。 クエリを取り出し、2つのトランザクションで手動でシミュレーションすると、動作は再現可能です。XLOCKが選択から削除されると、動作が変わります。 デッドロックグラフ: <deadlock-list> <deadlock victim="process222222221"> <process-list> <process id="process222222221" taskpriority="0" logused="0" waitresource="KEY: 5:72057604035644444 (ccdf51accc0c)" waittime="2522" ownerId="27202256401" transactionname="SELECT" lasttranstarted="2015-09-14T16:32:36.160" …

1
大量のデータを含む既存のテーブルにインデックスを追加するとどうなりますか?
約1500万件のレコードを含むテーブルがあります。次に、テーブルにインデックスを追加する必要があります。 インデックスを追加すると、テーブルのすべてのエントリが更新されるまでに時間がかかります。 インデックスを追加するとダウンタイムが発生するかどうか、私はかなり混乱しています。 はいの場合、どのようにしてダウンタイムを克服できますか?

2
DATALENGTHの合計がsys.allocation_unitsのテーブルサイズと一致しません
DATALENGTH()テーブル内のすべてのレコードのすべてのフィールドを合計すると、テーブルの合計サイズが得られるという印象を受けました。私は間違っていますか? SELECT SUM(DATALENGTH(Field1)) + SUM(DATALENGTH(Field2)) + SUM(DATALENGTH(Field3)) TotalSizeInBytes FROM SomeTable WHERE X, Y, and Z are true 以下のクエリを使用して(オンラインから取得してテーブルサイズ、クラスター化インデックスのみを取得し、NCインデックスは含まない)、データベース内の特定のテーブルのサイズを取得しました。請求のために(部門に使用するスペースの量に応じて部門に請求します)、この表で各部門が使用したスペースの量を把握する必要があります。テーブル内の各グループを識別するクエリがあります。各グループがどれだけのスペースを使用しているかを知る必要があります。 1行あたりのスペースVARCHAR(MAX)は、テーブル内のフィールドが原因で大きく変動する可能性があるため、平均サイズ*部門の行の比率を取得することはできません。DATALENGTH()上記のアプローチを使用すると、以下のクエリで使用される合計スペースの85%しか取得できません。考え? SELECT s.Name AS SchemaName, t.NAME AS TableName, p.rows AS RowCounts, (SUM(a.total_pages) * 8)/1024 AS TotalSpaceMB, (SUM(a.used_pages) * 8)/1024 AS UsedSpaceMB, ((SUM(a.total_pages) - SUM(a.used_pages)) * 8)/1024 AS UnusedSpaceMB FROM sys.tables t with …


1
ジョブはスケジュールどおりに実行されていません
したがって、Robocopyスクリプトを実行してすべてのファイルを1つのフォルダーから別のフォルダーに移動する基本的なSQLエージェントジョブがあります。 ジョブはかなり基本的なセットアップです。 かなり基本的なスケジュールで。 それでもまだ実行されていません。うまく走るという意味でもないし、走るという意味でもない。これに該当する理由はありますか? 追加情報については、ジョブについても説明します。 USE [msdb] GO /****** Object: Job [MoveMantisFilesToArchive] Script Date: 12/23/2015 10:21:52 AM ******/ BEGIN TRANSACTION DECLARE @ReturnCode INT SELECT @ReturnCode = 0 /****** Object: JobCategory [[Uncategorized (Local)]]] Script Date: 12/23/2015 10:21:52 AM ******/ IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'[Uncategorized (Local)]' AND category_class=1) …

1
古いデータを読み取り専用にする
現在取り組んでいるデータベースプロジェクトでは、ある時点で「古い」データを読み取り専用に変更する必要があるという要件があります。これはSQL Serverで可能ですか? 読み取り専用権限は特定のしきい値より古いデータにのみ適用されるため、テーブル権限を変更できません。つまり、この時点以降に追加されたデータをユーザーが追加および編集できるはずです。
11 sql-server 

2
SQL Serverのインデックス付きビュー
私はテーブルとそれにインデックス付きビューを持っています Create table mytable1 (ID int identity(1,1), Name nvarchar(100)) Create table mytable2 (ID int identity(1,1), Name nvarchar(100)) Create view myview with schemabinding as select a.name, b.name from mytable1 a join mytable2 b on a.Id = b.Id 次のクエリを実行すると select a.name, b.name from mytable1 a join mytable2 b on a.Id = b.Id …

2
オンライン中にSQL Serverデータベースを新しいディスクに移動する
私は、ディスクI / Oで大いに苦労している1.4TBのSQL Serverデータベースを持っています。私たちはすべての問題を解決する新しいSSDアレイをサーバーにインストールしました。データベースを移動する最良の方法について議論しているだけです。理想的には、ダウンタイムなしでそれを実行できれば、それが最善です。ただし、2日間のパフォーマンスの低下(データのコピー中など)と2時間のダウンタイムのどちらを選択するかは、後者の方が望ましい場合があります。 これまでのところ、私たちが考え出したソリューションは次のとおりです。 簡単なコピー。DBをオフラインにして、ファイルをコピーし、SQL Serverの場所を変更して、オンラインに戻します。大まかな数値では、これには5時間ほどかかると見積もられていますが、これは実際には許容できませんが、最も簡単な解決策です。 ブロックレベルのコピー。rsyncのようなユーティリティを使用して、DBの稼働中にファイルをバックグラウンドでコピーします。移行の準備ができたら、DBをオフラインにして、このユーティリティを使用して差分コピーを実行し、SQLサーバーで新しいファイルを指定してオンラインにします。ここでのタイミングは不明です。1.4TBの差分分析を実行してそれをコピーするのにどのくらい時間がかかるかはわかりません。もう1つの懸念は、ブロックレベルのコピーによって、SQL Serverがファイルを読み取り不可能な状態にして、時間を浪費することです。 SQLマイグレーション。新しいディスクに新しい1.4TB SQLデータファイルを作成し、他のすべてのファイルで自動拡張を無効にします。次に、他のすべてのデータファイルに対してDBBC SHRINKFILE(-file_name-、EMPTYFILE)を順番に実行します。すべてのデータが揃ったら、ある時点でスケジュールされたウィンドウを使用して、MDFファイルをSSDに移動し、他の未使用のファイルを削除します。ダウンタイムを最小限に抑えるので、私はこれが好きです。しかし、これにどれくらい時間がかかるか、またそれが実行中にパフォーマンスの低下を引き起こすかどうかはわかりません。 これをテストするための負荷とパフォーマンスの環境はありません。戦略がステージング環境で機能することは確認できますが、影響やパフォーマンスは確認できません。
11 sql-server  ssd 

5
この更新が一意キー制約違反で失敗するのはなぜですか?
私は「偶然の」DBAであり、比較的経験が浅く、この問題に困惑しています。 MS SQL Server 2012を実行しています。問題はこのUPDATEステートメントにあります。 UPDATE dbo.tAccts SET Ticket = 'ARP.ExGE' , Method = 'smtp' , AcctOwner = 'r00417819' , DisplayName = '~AppLight HBSFax-Inactive' , Destination = 'r00417819@mail.ad.ge.com' , UpdatedBy = SYSTEM_USER , UpdatedOn = CAST(GetDate() AS DATE) FROM dbo.vReclaimable WHERE OHR_EmpStatus <> 'A' これは、vReclaimableビューによって返されるtAcctsテーブルの行のみを更新する必要があります。 vReclaimableビューはtAcctsテーブルに基づいており、tAcctsの行のサブセットを返します。 実行すると、一意のキーエラーで失敗します。 (0 row(s) affected) …

4
XMLの変更:属性を要素に
XML同様の構造のデータを含む列があります。 <Root> <Elements> <Element Code="1" Value="aaa"></Element> <Element Code="2" Value="bbb"></Element> <Element Code="3" Value="ccc"></Element> </Elements> </Root> SQL Serverを使用してデータを変更し、各Value属性を要素に変更するにはどうすればよいですか? <Root> <Elements> <Element Code="1"> <Value>aaa</Value> </Element> <Element Code="2"> <Value>bbb</Value> </Element> <Element Code="3"> <Value>ccc</Value> </Element> </Elements> </Root> 更新: 私のXMLは次のようになります。 <Root attr1="val1" attr2="val2"> <Elements> <Element Code="1" Value="aaa" ExtraData="extra" /> <Element Code="2" Value="bbb" ExtraData="extra" /> <Element Code="3" …
11 sql-server  xml  xquery 

1
本当に忙しいテーブルにインデックスを作成する
insert\select毎回たくさんのテーブルがあります(毎秒100台のマシンが挿入/更新しているような)。 1秒でもロックできないテーブルにインデックスを作成する最良の方法は何ですか? インデックスを作成すると、リクエストがロックされて、実行できなくなります。 100万行以上の大きなテーブルです。

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