データベース管理者

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

2
同じSELECTリスト内の列エイリアスを参照する
古いMS-AccessベースのシステムをPostgreSQLに変換しています。Accessでは、SELECTで作成されたフィールドは、次のように、後のフィールドの方程式の一部として使用できます。 SELECT samples.id, samples.wet_weight / samples.dry_weight - 1 AS percent_water, 100 * percent_water AS percent_water_100 FROM samples; PostgreSQLでこれを行うと、Postgresはエラーをスローします。 エラー:列「percent_water」は存在しません。 サブ選択から選択することで、これを回避する方法は次のとおりです。 SELECT s1.id, s1.percent_water, 100 * s1.percent_water AS percent_water_100 FROM ( SELECT samples.id, samples.wet_weight / samples.dry_weight - 1 AS percent_water FROM samples ) s1; 複雑なネストを回避するための最初のコードブロックのようなショートカットはありますか?私は単に言うこともできます100 * (samples.wet_weight / samples.dry_weight - 1) …

1
SQL Server 2014:一貫性のない自己結合カーディナリティの推定値についての説明はありますか?
SQL Server 2014の次のクエリプランを検討してください。 クエリプランでは、自己結合ar.fId = ar.fIdにより1行の推定値が得られます。しかし、これは論理的に矛盾する推定値は、次のとおりar有する20,608行とのちょうど1つの異なる値fId(正確に統計に反映します)。したがって、この結合は行(~424MM行)の完全な外積を生成し、クエリを数時間実行します。 SQL Serverが統計と矛盾していることが非常に簡単に証明できる見積もりを思い付く理由を理解するのに苦労しています。何か案は? 初期調査と追加の詳細 ここでのPaulの回答に基づくと、結合のカーディナリティを推定するためのSQL 2012とSQL 2014の両方のヒューリスティックは、2つの同一のヒストグラムを比較する必要がある状況を簡単に処理できるようです。 トレースフラグ2363からの出力から始めましたが、それを簡単に理解できませんでした。以下は、SQL Serverがためにヒストグラムを比較していることを意味スニペットないfIdとbIdだけその用途に参加の選択を推定するためにfId?もしそうなら、それは明らかに正しくないでしょう。または、トレースフラグの出力を読み間違えていますか? Plan for computation: CSelCalcExpressionComparedToExpression( QCOL: [ar].fId x_cmpEq QCOL: [ar].fId ) Loaded histogram for column QCOL: [ar].bId from stats with id 3 Loaded histogram for column QCOL: [ar].fId from stats with id 1 Selectivity: 0 完全な再現スクリプトに含まれ、このクエリをミリ秒にまで下げるいくつかの回避策を思いついたことに注意してください。この質問は、動作の理解、今後のクエリでの動作の回避方法、およびMicrosoftに提出する必要があるバグかどうかの判断に焦点を当てています。 ここで完全なREPROスクリプトは、ここにあるトレースフラグ2363年からフル出力は、ここであなたがすぐにいっぱいスクリプトを開くことなく、それらを見たい場合はクエリとテーブル定義は次のとおりです。 …

6
データベース全体でのGETDATE()の使用の変更
オンプレミスのSQL Server 2017データベースをAzure SQLデータベースに移行する必要がありますが、かなりの制限事項があるため、いくつかの課題に直面しています。 特に、Azure SQLデータベースはUTC時間(タイムゾーンではない)でのみ機能し、現地時間を必要とするため、データベース内のGETDATE() すべての場所の使用を変更する必要があります。 私のタイムゾーンで正しく機能するローカル時間を取得するために、ユーザー定義関数を作成しました。 CREATE FUNCTION [dbo].[getlocaldate]() RETURNS datetime AS BEGIN DECLARE @D datetimeoffset; SET @D = CONVERT(datetimeoffset, SYSDATETIMEOFFSET()) AT TIME ZONE 'Pacific SA Standard Time'; RETURN(CONVERT(datetime,@D)); END 私が問題を抱えている問題はGETDATE()、すべてのビュー、ストアドプロシージャ、計算列、デフォルト値、その他の制約などでこの関数を実際に変更することです。 この変更を実装する最良の方法は何でしょうか? マネージドインスタンスの公開プレビュー中です。それでも同じ問題がGETDATE()発生するため、この問題は解決しません。Azureへの移行は必須です。このデータベースは、常にこのタイムゾーンで使用されます(使用されます)。

