データベース管理者

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

5
2つの日付列のSARGable WHERE句
私には、SARGabilityに関する興味深い質問があります。この場合、2つの日付列の違いに関する述語を使用することです。セットアップは次のとおりです。 USE [tempdb] SET NOCOUNT ON IF OBJECT_ID('tempdb..#sargme') IS NOT NULL BEGIN DROP TABLE #sargme END SELECT TOP 1000 IDENTITY (BIGINT, 1,1) AS ID, CAST(DATEADD(DAY, [m].[severity] * -1, GETDATE()) AS DATE) AS [DateCol1], CAST(DATEADD(DAY, [m].[severity], GETDATE()) AS DATE) AS [DateCol2] INTO #sargme FROM sys.[messages] AS [m] ALTER TABLE [#sargme] ADD …

4
なぜ毎晩バックアップするシンプルリカバリモードでトランザクションログが増大し続けるのか
すぐに重複としてマークする前に、Mike Walshの「なぜトランザクションログが増え続けるか、スペースが足りないのですか?」を読みました。、しかし、それが私の状況に答えを与えたとは思わない。私は十数個の同様の質問に目を通しましたが、関連する質問のほとんどは「重複」と言って、マイクの質問を指しています。 詳細:SQL Server 2008 R2には約500MBのデータベースがあり、すべてSIMPLEリカバリモード(選択ではありません)、夜間フルバックアップ、最大200MBのデータファイル、および約300MBのログファイルがあります。ログはすぐに300MBに拡大するのではなく、数か月かけてゆっくりと拡大します。少なくともsp_who2とアクティビティモニターによれば、それらのいずれにもオープントランザクションはありません。データベースを右クリックしてプロパティを選択すると、最大50MBの空きがあることがわかります。特にバックアップ直後は、ログ全体を解放すべきではありませんか?SIMPLEモードでは、開いているトランザクションがない限り、ログは解放されませんか? log_reuse_wait_descfrom sys.databasesは「NOTHING」と言っており、上記の質問と回答に基づいて、スペースを再利用するために何も待つべきではないことを示しています。 「DBCC SHRINKFILE」を実行すると、ログファイルが1MBに縮小されるため、スペースを再利用できます。毎週ログを圧縮し、制御不能にならないように設定することはできますが、SQL Serverがそれを行う理由について混乱しています。 ログに300MBを必要とするクレイジーなトランザクションがあったかどうかはわかりますが、極端なことはしていません。基本的なOLTPだけです。マイクの質問/回答から: 単純復旧モデル-したがって、上記の概要では、最初に単純復旧モデルについて説明するのが最も簡単です。このモデルでは、SQL Serverに通知しています-クラッシュと回復の再開にトランザクションログファイルを使用しても問題ありません(実際には選択の余地はありません。ACIDプロパティを検索し、すぐに意味をなすはずです)。クラッシュ/リスタートリカバリの目的でこれが必要になったら、ログファイルを再利用してください。 SQL Serverは、シンプルリカバリでこのリクエストをリッスンし、クラッシュ/リカバリの再開に必要な情報のみを保持します。データがデータファイルに(多少なりとも)強化されているためにSQL Serverが回復できることが確認されると、強化されたデータはログに不要になり、切り捨てのマークが付けられます。つまり、再利用されます。 ログスペースを再利用する必要があると言われ続けていますが、数か月にわたるこの緩やかな成長により、そうではないようです。 私は何が欠けていますか?SQL Serverがデータを「強化された」ものとして認識し、ログを解放できないようにしているのでしょうか? (編集) アフターアクションレポート-ちょっとした知識は危険です これが「一般的な質問」であることがわかった後、7か月前に何が起こったのか、他の人々に悲しみを救うために学んだことを説明する義務があると感じました。 まず、データベースのプロパティを表示したときにSSMSに表示される使用可能な領域は、データファイルで使用可能な領域です。これを表示するには、データベースで次のコマンドを実行します。SSMSによって報告される使用可能な領域は、FileSizeMBとUsedSpaceMBの違いです。 SELECT DB.name, MF.physical_name, MF.type_desc AS FileType, MF.size * 8 / 1024 AS FileSizeMB, fileproperty(MF.name, 'SpaceUsed') * 8/ 1024 AS UsedSpaceMB, mf.name LogicalName FROM sys.master_files MF JOIN …

