データベース管理者

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

3
「プレビューモード」のデータベースストアドプロシージャ
私が使用しているデータベースアプリケーションのかなり一般的なパターンは、「プレビューモード」を持つレポートまたはユーティリティのストアドプロシージャを作成する必要があることです。そのようなプロシージャが更新を行う場合、このパラメータはアクションの結果が返されるべきであることを示しますが、プロシージャは実際にデータベースの更新を実行するべきではありません。 これを実現する1つの方法ifは、パラメーターのステートメントを記述するだけで、2つの完全なコードブロックを作成することです。1つは更新を実行してデータを返し、もう1つはデータを返すだけです。しかし、これは、コードの重複と、プレビューデータが実際に更新で発生することを正確に反映しているという比較的低い信頼度のため、望ましくありません。 次の例では、トランザクションセーブポイントと変数(一時テーブルとは対照的に、トランザクションの影響を受けない)を活用して、ライブ更新モードとしてプレビューモードのコードの単一ブロックのみを使用しようとします。 注:トランザクションのロールバックは、このプロシージャコール自体がトランザクションにネストされている可能性があるため、オプションではありません。これはSQL Server 2012でテストされています。 CREATE TABLE dbo.user_table (a int); GO CREATE PROCEDURE [dbo].[PREVIEW_EXAMPLE] ( @preview char(1) = 'Y' ) AS CREATE TABLE #dataset_to_return (a int); BEGIN TRANSACTION; -- preview mode required infrastructure DECLARE @output_to_return TABLE (a int); SAVE TRANSACTION savepoint; -- do stuff here INSERT INTO dbo.user_table (a) …
15 sql-server  t-sql 

1
MySQLに「プロシージャの作成または置換」の代替手段はありますか?
MySQL用の「プロシージャの作成または置換」のバージョンはありますか?ストアドプロシージャが存在するというエラーメッセージを表示せずに、再コンパイルする前に、これを実行したり、プロシージャの削除をスクリプト化することはできないようです。 DELIMITER $$ -- would love to be able to drop procedure if exists db.sp_tmp_90days; -- or use "create or replace" create procedure db.sp_tmp_90days() BEGIN drop table db.tmp_90days; create table db.tmp_90days ( user_name varchar(128), first_name varchar(50), last_name varchar(50), system varchar(10), last_login datetime ); alter table db.tmp_90days add index idx_user_name(user_name); alter …

1
追加のDBAの必要性を証明または反証する指標
現在、私と他の1人のDBAが2人いて、両方とも追加のリソース(または2人)が必要だと感じています。私はこのトピックについて直接マネージャーと数回話をしましたが、概念を売り込むのに苦労しています。最近、マネージャーが私たちと共有したいことは、私たちがやりたいことややりたいことの「ソフトバリュー」リストを考え出すのは本当に良いことですが、本当に役立つのは「ハードバリュー」を考え出すことです。ドルの節約を示しています。 私たちの認識されたニーズが正当なものであるかどうかを最初に理解する際に私を助けてください。会社のお金を節約するために必要なことを考え出すことができると思いますが、それは優先順位リストの先頭に置かれるだけで、その過程で私たちにもっと多くのストレスを与えます。 私たちの環境を高レベルで見るために、私たちがサポートを提供しているものに関して私が見ているものを以下に示します。 本番サーバー– 30+ 本番データベース– 200+ SQLバージョン– 2008 / 2008R2 / 2012、現在2014年、2016年中に調査 アプリケーション(サードパーティおよび自家成長)– 20+ アプリケーションチームのサポート– 6 仮想化– 75%仮想化された25%の物理 クラスター–計画中の レプリケーションが3つ以上–配布サーバーが1つ、サブスクリプションサーバーが2つ、サブスクリプションが24つ、パブリケーションサーバーが6 つ。計画された 可用性グループ–現時点ではありませんが、可能性を探る バージョン変更またはDBAリソースを促進する年間平均アプリケーションアップグレード/インストール– 2-3 パッチ適用(SP、CU)–問題が発生しない限り現時点では存在しません。累積データベースサイズ– 14TB + レポートサーバー– 2台のサーバーで構成される1つのスケールアウト展開。SSRS 分析サーバーに精通している人どちらもSSASに精通していない 追加のDBAの必要性を証明または反証するために、どのメトリックを使用する必要がありますか? 私の当初の意図は、現在のキャパシティと計画されたプロジェクトおよび繰り返しタスクを実証することでしたが、追加のリソースを雇用する際のROIを実証する必要があります。