3
RANK()とDENSE_RANK()は確定的ですか、非確定的ですか?
公式のMicrosoft BOLによると、DENSE_RANKは非決定的です(RANK())。しかし、Itzik Ben-Ganによるランキング関数によると 、「... RANK()およびDENSE_RANK()関数は常に決定論的です」。誰が正しい? 私がこれまでに見つけたもの: Microsoftの定義「特定の入力値セットで呼び出され、データベースの同じ状態が与えられると、決定論関数は常に同じ結果を返します。」 したがって、集合論の表では従業員 Employee Salary Sue Right 1.00 Robin Page 1.00 Phil Factor 1.00 および従業員2 Employee Salary Phil Factor 1.00 Sue Right 1.00 Robin Page 1.00 同じだ。ただし、ランキング関数は異なる値を返します。 CREATE TABLE [dbo].[Employees]( --[ID] [int] IDENTITY(1,1) NOT NULL, [Employee] [varchar](150) NOT NULL, [Salary] [smallmoney] NULL, ) ON [PRIMARY] …
27 sql-server 

3
Ubuntuサーバーでpostgres 9.1から9.3にアップグレードする
本番サーバー(ubuntu 13.10)をpostgresql 9.1で実行しています。 9.3のいくつかの機能を使用したいので、アップグレードしたい。 ダウンタイムが30分以内になるように、誰かが9.1から9.3にアップグレードするのを手伝ってもらえますか。とか、ぐらい? 主な関心事は、データの損失やファイルの冗長性の防止です。

2
多数の行を挿入する最速の方法は何ですか?
私はデータベースをステージングテーブルにロードします。このステージングテーブルから、外部キーを解決するために1-2回結合し、この行を最終テーブル(月ごとに1つのパーティションがある)に挿入します。3か月分のデータで約34億行あります。 これらの行をファイナルテーブルにステージングする最速の方法は何ですか?SSISデータフロータスク(ビューをソースとして使用し、高速ロードがアクティブになっている)またはInsert INTO SELECT ....コマンド?データフロータスクを試してみましたが、約5時間で約10億行(サーバー上の8コア/ 192 GB RAM)を得ることができ、非常に遅いと感じました。

1
クエリがtempdbへの流出を引き起こすのはなぜですか?
バックグラウンド 私は、48 GB RAMを搭載したWin 2008サーバー上のMSSQL 2008(標準)から、64 GB RAMを搭載したWindows 2012上のMSSQL 2012(64ビットWebエディション)を実行する新しいサーバーに160 GBデータベースを移行しています。古いサーバーは稼働しており、負荷がかかっています。新しいサーバーは運用されていません。新しいサーバーには、8つのtempdbファイル(各4GB)があります。 問題 新しいサーバーでのテストでは、多数のクエリで「実行中にデータをスピルするためにtempdbを使用した演算子」という警告が表示されることがわかりました。いくつかのクエリを書き直すことでソートを回避できましたが、これは実際には問題に対処していません。古いサーバーで同じクエリを実行しても、流出は発生しません。MSSQLがメモリ内の操作を完了できず、tempdbにスピル/ページングする必要がある場合、スピルが発生することを読みました。流出を心配する必要がありますか? 例 データベースでsp_updatestatsを実行したため、統計は最新である必要がありますが、推定行数と実際の行数にいくつかの相違があることに注意してください。 メモリの懸念 64 GBの58のMSSQLの最大メモリ設定を設定しました。現在、MSSQLはこのメモリを約35GB消費していますが、ワーキングセットはわずか682MBです。古いサーバー(本番環境ではありますが、負荷を処理します)には、44gbのメモリがMSSQLにコミットされており、そのうち43.5gbがワーキングセットに含まれています。 こぼれがメモリ設定に関連している可能性があるかどうかはわかりません-誰にもアイデアがありますか?現在、MSSQLにはエーカーのRAMがありますが、なぜある種の並べ替えやハッシュの一致のためにtempdbにこぼれるのですか?

6
暗号化されたビューまたはストアドプロシージャを表示する方法
サードパーティのデータベースに取り組んでいます。 右クリックしてビューの定義を表示しようとするCREATE TOとNEW QUERY EDIT WINDOW、エラーが発生します: このオブジェクトにはこのプロパティが存在しないか、アクセス権が不十分なために取得できない可能性があります。テキストは暗号化されます。