2
大きなPostgresSQLテーブルでCOUNT / GROUP-BYのパフォーマンスを改善しますか?
PostgresSQL 9.2を実行していますが、約6,700,000行の12列の関係があります。これには3D空間にノードが含まれ、各ノードはユーザー(作成者)を参照します。どのユーザーがいくつのノードを作成したかを照会するには、次のことを行います(詳細を追加explain analyze)。 EXPLAIN ANALYZE SELECT user_id, count(user_id) FROM treenode WHERE project_id=1 GROUP BY user_id; QUERY PLAN --------------------------------------------------------------------------------------------------------------------------- HashAggregate (cost=253668.70..253669.07 rows=37 width=8) (actual time=1747.620..1747.623 rows=38 loops=1) -> Seq Scan on treenode (cost=0.00..220278.79 rows=6677983 width=8) (actual time=0.019..886.803 rows=6677983 loops=1) Filter: (project_id = 1) Total runtime: 1747.653 ms ご覧のとおり、これには約1.7秒かかります。これは、データの量を考えるとそれほど悪くはありませんが、これを改善できるかどうかは疑問です。ユーザー列にBTreeインデックスを追加しようとしましたが、これは何の助けにもなりませんでした。 代替案はありますか? 完全を期すために、これはすべてのインデックスを備えた完全なテーブル定義です(外部キーの制約、参照、トリガーはありません)。 Column …


2
SQL Serverでは、クラスター化インデックスのみを持つテーブルでインデックスシークが強制される場合、明示的なORDER BY句を使用せずに順序を保証できますか?
この質問は、データベース管理者のStack Exchangeで回答できるため、Stack Overflowから移行されました。 4年前に移行され ました。 更新2014-12-18 主な質問に対する圧倒的な回答が「いいえ」であるため、より興味深い回答はパート2に焦点を当てています。 ORDER BYます。私はすでに答えをマークしましたが、さらに優れたパフォーマンスのソリューションがあったとしても驚かないでしょう。 元の 特定の問題に対して私が見つけることができる唯一の非常に高速な解決策は、ORDER BY句なしでしか機能しないため、この質問が生じました。以下は、問題を生成するために必要な完全なT-SQLと、提案するソリューションです(問題があれば、SQL Server 2008 R2を使用しています)。 --Create Orders table IF OBJECT_ID('tempdb..#Orders') IS NOT NULL DROP TABLE #Orders CREATE TABLE #Orders ( OrderID INT NOT NULL IDENTITY(1,1) , CustID INT NOT NULL , StoreID INT NOT NULL , Amount FLOAT NOT NULL …
24 sql-server 

9
T-SQLを使用して、文字列が回文であるかどうかをテストします
私はT-SQLの初心者です。入力文字列が回文であるかどうかを判断します。回文がそうでない場合はoutput = 0、そうでない場合はoutput = 1です。私はまだ構文を理解しています。エラーメッセージも表示されません。T-SQLがどのように機能するかについてのより良い理解と知識を獲得し、より良くなるために、さまざまなソリューションとフィードバックを探しています-私はまだ学生です。 私が見ているように、鍵となるアイデアは、左端と右端の文字を互いに比較し、等しいかどうかを確認し、次に左から2番目の文字と最後から2番目の文字を比較することです。ループを実行します。文字が互いに等しい場合、続行します。最後に到達した場合は1を出力し、そうでない場合は0を出力します。 批判してください: CREATE function Palindrome( @String Char , @StringLength Int , @n Int , @Palindrome BIN , @StringLeftLength Int ) RETURNS Binary AS BEGIN SET @ n=1 SET @StringLength= Len(String) WHILE @StringLength - @n >1 IF Left(String,@n)=Right(String, @StringLength) SET @n =n+1 SET @StringLength =StringLength -1 …