1
SQL Server 2014 COUNT(DISTINCT x)は、列xの統計密度ベクトルを無視します
以下のためにCOUNT(DISTINCT)〜10億の異なる値を持っている、私は約3万行を持っていると推定ハッシュ集計でクエリプランを取得しています。 なんでこんなことが起こっているの?SQL Server 2012は適切な見積もりを生成しますが、これはSQL Server 2014のバグであり、Connectで報告する必要がありますか? クエリと貧弱な見積もり -- Actual rows: 1,011,719,166 -- SQL 2012 estimated rows: 1,079,130,000 (106% of actual) -- SQL 2014 estimated rows: 2,980,240 (0.29% of actual) SELECT COUNT(DISTINCT factCol5) FROM BigFactTable OPTION (RECOMPILE, QUERYTRACEON 9481) -- Include this line to use SQL 2012 CE -- Stats for …

1
このクエリを実行するには、リソースプールのデフォルトにシステムメモリが不足しています
Windows Server 2012でSQL Server 2014-12.0.2269.0(X64)を使用していますが、メモリの問題が発生しています。かなり「重い」計算を行っているストアドプロシージャを実行すると、10分程度でエラーが発生します。 このクエリを実行するには、リソースプール「デフォルト」にシステムメモリが不足しています。 私のSQL Serverには複数のデータベースがあります(15などですが、常に同時に使用されるわけではありません)。(エラーが発生した後)SQL Serverログファイルを調べましたが、次のような行がたくさんありました。 2015-12-17 12:00:37.57 spid19sリソースプール 'default'のメモリが不十分なため、データベース 'Database_Name'のページ割り当てを許可していません。詳細については、「http://go.microsoft.com/fwlink/?LinkId=330673」を参照してください。 レポートは、各コンポーネントが使用するメモリとともにログに生成されます(私は思う)。レポートを正しく解釈すると、によって大量のメモリが消費されていることがわかりMEMORYCLERK_SQLBUFFERPOOLます。ここでレポートを見つけることができます:http : //pastebin.com/kgmk9dPH また、同じ「結論」を示すグラフを含むレポートを生成しました。 他にも役立つレポートがあります。 ログにもこのエラーが表示されていることに注意してください。 2015-12-17 12:04:52.37 spid70データベースのメモリ負荷のためにページの割り当てに失敗しました:FAIL_PAGE_ALLOCATION 8 サーバーのメモリに関する情報は次のとおりです。 サーバーの合計メモリ:16 Gb SQLサーバーに割り当てられたメモリ:12288 Mb 使用中の物理メモリ(からsys.dm_os_process_memory):9287 Mb それが役立つ場合、サーバーはSharePointデータベースをホストしません。

2
PostgreSQLの再帰的な子孫の深さ
祖先の子孫の深さを計算する必要があります。レコードにがある場合、レコードはobject_id = parent_id = ancestor_idルートノード(祖先)と見なされます。WITH RECURSIVEPostgreSQL 9.4でクエリを実行しようとしています。 データや列を制御しません。データおよびテーブルスキーマは外部ソースから取得されます。テーブルは継続的に成長しています。現在、1日あたり約3万件の記録があります。ツリー内のノードは欠落している可能性があり、ある時点で外部ソースからプルされます。彼らは通常引き込まれますcreated_at DESC順番にますが、データは非同期のバックグラウンドジョブでプルされます。 最初はこの問題に対するコードソリューションがありましたが、現在は500万行以上あり、完了するまでに約30分かかります。 テーブル定義とテストデータの例: CREATE TABLE objects ( id serial NOT NULL PRIMARY KEY, customer_id integer NOT NULL, object_id integer NOT NULL, parent_id integer, ancestor_id integer, generation integer NOT NULL DEFAULT 0 ); INSERT INTO objects(id, customer_id , object_id, parent_id, ancestor_id, generation) VALUES …