2
100を上限とする最大接続プール
Windows Server 2008ボックスでSQL Server 2008 R2 SP1を実行しています。Visual Studio 2010から次のことを実行する.NETスクリプトを実行しています。 データベースに到達する 変更を加える 繰り返す 繰り返しの合計回数は150回ですが、100の接続で停止しているため、その理由はわかりません。単一のスレッドを使用するようにスクリプトを調整することもできますが、将来の参照のために知っておくと便利なため、最大接続設定がどこにないのかを知りたいと思います。 これまでに確認した場所は次のとおりです。 Visual Studio 2010のSQL接続文字列(1000に設定されています) SSMSデータベースインスタンスの接続プロパティ(0 [無限]のユーザー接続に設定されます) Server 2008の情報をGoogleで検索したところ、100を超える接続を処理できるようです SP_WHO2論理接続に関する詳細情報を提供するコードをステップ実行し、接続の数が52で始まり、152の論理接続で「最大プール接続に達しました」というエラーでスクリプトエラーが表示されることを確認しました。 使用する接続文字列を変更しました Data Source=PerfSQL02;Initial Catalog=Masked;Integrated Security=True;Max Pool Size=1000 他にどこを確認すればいいのかわかりません。ここには可動部品がたくさんあることは知っていますが、どこかで最大プール設定が不足しているような気がします。
27 sql-server 

4
これらのプランでは、一意のインデックスで(同じ)1000シークの推定コストが異なるのはなぜですか?
以下のクエリでは、両方の実行プランが一意のインデックスで1,000シークを実行すると推定されています。 シークは同じソーステーブルでの順序付けされたスキャンによって実行されるため、一見同じ順序で同じ値をシークする必要があります。 両方のネストされたループには <NestedLoops Optimized="false" WithOrderedPrefetch="true"> このタスクのコストが最初の計画では0.172434で、2番目の計画では3.01702である理由を誰もが知っていますか? (質問の理由は、明らかにはるかに低い計画コストのために、最初のクエリが最適化として私に提案されたためです。 ) セットアップ CREATE TABLE dbo.Target(KeyCol int PRIMARY KEY, OtherCol char(32) NOT NULL); CREATE TABLE dbo.Staging(KeyCol int PRIMARY KEY, OtherCol char(32) NOT NULL); INSERT INTO dbo.Target SELECT TOP (1000000) ROW_NUMBER() OVER (ORDER BY @@SPID), LEFT(NEWID(),32) FROM master..spt_values v1, master..spt_values v2; INSERT INTO dbo.Staging …

2
テーブルの作成時にデフォルトのテーブルスペースはどのように決定されますか?
Tablespaceテーブルを作成するときにパラメータはオプションです。 CREATE TABLE文が実行されると、Oracleはデフォルトの文が定義されていない場合はそれを割り当てます。 デフォルトのデータベースには、「USERS」テーブルスペースがあります。複数の表領域が定義されている場合、どの表領域が割り当てられますか?
27 oracle 

1
postgresql:クラスターのロールをダンプおよび復元するにはどうすればよいですか?
クラスター内のロールはどこに保存されますか、どのようにダンプしますか? dbのpg_dumpを実行し、それを別のクラスターにロードしましたが、これらのエラーがたくさん発生します。 psql:mydump.sql:3621: ERROR: role "myrole" does not exist だから明らかに私のデータベースのダンプにはロールが含まれていません。「postgres」データベースをダンプしようとしましたが、役割も表示されません。 使用する必要がありますpg_dumpall --roles-onlyか? Postgresqlバージョン8.4.8および9.1.4 OS:Ubuntu 11.04 Natty

6
SELECT DISTINCT TOP Nクエリがテーブル全体をスキャンするのはなぜですか?
SELECT DISTINCT TOP NSQL Serverクエリオプティマイザーによる最適化が不十分と思われるいくつかのクエリに遭遇しました。些細な例を考えてみましょう。2つの交互の値を持つ100万行のテーブルです。私が使用しますGetNumsのデータを生成する機能を: DROP TABLE IF EXISTS X_2_DISTINCT_VALUES; CREATE TABLE X_2_DISTINCT_VALUES (PK INT IDENTITY (1, 1), VAL INT NOT NULL); INSERT INTO X_2_DISTINCT_VALUES WITH (TABLOCK) (VAL) SELECT N % 2 FROM dbo.GetNums(1000000); UPDATE STATISTICS X_2_DISTINCT_VALUES WITH FULLSCAN; 次のクエリの場合: SELECT DISTINCT TOP 2 VAL FROM X_2_DISTINCT_VALUES OPTION (MAXDOP 1); …