1
MongoDBに挿入が多すぎるとどうなりますか?すべてのデータが保存されていることを確認する方法は?
この質問は、データベース管理者のStack Exchangeで回答できるため、Server Faultから移行されました。 6年前に移行され ました。 MongoDBを使用して、定期的に測定された値を保存します。〜100ミリ秒ごとに、一連の値がドキュメントとして挿入されます。正常に動作しますが、パフォーマンスの問題が心配です。(私は安全な挿入を使用しますが、PyMongoではこれがデフォルトです。) mongodがハードディスクに保存できるよりも多くの挿入が毎秒ある場合はどうなりますか?警告はありますか、それとも単に黙って失敗しますか? 書き込み負荷を監視する方法はありますか?db.serverStatus().writeBacksQueued呼び出したときに常にfalseに設定されているものだけが見つかりました。書き込みキューを満たすために挿入する必要があるデータの量をどのようにテストできますか? mongostatロックを表示します。これは私が心配すべきことですか? insert query update delete getmore command flushes mapped vsize res faults locked db idx miss % qr|qw ar|aw netIn netOut conn repl time *117 *0 *0 *0 0 2|0 0 17.4g 35.3g 3.76g 0 .:6.5% 0 0|0 0|0 124b 6k 2 …
24 mongodb 

5
未使用のストアドプロシージャの特定
来年、私はいくつかのSQL Server環境をきれいにする取り組みを支援しています。 約10,000のストアドプロシージャがあり、そのうちの約1000のみが定期的に使用され、別の200程度がまれに使用されると推定されます。つまり、やるべきことがたくさんあります。 これらのデータベースとプロシージャにアクセスできる複数の部門とチームがあるため、常にプロシージャを呼び出しているわけではありません。つまり、どのプロシージャが呼び出されているかを判断する必要があります。それに加えて、数日ではなく、数か月でこれを判断します(いくつかの可能性を排除します)。 これに対する1つのアプローチは、を使用してSQL Server Profiler、どのプロシージャが呼び出されているかを追跡し、プロシージャが使用されているかどうかをマークしながら、それらをどのプロシージャのリストと比較するかです。それから、部門が叫んできた場合に備えて、プロシージャを別のスキーマに移動することができました。 Profilerここで最も効果的なアプローチを使用していますか?そして/またはあなたの誰かが似たようなことをして、これを行う別の方法/より良い方法を見つけましたか?

2
すべてのデータベースをダンプせずに、innodbファイルibdata1を縮小するにはどうすればよいですか?
InnoDBはすべてのテーブルを1つの大きなファイルに保存しますibdata1。 大きなテーブルを削除した後、ファイルはテーブルがどれほど大きくてもそのサイズを維持しています。データベース全体(合計で数百GBあります)をダンプして再インポートすることなく、そのファイルを圧縮するにはどうすればよいですか? 理由は、ドロップをまだロールバックできるからだと思います。私の場合、必要はありません。

4
row_to_jsonを使用してJSONを作成するときに属性に名前を設定します
一部の列に対してのみ関数をf1, f2, f3...使用する場合、デフォルト名を変更できrow_to_jsonますか? できます row_to_json(customers) 帰る {"id_customer":2,"first_name":"bla","last_name":"second_bla"} しかし、名前なしid_customerでのみが必要な場合は、使用する必要があります row_to_json(row(first_name, last_name)) そして、私は得る {"f1":"bla","f2":"second_bla"} そして、デフォルトの列名または独自の列名でこの結果を取得したいと思います。独自の複合型を作成して使用できることを知っています row_to_json(row(first_name, last_name))::my_custom_type しかし、そのタイプを作成せずにクエリ内で直接行うことはできませんか?
24 postgresql 