2
DDL_adminとdb_ownerのアクセス許可
サーバーファーム全体のすべてのデータベースユーザーのアクセス許可を削除および制限するプロジェクトを引き継ぎます。(楽しい時間) 現在制限されている権限の1つはdb_owner権限です。 この権限はケースバイケースでレビューされていますが、一般的な変更はdb_owner権限を次のものに置き換えることです。 db_datareader db_datawriter db_ddladmin db_executor (クライアントに知らせるために)2つの違いを正確に定義したいと思います。 ただし、私が知る限り、この2つの違いは次のとおりです。 db_accessadminパーミッション db_backupoperatorパーミッション db_securityadmin権限 だから、実際には、彼らは失うことになります: [ALTER ANY USER] [CREATE SCHEMA] [BACKUP DATABASE]、[BACKUP LOG]、[CHECKPOINT] [ALTER ANY APPLICATION ROLE]、[ALTER ANY ROLE] [DROP DATABASE] db_ownerが上記の4つのロールに置き換えられると、ユーザーが失うものは他にありますか? これは実際にはセキュリティ上の目的の多くを果たしていますか?

5
10-20のSQL Serverデータベースを〜同期状態にバックアップおよび復元しますか?
10〜50 GBのサイズの10〜20個のSQL Server 2008 R2データベースをオンラインでバックアップし、単一のエンタープライズアプリで同時に使用する必要があります。また、すべてのデータベースでほぼ同期された状態にそれらを復元する必要があります(データベース間で最大数秒の非同期が可能です)。目的は、QA / DEV環境の実稼働データをキャプチャすることです。 データベースを完全復旧で実行することを要求せず、QA環境のデータをキャプチャするための専用のバックアップ方法を考え、私の制御下にないメインのバックアッププロセスに依存しないことを強く望みます。 私の顧客の場合、それぞれ最大30 GBで20の完全バックアップをキャプチャするのに1〜2時間かかります。これにより、単純なリカバリで実行する場合にデータベースの同期がとれすぎるため、フルバックアップを連続して取得することは受け入れられなくなります。 私はこれらよりも良いアイデアを探しています: アイデア1:VMディスクのSANレベルのスナップショット。スナップショットからMDF / LDFをxcopyします。 コピーされたファイルが別のサーバーインスタンスにアタッチされると、その回復プロセスにより、ほぼ同時にスナップショットである一貫性のあるデータベースが作成されます。 少なくとも私がmaster / msdb / etcに対してdesyncを取得する可能性があるため、グーグルでこれが悪い考えだと確信しました。 アイデア2:複雑なバックアップを調整し、すべてのデータベースで同期復元 これには、データベースを完全復旧で実行する必要がありますが、これは望ましくありません。期限(T0)のかなり前に、すべてのデータベースの並列バックアップを開始します。T0に達したら、すべてのログをバックアップします(最大で数分かかります)。結果として得られる無数のバックアップを取り、それらを復元し、ログをロールバック/ロールバックして、T0に対してデータベース全体である程度一貫した状態を取得します。 これを確実に使用するには多くの計画とスクリプトが必要なので、それを避けるためにかなりの時間を費やします。 他の解決策がありませんか? PS1:db snapshotsを使用できるようになりたいと思っていました。アイデアは、各データベースでスナップショットを開始し(数秒で終了する必要があります)、その後、次の分/時間にわたって順番に完全にバックアップします。次に、それらすべてを別のサーバーに復元し、それぞれをスナップショットに戻します。スナップショットはデータベースと一緒にバックアップできないため、このシナリオは不可能です。それらは、作成されたサーバー上の所定の場所にのみロールバックできます。さらに、これらにはEnterprise Editionが必要ですが、これは私がすべての顧客に提供しているわけではありません。 PS2:クロスデータベース同期バックアップを作成できるサードパーティのソリューションをご存知の場合は、そのことをお知らせください。

4
パッケージ内のエラーを見つけるためにSSISDBを照会する方法は?
私はこの質問を見てきました SSIS 2012-T-SQLで現在実行中のパッケージをクエリする方法? 次のスクリプトを提供します。 SELECT E.execution_id , E.folder_name , E.project_name , E.package_name , E.reference_id , E.reference_type , E.environment_folder_name , E.environment_name , E.project_lsn , E.executed_as_sid , E.executed_as_name , E.use32bitruntime , E.operation_type , E.created_time , E.object_type , E.object_id , E.status , E.start_time , E.end_time , E.caller_sid , E.caller_name , E.process_id , E.stopped_by_sid …