4
Explainクエリで「constテーブルを読み取った後に「不可能なWHERE」に気付くのはなぜですか?
テーブルにfr(fromid、toid)のような一意の複合キーがあり、explainを使用してクエリを実行すると、次の結果が得られます。 Impossible WHERE noticed after reading const tables` 私が実行したクエリ: explain SELECT rid FROM relationship WHERE fromid=78 AND toid=60 何か助け? EDIT1: 以下のクエリを使用する場合: explain SELECT rid FROM relationship WHERE fromid=60 and toid=78 AND is_approved='s' OR is_approved='f' OR is_approved='t' 私が見るUSING WHERE代わりに、前のメッセージで、私は、クエリの下に使用する場合: explain SELECT rid FROM relationship WHERE fromid=60 and toid=78 AND (is_approved='s' OR …
27 mysql  explain 

2
MySQLはディスク上に一時テーブルを作成します。どうすれば止めることができますか?
ユーザーが現在遅いと感じるサイト(Moodle)を運営しています。私は、ディスク上に一時テーブルを作成するMySQLの問題を突き止めたと思います。created_tmp_disk_tablesMysql Workbenchサーバー管理で変数を見ると、その数は約50テーブル/秒で増加します。1日の使用後、created_tmp_disk_tables> 100kです。また、メモリは解放されていないようです。システムがほとんど使用できなくなり、MySQLを再起動するまで、使用量は増加し続けます。私はほぼ毎日それを再起動する必要があり、利用可能なメモリの約30〜35%を使用して開始し、80%で1日を終了します。 データベースにblobがなく、クエリを制御できないため、クエリを最適化することもできません。Percona Confirguration Wizardも使用しましたを使用して構成ファイルを生成しましたが、my.iniでも問題は解決しませんでした。 ご質問 MySQLがディスク上に一時テーブルを作成しないようにするには、何を変更すればよいですか?変更する必要がある設定はありますか?もっとメモリを投入する必要がありますか? MySQLがメモリを使い果たすのを止めるにはどうすればよいですか? 編集 slow_queriesログを有効にすると、クエリのSELECT GET_LOCK()ログが遅いことがわかりました。クイック検索の結果、PHP構成で永続的な接続が許可されていたことがわかりました(mysqli.allow_persistent = ON)。これをオフにしました。これにより、MySQLがメモリを消費する割合が減少しましたが、一時テーブルはまだ作成されています。 また、key_buffer sizeが十分に大きいことも確認しました。変数を見ましたkey_writes。これはゼロでなければなりません。そうでない場合、key_buffer_size.I have zero key_readsand zeroを増やすkey_writesので、key_buffer_sizeが十分に大きいます。 私は増加tmp_table_sizeし、max-heap-table-sizeテーブルがメモリに収まることができないことを示すことがありcreated_tmp_disk_tablesの増加として1024Mに。これで解決しませんでした。 参照:http : //www.mysqlperformanceblog.com/2007/08/16/how-much-overhead-is-caused-by-on-disk-temporary-tables/ 編集2 sort_merge_passesSHOW GLOBAL STATUS出力で1秒あたりの数が多い場合は、sort_buffer_size値を増やすことを検討できます。私はsort_merge_passes1時間で2つ持っていたので、sort_buffer_size十分に大きいと考えています。 参照:Mysqlマニュアル sort_buffer_size 編集3 @RolandoMySQLDBAの提案に従って、ソートバッファーと結合バッファーを変更しました。結果は下の表に表示されていますが、created_tmp_tables_on_diskまだ高いと思います。値を変更しcreated_tmp_tables_on_disk、1日(8時間)後にチェックして平均を計算した後、mysqlサーバーを再起動しました。他の提案はありますか?ある種のコンテナに収まらないものがあるように思えますが、それが何であるかを判断することはできません。 +---------------------+-------------+-------------+--------------------+ | Tmp_table_size, | Sort_buffer | Join_buffer | No of created | | max_heap_table_size | | | tmp_tables …

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