3
永続的な計算列のインデックスには、計算式の列を取得するためのキー検索が必要です
この質問は、データベース管理者のStack Exchangeで回答できるため、Stack Overflowから移行されました。 6年前に移行 。 私は単純に連結された列で構成されているテーブルに永続的な計算列を持っています、例えば CREATE TABLE dbo.T ( ID INT IDENTITY(1, 1) NOT NULL CONSTRAINT PK_T_ID PRIMARY KEY, A VARCHAR(20) NOT NULL, B VARCHAR(20) NOT NULL, C VARCHAR(20) NOT NULL, D DATE NULL, E VARCHAR(20) NULL, Comp AS A + '-' + B + '-' + C PERSISTED …

6
ライブ本番データベースのテーブルを変更する
この質問は、データベース管理者のStack Exchangeで回答できるため、Stack Overflowから移行されました。 7年前に移行され ました。 ほとんどの「人気のある」(MySQL、Postgres ...)データベースシステムは、稼働中の本番データベース上のテーブルの変更(列のタイプの追加、削除、変更など)をどのように処理しますか? 私が知って正しい方法は、バックアップのすべてのスケジュールのダウンタイムにあり、その後、変更を行うのですか。 しかし... ...現在のデータベースシステムは、これらのことを何も停止することなく「オンライン」で行うことをサポートしていますか (変更または削除されたばかりの列を参照するクエリを遅らせるだけの場合があります) そしてALTER TABLE...、ライブ実行中のデータベースで実行するとどうなりますか?これが発生すると、すべてが停止しますか?データが破損することはありますか?等 繰り返しますが、これらは私が遭遇するものであるため、私は主にPostgresまたはMySQLに言及しています。 (そして、はい、「正しい方法」を行う前にこれをしなければならなかったときはいつでも、物事をバックアップし、ダウンタインをスケジュールします。ダーティ」または「クイック、ライブ、ダーティ」スキーマ変更を実際にサポートしているDBシステムがある場合) 誰かがFacebookスクリプトからMySQLのオンラインスキーマ変更を提案しました(ここにチュートリアルとソースがあります)...それを行うための「ハッキング」方法のセットを自動化する良い方法のようです...誰もがそれを使用したことがあります生産に似た何か?

3
SQL Serverでスキーマを使用するためのベストプラクティスは何ですか?
SQL Serverスキーマの機能は理解していますが、ベストプラクティスは何ですか?確かに別のセキュリティレイヤーを提供し、データベース内のデータベースオブジェクトの論理的なグループ化を提供しますが、一般的なものは何ですか?私の経験では、多くの場合、カスタムメイドのスキーマがあまり利用されていません。これは典型的なものですか?カスタムスキーマを使用する頻度の低いシナリオですか?

3
「SELECT @@ IDENTITY」が小数を返すのはなぜですか?
Dapperを使用して、ASP.NET MVC 3(.NET 4.0)アプリケーションからSQL Server 2008 R2 Expressインスタンスに対して次のクエリを実行しています。 INSERT INTO Customers ( Type, Name, Address, ContactName, ContactNumber, ContactEmail, Supplier) VALUES ( @Type, @Name, @Address, @ContactName, @ContactNumber, @ContactEmail, @Supplier) SELECT @@IDENTITY への呼び出しconnection.Query<int>(sql, ...)は、無効なキャスト例外をスローしています。デバッグしましたが、DapperがGetValue返されたを呼び出す時点SqlDataReaderです。 の戻り値の型GetValueはObject、デバッガーショーでそれを検査し、それがボックス10進数であることを示します。 selectをに変更するとSELECT CAST(@@IDENTITY as int)、GetValueの戻り値はボックス化されたintになり、例外はスローされません。 Id列は間違いなくint型です。なぜSELECT @@IDENTITY小数を返すのですか? 追加情報: データベースは真新しいです。 Customersテーブルは、私がそれに追加した唯一のオブジェクトです。データベースには、他の(ユーザー)テーブル、ビュー、トリガー、またはストアドプロシージャはありません。 データベースには10行があり、IDは1,2,3,4,5,6,7,8,9,10です(つまり、列はintの制限を超えていません)。 私のテーブル定義は CREATE TABLE [dbo].[Customers]( [Id] [int] IDENTITY(1,1) …

7
選択サブクエリから複数の列を取得する
SELECT *, p.name AS name, p.image, p.price, ( SELECT ps.price FROM product_special ps WHERE p.id = ps.id AND ps.date < NOW() ORDER BY ps.priority ASC, LIMIT 1 ) AS special_price, ( SELECT ps.date FROM product_special ps WHERE p.id = ps.id AND ps.date < NOW() ORDER BY ps.priority ASC, LIMIT 1 …
24 subquery 

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