4
SQL Serverの最大メモリ、ページファイル、最大並列度
3つの質問は、宇宙のDBAマスターが答えられることを願っています: SQL Serverの最大メモリを設定することがベストプラクティスであることは知っています。したがって、44 GB RAMのサーバーにSQL Serverがインストールされている場合、SQL Serverの最大メモリを約37 GBに設定する必要があります。 しかし、SQL Analysis ServiceとSQL Reporting ServicesがSQL Serverと同じサーバーにインストールされている場合、何を設定する必要がありますか?SQL Serverの最大メモリを22GB RAMに設定して、分析で他の22GB RAMを使用できるようにした方が良いでしょうか? 44 GB RAMのSQL Serverを実行しているサーバーで、ページファイルサイズを設定するためのベストプラクティスは何ですか?私はブレント・オザール(http://www.brentozar.com/archive/2014/06/sql-server-setup-checklist-free-ebook-download/)で以下を読みました: SQL Serverは、巨大なページファイルを必要としません。サーバーに他のアプリケーションをインストールする場合(これはお勧めしません-SQL Serverは分離する必要があります)。より大きなページファイルが必要になる場合があります。ボックスで実行されている主要なサービスがSQL Serverのみである場合、通常、システムドライブに2GBサイズのページファイルを作成します。 Microsoftは、Remusが提供するアドバイスに一致するRAMの1.5倍に管理されるページファイルシステムを設定する必要があると述べています(参照-> http://rusanu.com/2009/11/22/system-pagefile-size-on-machines-with -large-ram /)。 したがって、44GB RAMを搭載したサーバーには、SQL Analysis ServiceとSQL Reporting Servicesの隣にSQL Serverがインストールされています。ページファイルをどのサイズに設定する必要がありますか? SharePointの場合、SharePointファームの一部であり、SharePointがデータベースを格納するSQL Serverは、1に最大並列度を設定する必要があります。これで、SharePointファームの一部ではないサーバー(sql2) SQL Server、SQL Analysis、およびReportingがインストールされているサーバー。SharePointはこのサーバーにデータベースを保存しませんが、SharePointが読み書きするレポートおよび分析データベース/キューブが作成されています。 ブレントオザール言う: 経験則:これを、ハードウェア上の単一のNUMAノード(プロセッサ)ソケットの物理コアの数以下に設定します 4つのVCPUがある場合、このSQL Serverインスタンスで最大限の並列処理を実現するには、何を構成する必要がありますか? 皆さんが私だけでなく、インターウェブのジャングルよりも多くのSQL管理者がベストプラクティスについてもう少し洞察を与えてくれることを願っています。

2
結合ヒントを追加すると、SQL Serverの行の見積もりが変更されるのはなぜですか?
私はいくつかのテーブルを結合し、かなり悪いパフォーマンスを発揮するクエリを持っています-行の推定はかなり(1000回)オフであり、ネストされたループ結合が選択され、複数のテーブルスキャンが発生します。クエリの形状は非常に単純で、次のようになります。 SELECT t1.id FROM t1 INNER JOIN t2 ON t1.id = t2.t1_id LEFT OUTER JOIN t3 ON t2.id = t3.t2_id LEFT OUTER JOIN t4 ON t3.t4_id = t4.id WHERE t4.id = some_GUID クエリをいじると、結合の1つにMerge結合を使用するようにヒントを出すと、実行が何倍も速くなることに気付きました。これは理解できます-結合結合は、結合されるデータにとってより良いオプションですが、SQL Serverはネストされたループを選択するだけでは正しく推定しません。 私が完全に理解していないのは、この結合ヒントがすべてのプラン演算子のすべての推定値を変更する理由です。さまざまな記事や本を読んで、計画を構築する前にカーディナリティの推定が実行されると想定したため、ヒントを使用しても推定は変更されず、SQL Serverに特定の物理結合実装を使用するよう明示的に指示します。 ただし、Mergeヒントを使用すると、すべての推定がほぼ完璧になります。なぜこれが起こるのか、ヒントなしでクエリオプティマイザーがより良い推定を行う一般的な手法はありますか?統計が明らかにこれを許可していることを考慮して? UPD:匿名化された実行計画はここにあります:https : //www.dropbox.com/s/hchfuru35qqj89s/merge_join.sqlplan ? dl = 0 https://www.dropbox.com/s/38sjtv0t7vjjfdp/no_hints_join.sqlplan?dl = 0 TF 3604、9202、9204を使用して両方のクエリで使用される統計情報を確認しましたが、これらは同じです。ただし、スキャン/シークされるインデックスはクエリによって異なります。 それに加えて、クエリを実行しようとしましたOPTION …

2
null列は主キーの一部になりますか?
SQL Server 2012データベースを開発していますが、One-to-Zero-Or-Oneの関係について質問があります。 2つのテーブルがCodesありHelperCodesます。コードには、ゼロまたは1つのヘルパーコードを含めることができます。これは、これら2つのテーブルとそれらの関係を作成するSQLスクリプトです。 CREATE TABLE [dbo].[Code] ( [Id] NVARCHAR(20) NOT NULL, [Level] TINYINT NOT NULL, [CommissioningFlag] TINYINT NOT NULL, [SentToRanger] BIT NOT NULL DEFAULT 0, [LastChange] NVARCHAR(50) NOT NULL, [UserName] NVARCHAR(50) NOT NULL, [Source] NVARCHAR(50) NOT NULL, [Reason] NVARCHAR(200) NULL, [HelperCodeId] NVARCHAR(20) NULL, CONSTRAINT [PK_Code] PRIMARY KEY CLUSTERED ( …

2
空の列値は、入力された列値と同じストレージスペースを占有しますか?
2列のテーブルがあります。両方の列のタイプはに設定されvarchar(38)ます。列の1つに空の値を持つ行を作成する場合、値が空でない場合と同じストレージスペースが必要ですか? 言い換えると、MySQLは行の作成時に列のストレージスペースを(そのタイプに応じて)予約しますか?

1
ユーザー共有クエリ:動的SQLとSQLCMD
foo.sqlDB技術サポートのチームが共有する多数のクエリをリファクタリングして文書化する必要があります(顧客の構成など)。各顧客が独自のサーバーとデータベースを持っている場合に定期的に来るチケットの種類がありますが、それ以外はスキーマは全面的に同じです。 現時点では、ストアドプロシージャはオプションではありません。私は動的またはSQLCMDのどちらを使用するかを議論しています。SQLServerを少し使い始めたばかりなので、どちらもあまり使用していません。 SQLCMDスクリプティング私は間違いなく「見た目」がきれいで、必要に応じてクエリを読みやすく、小さな変更を加えやすいと感じていますが、ユーザーにSQLCMDモードを強制的に有効にします。文字列操作を使用して記述されたクエリにより、構文の強調表示が失われるため、動的はより困難になります。 これらは、Management Studio 2012、SQLバージョン2008R2を使用して編集および実行されています。どちらの方法の長所/短所、またはいずれかの方法でのSQL Serverの「ベストプラクティス」の一部は何ですか?それらの1つは他よりも「安全」ですか? 動的な例: declare @ServerName varchar(50) = 'REDACTED'; declare @DatabaseName varchar(50) = 'REDACTED'; declare @OrderIdsSeparatedByCommas varchar(max) = '597336, 595764, 594594'; declare @sql_OrderCheckQuery varchar(max) = (' use {@DatabaseName}; select -- stuff from {@ServerName}.{@DatabaseName}.[dbo].[client_orders] as "Order" inner join {@ServerName}.{@DatabaseName}.[dbo].[vendor_client_orders] as "VendOrder" on "Order".o_id = "VendOrder".vco_oid where "VendOrder".vco_oid …

2
スカラー値の関数に選択ではなく実行権限が必要なのはなぜですか?
スカラー値関数の場合、選択だけでなく実行をユーザーに許可しなければならないのはなぜだろうか? 一方、テーブル値関数は、選択権限またはdb_datareaderメンバーシップのみで問題なく機能します。 ここでより明確にするのは私の例です:データベースへの読み取り専用権限を持つユーザーが必要です。という名前のユーザーを作成し、メンバーシップtestUserを付与しdb_datareaderます。次に、というテーブル値関数を作成しましたfn_InlineTable。そしてすべてが素晴らしいです。testUserこのSQLを終日実行します select * from dbo.fn_InlineTable その後、スカラー関数が必要なので、というスカラー関数を作成しましたfn_ScalarTest。 testUserこのSQLを実行できません Select dbo.fn_ScalarTest(1) 当然のことながら、実行するための "testUser"アクセス許可を与えていないためfn_ScalarTestです。 私の質問は次のとおりです:このリンクに基づいて/programming/6150888/insert-update-delete-with-function-in-sql-server、FUNCTIONデータベースの状態を変更するアクションを実行するために使用することはできません。では、実行許可ではなく、同じ「SELECT」許可でスカラー関数を使用させないのはなぜですか? 私の質問が理にかなっていることを願っています。ありがとうございました。

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