データベース管理者

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

4
データベースに挿入が1つしかない場合、可能なすべての列の組み合わせにインデックスを付けるのは悪いことですか?
私は、大規模な選択クエリを必要とするレポートシステムに取り組んでいますが、データベースは一度しか入力されていません。データベース管理システムはMicrosoft SQL Server 2017です。このようなシステムを設計するより良い方法はおそらくありますが、理論的にこれにアプローチしましょう。 理論的に言えば: 非常に大きなデータベース(複数のテーブルに1億5000万行以上)がある場合 また、データベースには一度しかデータが入力されないと想定できます。 可能なすべての列の組み合わせにインデックスを付けると、選択クエリのパフォーマンスに悪影響が出る可能性がありますか?

1
このクエリでインデックススプールが使用されないのはなぜですか?
オプティマイザーの動作をよりよく理解し、インデックススプールの制限を理解するために、この質問をしています。ヒープに1〜10000の整数を入れると仮定します。 CREATE TABLE X_10000 (ID INT NOT NULL); truncate table X_10000; INSERT INTO X_10000 WITH (TABLOCK) SELECT TOP 10000 ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM master..spt_values t1 CROSS JOIN master..spt_values t2; そして、ネストされたループ結合を強制しますMAXDOP 1: SELECT * FROM X_10000 a INNER JOIN X_10000 b ON a.ID = b.ID OPTION (LOOP JOIN, …

1
このMERGEステートメントによりセッションが強制終了されるのはなぜですか?
MERGEデータベースに対して発行される以下のステートメントがあります: MERGE "MySchema"."Point" AS t USING ( SELECT "ObjectId", "PointName", z."Id" AS "LocationId", i."Id" AS "Region" FROM @p1 AS d JOIN "MySchema"."Region" AS i ON i."Name" = d."Region" LEFT JOIN "MySchema"."Location" AS z ON z."Name" = d."Location" AND z."Region" = i."Id" ) AS s ON s."ObjectId" = t."ObjectId" WHEN NOT …

3
現在の年を除くすべてをアーカイブし、同時にテーブルをパーティション分割する最良の方法は何ですか
仕事 大きなテーブルのグループから、13か月のローリング期間を除くすべてをアーカイブします。アーカイブされたデータは別のデータベースに保存する必要があります。 データベースは単純復旧モードです テーブルは50ミリ行から数十億行で、場合によってはそれぞれ数百GBを占有します。 テーブルは現在パーティション化されていません 各テーブルには、増え続ける日付列に1つのクラスター化インデックスがあります 各テーブルには、さらに1つの非クラスター化インデックスがあります テーブルに対するすべてのデータ変更は挿入です 目標は、プライマリデータベースのダウンタイムを最小限に抑えることです。 サーバーは2008 R2 Enterpriseです 「アーカイブ」テーブルには約11億行、「ライブ」テーブルには約4億行が含まれます。明らかに、アーカイブテーブルは時間とともに増加しますが、ライブテーブルも合理的に急速に増加することを期待しています。少なくとも次の数年で50%と言います。 Azureストレッチデータベースについて考えていましたが、残念ながら2008 R2にあり、しばらくそこに留まる可能性があります。 現在の計画 新しいデータベースを作成する 新しいデータベースに(変更日を使用して)月ごとにパーティション分割された新しいテーブルを作成します。 直近の12〜13か月分のデータをパーティションテーブルに移動します。 2つのデータベースの名前変更スワップを行う 移動したデータを現在の「アーカイブ」データベースから削除します。 「アーカイブ」データベースの各テーブルをパーティション分割します。 パーティションスワップを使用して、将来データをアーカイブします。 アーカイブするデータをスワップアウトし、そのテーブルをアーカイブデータベースにコピーし、それをアーカイブテーブルにスワップする必要があることを理解しています。これは許容範囲です。 問題: データを初期パーティションテーブルに移動しようとしています(実際、まだデータの概念実証を行っています)。私はTF 610(データロードパフォーマンスガイドに従って)とINSERT...SELECTステートメントを使用して、データを最小限に記録されると最初に考えて移動しようとしています。残念ながら、私が試すたびに完全にログに記録されます。 この時点で、SSISパッケージを使用してデータを移動することが最善の策だと考えています。200個のテーブルと、スクリプトでできることはすべて簡単に生成して実行できるため、これを回避しようとしています。 私の一般的な計画で不足しているものはありますか?SSISは、ログを最小限に抑えてデータをすばやく移動するための最善の策です(スペースの問題)? データなしのデモコード -- Existing structure USE [Audit] GO CREATE TABLE [dbo].[AuditTable]( [Col1] [bigint] NULL, [Col2] [int] NULL, [Col3] [int] NULL, [Col4] [int] …

1
SQL Serverにパッチは適用されますか?
SQL Serverインスタンスにパッチが適用されているかどうかを確認するにはどうすればよいですか?サーバーに利用可能なパッチがあるかどうかを識別するネイティブ機能はありますか?ちなみに、バージョンデータさえ入手できますか?
23 sql-server 

1
MacでUTF-8エンコードされたSQLデータベースをローカルにインポートできない
確認済みのUTF-8でエンコードされたSQLデータベースをMacのSequel Proにインポートしていたときに、このエラーが途中でスローされました: 選択したエンコード(自動検出-Unicode(UTF-8))で読み取れないため、ファイルの読み取り中にエラーが発生しました。 1273件のクエリのみが実行されました。 これは、データベースファイルが元々Windowsマシンからのものであり、改行が詰め込まれているためですか? サーバーへのファイル転送で同じデータベースを送信しようとしても、このエラーが発生することを想像して、エンコードを修正するにはどうすればよいですか? -- MySQL dump 10.13 Distrib 5.5.40-36.1, for Linux (x86_64) -- -- Host: localhost Database: ***** -- ------------------------------------------------------ -- Server version 5.5.40-36.1-log /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */; /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET …

1
修正不可能な空間インデックスの破損は正常と見なされますか?
破損を報告する空間インデックスがありDBCC CHECKDBます: DBCC CHECKDB(MyDB) WITH EXTENDED_LOGICAL_CHECKS, DATA_PURITY, NO_INFOMSGS, ALL_ERRORMSGS, TABLERESULTS 空間インデックス、XMLインデックス、またはインデックス付きビュー 'sys.extended_index_xxx_384000'(オブジェクトID xxx)には、ビュー定義が生成するすべての行が含まれていません。これは、必ずしもこのデータベース内のデータの整合性の問題を表しているわけではありません。 空間インデックス、XMLインデックス、またはインデックス付きビュー 'sys.extended_index_xxx_384000'(オブジェクトID xxx)には、ビュー定義によって生成されなかった行が含まれています。これは、必ずしもこのデータベース内のデータの整合性の問題を表しているわけではありません。 CHECKDBは、テーブル 'sys.extended_index_xxx_384000'(オブジェクトID xxx)で0の割り当てエラーと2つの一貫性エラーを検出しました。 修理レベルはrepair_rebuildです。 インデックスを削除して再作成しても、これらの破損レポートは削除されません。なしでEXTENDED_LOGICAL_CHECKSはなくてDATA_PURITYエラーが報告されていません。 また、CHECKTABLECIのサイズは30 MBで、約3万行ありますが、このテーブルには45分かかります。そのテーブルのすべてのデータはポイントgeographyデータです。 この動作はどのような状況でも予想されますか?「これは必ずしも整合性の問題を表しているわけではありません」と書かれています。私はどうしたらいいですか?CHECKDB失敗しています。これは問題です。 このスクリプトは問題を再現します: CREATE TABLE dbo.Cities( ID int NOT NULL, Position geography NULL, CONSTRAINT PK_Cities PRIMARY KEY CLUSTERED ( ID ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, …

4
Windows認証を使用すると、SQL Server Management Studioの接続が遅くなるかタイムアウトになる
Windows認証を使用してTCP経由でSQL Server 2012インスタンスに接続しようとすると、SQL Server Management Studio 2014で非常に長い遅延(10〜30秒)が発生します。これは、オブジェクトエクスプローラーまたは新しい空のクエリウィンドウを接続するときに発生します。接続すると、クエリの実行が高速になります。SQL Server認証を使用して接続する場合、問題は発生しません。 環境: Windows 7、ドメインユーザーとしてログイン IPアドレスを介したTCP接続(ホスト名ではない) サーバーは、VPN経由で接続されたリモートロケーションにあります 暗号化なし ドメインアカウントで同僚のWindows 7コンピューターにログインし、同じVPNを介して同じSQL Serverに接続した場合、遅延はありませんでした。同じ同僚が自分のドメインアカウントでPCにログインすると、遅延が発生しました。これらのテストは、問題が私のPCに固有であることを示しています。また、この特定のSQL ServerおよびVPNに接続するときにのみ問題が発生します。Windows認証を介して、ローカルネットワーク上の他のSQL Serverに遅滞なく接続できます。 私が成功せずに試したもの: 無効化されたウイルス対策およびファイアウォール 「%userprofile%\ AppData \ Roaming \ Microsoft \ SQL Server Management Studio」の下の「12.0」フォルダーの名前を「_12.0」に変更して、SSMSにユーザー設定を再作成させました。 ネットワークプロトコルをTCPではなくTCPに強制します<default>。名前付きパイプも試しましたが、サーバーはそのためにセットアップされていません。 SSMS 2012をインストールし、2014の代わりに試してみました。 無効なIPv6 etc \ hostsファイルでcrl.microsoft.comを127.0.0.1にブラックホールしました。 SSMS、Visual Studio、およびWindowsのカスタマーエクスペリエンス向上プログラムを無効にしました。 すべてのSQL Server関連アプリをPCからアンインストールし、2012年に再インストールしました。 TCPViewの手がかり: TCPViewを使用して、新しい接続を作成するとすぐに状態がESTABLISHEDになりますが、SQL Serverとの1つまたは2つ以上の接続が継続的に試行され、TIME_WAITで閉じられることに気付きました。同僚のコンピューターでは、これらの接続は確立されており、しっかりしています。だから、これがタイムアウトの原因であると確信していますが、接続は何のためであり、なぜ失敗するのですか?(SSMSにはアドオンがありません。) 何か案は? 更新:Intellisense /オートコンプリートの手掛かり(?): ついに接続したら、Intellisense …

5
DMVから、接続がApplicationIntent = ReadOnlyを使用したかどうかを確認できますか?
Always On可用性グループがセットアップされており、ユーザーが接続文字列でApplicationIntent = ReadOnlyを使用していることを確認したい。 DMV(または拡張イベントなど)を介してSQL Serverから、ユーザーが接続文字列でApplicationIntent = ReadOnlyで接続したかどうかを確認できますか? 接続を防止する方法については答えないでください-それはこの質問の目的ではありません。適切な文字列なしで接続している既存のアプリケーションがあるため、単純に接続を停止することはできません。どのアプリケーションであるかを知る必要があります。 ユーザーが複数のアプリケーションを持っていると仮定します。たとえば、ボブはSQL Server Management StudioおよびExcelに接続します。彼は、更新を行う必要があるときにSSMSに接続し、読み取りを行う必要があるときにExcelに接続します。彼がExcelに接続するときにApplicationIntent = ReadOnlyを使用していることを確認する必要があります。(これは正確なシナリオではありませんが、説明するには十分です。)

2
プロセスID、プロセス名、ログイン時間、ユーザー、開始時間、継続時間を含む長時間実行クエリを見つけるにはどうすればよいですか
長期実行クエリの詳細については、誰でも私を助けることができますか?ProcessID、プロセス名、データベース、ホスト、ユーザー、プロセスログイン時間、クエリ開始時間、クエリ期間。 このデータを提供するクエリまたはSPを探しています。
23 sql-server 

2
SQL ServerのREAD COMMITTED SNAPSHOTとSNAPSHOT
この質問は、データベース管理者のStack Exchangeで回答できるため、Stack Overflowから移行されました。 6年前に移行され ました。 私はSQL Server READ COMMITTED SNAPSHOTとSNAPSHOT分離レベルの違いを調査していて、次のリソースに出会いました。 行バージョン管理ベースの分離レベルの選択 ほとんどのアプリケーションでは、次の理由から、スナップショットアイソレーションよりも行バージョン管理を使用したコミットコミットアイソレーションをお勧めします。 スナップショット分離よりも少ないtempdbスペースを消費します。 スナップショットアイソレーションは、行のバージョン管理を使用した読み取りコミットアイソレーションには適用できない更新の競合に対して脆弱です。スナップショット分離で実行されているトランザクションがデータを読み取ってから別のトランザクションで変更されると、スナップショットトランザクションによる同じデータへの更新により更新の競合が発生し、トランザクションが終了してロールバックされます。これは、行のバージョン管理を使用した読み取りコミット分離の問題ではありません。 私はこれらのトピックにやや不慣れですが、上記のリンクから2つの箇条書きを理解できないようです。 これらのモードでtempdbスペースが異なるのはなぜですか?一方は他方よりも詳細なバージョン管理を保存しますか? スナップショット分離は、更新の競合に対してより脆弱なのはなぜですか?



1
テーブルモデルのトップ10を計算/保存する方法は?
ユーザーがPowerView経由でアクセスできるように、SSASテーブルモデルを最近作成しました。TotalActiveItems式を使用して取得するファクトテーブルの1つにメジャーがあります。 TotalActive:=COUNTAX(FILTER('Stats', ISBLANK([DeactDate]) = TRUE), 1) これは必要に応じてうまくいきますが、今では毎月のトップ10の親を取得するリクエストがありTotalActiveます。 参考のため、ここにモデルの一部を示します。 create table factStats ( StatsID INT IDENTITY NOT NULL PRIMARY KEY, DevID INT NOT NULL, DeactDate DATETIME NULL, BillDateTimeID BIGINT NOT NULL, CustID INT NOT NULL, ParentID INT NOT NULL ); create table dimCust ( CustID INT NOT NULL PRIMARY KEY, CustName …

6
ユーザーがメンバーになっているすべてのロール(継承されたロールを含む)を取得する方法は?
2つのPostgresqlデータベースグループ、「authors」と「editors」、および2人のユーザー、「maxwell」と「ernest」があるとします。 create role authors; create role editors; create user maxwell; create user ernest; grant authors to editors; --editors can do what authors can do grant editors to maxwell; --maxwell is an editor grant authors to ernest; --ernest is an author maxwellが属するロール(できればそれらのoid)のリストを返すパフォーマント関数を作成したいと思います。次のようなものです。 create or replace function get_all_roles() returns oid[] ... maxwell、authors、editorのoidを返す必要があります(ただし、ernestではありません)。 …

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