データベース管理者

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

3
WHERE句の変数でnullチェックを行う方法は1回だけですか?
次のような大きなテーブルに対するクエリがあります。 declare @myIdParam int = 1 select * from myTable where (@myIdParam is null or myTable.Id = @myIdParam) where句には、このような同様の条件がいくつかあり、結合も多数ありますが、これは要約です。 事実上、@ myIdParamがnullの場合、このパラメーターを使用して結果を制限する必要はありません。 私はDBプロではありませんが、私のテストから、このNULLチェックはすべてのレコードに対して行われ、どのような方法でも最適化されていないようです。 nullチェックを削除し、パラメーターがnullではないと想定すると、クエリは即座に返されます。それ以外の場合は、最大10秒かかります。 これを最適化する方法があるので、チェックは実行時に一度だけ行われますか?
11 sql-server  null 

1
SQL Serverストアドプロシージャの名前付け
ストアドプロシージャにと名前を付け始めました[16_TestStoredProc]。このようなストアドプロシージャの名前に影響はありますか? なぜこれを行っているのかは説明しません。私がこれに問題を抱えているわけではありませんが、何らかの影響があります。

4
SQL Serverが単純なバイジェクションでインデックスを使用できない
これは別のクエリオプティマイザーの難問です。 たぶん私はクエリオプティマイザーを過大評価しているのかもしれませんし、何か不足しているかもしれません。 シンプルなテーブルがあります CREATE TABLE [dbo].[MyEntities]( [Id] [uniqueidentifier] NOT NULL, [Number] [int] NOT NULL, CONSTRAINT [PK_dbo.MyEntities] PRIMARY KEY CLUSTERED ([Id]) ) CREATE NONCLUSTERED INDEX [IX_Number] ON [dbo].[MyEntities] ([Number]) インデックスとそこに数千行あり、Number値0、1、2に均等に分散されています。 今、このクエリ: SELECT * FROM (SELECT [Extent1].[Number] AS [Number], CASE WHEN (0 = [Extent1].[Number]) THEN 'one' WHEN (1 = [Extent1].[Number]) THEN 'two' …

2
異なる属性セットを持つことができるエンティティタイプをモデル化する方法は?
ユーザーとアイテムの間に1対多(1:M)の関係を持つデータベースを再作成するときに問題が発生します。 これはかなり簡単です、はい。ただし、各アイテムは特定のカテゴリ(たとえば、Car、Boat、Plane)に属しており、各カテゴリには特定の数の属性があります。 Car 構造: +----+--------------+--------------+ | PK | Attribute #1 | Attribute #2 | +----+--------------+--------------+ Boat 構造: +----+--------------+--------------+--------------+ | PK | Attribute #1 | Attribute #2 | Attribute #3 | +----+--------------+--------------+--------------+ Plane 構造: +----+--------------+--------------+--------------+--------------+ | PK | Attribute #1 | Attribute #2 | Attribute #3 | Attribute #4 | +----+--------------+--------------+--------------+--------------+ …

1
このシナリオではどのインデックスが使用されますか?
SQL Server 2014 Standard Edition 特定の都市を発着する特定の月のフライト数を調べる必要があります。例えば select count(*) from flights where flightTo_AirportCode = 'aaaa' and flightFrom_Airportcode = 'bbbb' and flightdate < '2016-04-01' and flightdate > '2016-02-28' ; テーブルスキーマは次のとおりです。 インデックスmodelAまたはインデックスmodelB(下記)が望ましいかどうかを推定しようとしています(インデックスの作成には何時間もかかり、ディスクスペースでは一度に1つしか存在できないため、跳躍する前に調べます)。 私の経験では、どちらのインデックスでも十分です。私は正しいですか? create index [modelA] on flights (flightTo_AirportCode, flightFrom_AirportCode, flightDate) create index [modelB] on flights (flightDate, flightTo_AirportCode, flightFrom_AirportCode) (または、より良い、これに取り組むために使用できるバイナリインデックスまたは高度なメカニズムはありますか?) CREATE TABLE [dbo].[flights]( …

2
PostgreSQL:関数の引数としてテーブルを渡します
TYPEPostgreSQLで発見しています。私はTABLE TYPEいくつかのテーブルが尊重しなければならないことを持っています(インターフェース)。例えば: CREATE TYPE dataset AS( ChannelId INTEGER ,GranulityIdIn INTEGER ,GranulityId INTEGER ,TimeValue TIMESTAMP ,FloatValue FLOAT ,Status BIGINT ,QualityCodeId INTEGER ,DataArray FLOAT[] ,DataCount BIGINT ,Performance FLOAT ,StepCount INTEGER ,TableRegClass regclass ,Tags TEXT[] ,WeightedMean FLOAT ,MeanData FLOAT ,StdData FLOAT ,MinData FLOAT ,MaxData FLOAT ,MedianData FLOAT ,Percentiles FLOAT[] ); このテンプレートを使用してテーブルを作成できます: CREATE TABLE …

3
ユーザーが多い場合、DROP USERに時間がかかりすぎる
十分なRAMと高速ディスクを備えたSQL Server 2014インスタンスでは、データベースにアクセスできるユーザーが160人以上います。なんらかの理由で私にはわからないためDROP USER [username]、このデータベースでコマンドを実行すると、ユーザーあたり最大5秒かかります。 ログインへのユーザーの再マッピングと権限の復元は非常に高速です。 本番環境からDEVデータベースを更新するという状況では、すべてのデータベースユーザーを削除して再作成する必要があります。したがって、データベースユーザーを削除して再作成する必要があります。 DROP USERコマンドを高速化するにはどうすればよいですか? 私が書いているインスタンスでは、160回以上実行する必要があることを覚えておいてください。 これは私が使っているSQLです: DECLARE drop_user_cur CURSOR FOR SELECT name FROM #drop_users OPEN drop_user_cur FETCH NEXT FROM drop_user_cur INTO @user WHILE @@FETCH_STATUS = 0 BEGIN SET @sql = 'use [' + @db_name + '] DROP USER [' + @user + ']' BEGIN TRY …

2
奇数ストリームの集計動作
クエリ: declare @X xml = ' <item ID = "0"/> <item ID = "1"/> <item/> <item/>'; select I.X.value('@ID', 'int') from @X.nodes('/item') as I(X); 結果: ----------- 0 1 NULL NULL 実行計画: 上のブランチはXMLを4行に細断し、下のブランチは属性の値をフェッチしますID。 奇妙に感じるのは、Stream Aggregateオペレーターから返される行の数です。Filterからの2つの行は、XMLのID最初と2番目のitemノードの属性です。Stream Aggregateは、各入力行に1つずつ、4つの行を返し、内部結合を外部結合に効果的に変換します。 これは、Stream Aggregateが他の状況でも行うことですか、それともXMLクエリを実行するときに奇妙なことですか? XMLバージョンのクエリプランで、このStream Aggregateの動作が以前に気付いた他のどのStream Aggregateとも異なるはずであるというヒントはありません。

1
CEILINGを使用するとCASE式が誤った値を返す
CASE式が期待どおりの結果を返さないという問題に遭遇しました。 テストとして、10進数の変数を追加して同じCASE式を実行し、期待どおりに結果を返します(IsGun=1ただし、の場合は値を切り上げます。ただし、同じCASE式を別の10進数の値に対して実行すると、常に戻りますCEILING()関数の値であり、元の値を返すことはありません。 SQLコードは次のとおりです。 DECLARE @Num decimal(8,2); set @Num = 12.54; WITH PQ AS ( SELECT UPC, Price1, DBID, AVG(Price1) OVER (PARTITION BY UPC) AS Price1Avg FROM vProducts_PriceQty_Union ) SELECT PQ.UPC, PQ.Price1, PQ.Price1Avg, (CASE WHEN p.IsGun = 1 THEN CEILING(@Num) ELSE @Num END) AS UsingVar, CAST( (CASE WHEN P.IsGun = 1 …

3
分析クエリのMDXとSQLの良い例
分析クエリを実行するときに、通常のSQLよりもMDXが優れている例を誰かに教えてもらえますか?MDXクエリを、同様の結果が得られるSQLクエリと比較したいと思います。 ウィキペディアは言う: これらの一部を従来のSQLに変換することは可能ですが、非常に単純なMDX式の場合でも、不格好なSQL式の合成が必要になることがよくあります。 しかし、引用も例もありません。基礎となるデータを異なる方法で整理する必要があること、およびOLAPでは挿入ごとにより多くの処理とストレージが必要になることを十分に認識しています。(私の提案は、Oracle RDBMSからApache Kylin + Hadoopに移行することです) コンテキスト: OLTPデータベースではなくOLAPデータベースにクエリを実行する必要があることを会社に納得させようとしています。ほとんどのSIEMクエリは、group-by、sort、aggregationを頻繁に使用します。パフォーマンスの向上に加えて、OLAP(MDX)クエリは、同等のOLTP SQLよりも簡潔で読み書きも簡単だと思います。具体例は要点を突き止めるだろうが、私はSQLの専門家ではなく、MDXははるかに少ない... 役立つ場合は、過去1週間に発生したファイアウォールイベント用のサンプルSIEM関連SQLクエリを次に示します。 SELECT 'Seoul Average' AS term, Substr(To_char(idate, 'HH24:MI'), 0, 4) || '0' AS event_time , Round(Avg(tot_accept)) AS cnt FROM ( SELECT * FROM st_event_100_#yyyymm-1m# WHERE idate BETWEEN trunc(sysdate, 'iw')-7 AND trunc(sysdate, 'iw')-3 #stat_monitor_group_query# UNION ALL SELECT * FROM st_event_100_#yyyymm# …
11 olap  mdx 

5
日付範囲を間隔の説明に変換する
最近のプロジェクトの要件は、リソースが完全に消費される時期を報告することでした。枯渇カレンダーの日付だけでなく、残り時間を「1年3か月」のように英語のような形式で表示するように求められました。 組み込みDATEDIFF関数 指定された開始日と終了日の間で交差する指定された日付部分の境界の数...を返します。 そのまま使用すると、誤解を招く、または紛らわしい結果が生じる可能性があります。たとえば、YEARの間隔を使用すると、1999-12-31(YYYY-MM-DD)と2000-01-01が1年離れていることが示されますが、これらの日付は1日だけ離れていると常識的に考えられます。逆に、DAY 1999-12-31と2010-12-31の間隔を使用すると、4,018日で区切られますが、ほとんどの人は「11年」をより適切に説明します。 日数から開始して、そこから月と年を計算すると、うるう年と月のサイズのエラーが発生しやすくなります。 これをさまざまなSQL方言でどのように実装できるのか疑問に思いました。出力例は次のとおりです。 create table TestData( FromDate date not null, ToDate date not null, ExpectedResult varchar(100) not null); -- exact formatting is unimportant insert TestData (FromDate, ToDate, ExpectedResult) values ('1999-12-31', '1999-12-31', '0 days'), ('1999-12-31', '2000-01-01', '1 day'), ('2000-01-01', '2000-02-01', '1 month'), ('2000-02-01', '2000-03-01', '1 month'), -- …

1
ファイルグループの利点とファイルグループを読み取り専用に設定
複数のファイルグループを読み取り専用に変更するのが適切なオプションであり、それらをいつ使用するべきかについて、誰かが実際のシナリオを引用してくれませんか?読み取り専用に設定するとどのようなメリットがありますか? 複数のファイルグループを持つデータベースでは、データベース全体のバックアップを実行し、そのファイルグループの各ファイルもバックアップする必要がありますか。ファイルグループバックアップが使用される場合の例も教えてください。データベース全体をバックアップできるのに、ファイルグループをバックアップすることが有益である理由はわかりません。このファイルグループのバックアップが理想的な実世界での体験が得られることを願っています

4
「Id」の形式:YYYYNNNNNN、NNNNNNパートは毎年再開
Invoiceテーブルの各レコードがYYYYNNNNNNのようなIDを持つというビジネス要件があります。 NNNNNN部分は、毎年初めに再始動する必要があります。したがって、2016年に入力された最初の行は2016000001のようになり、2番目は2016000002のようになります。2016の最後のレコードが2016123456だったとします。(2017の)次の行は2017000001のようになります。 このIDを主キーにする必要はなく、作成日も保存します。アイデアは、この「表示ID」は一意であり(それでクエリできるため)、年ごとに人間でグループ化できるということです。 レコードが削除されることはほとんどありません。しかし、私はそのようなものに対して防御的にコーディングする傾向があります。 今年、新しい行を挿入するたびに最大IDを照会しなくても、このIDを作成できる方法はありますか? アイデア: その年CreateNewInvoiceSPのMAX値を取得するA (yucky) これを正確に行うためのいくつかの魔法の組み込み機能(私は夢を見ることができます) IDENTITYor DEFAULT宣言でUDFまたは何かを指定できること(??) を使用するビューPARTITION OVER + ROW()(削除すると問題が発生します) トリガーINSERT(まだMAXクエリを実行する必要があります:() 毎年のバックグラウンドジョブで、毎年挿入されるMAXを使用してテーブルを更新しました。 これらはすべて、理想的ではありません。どんなアイデアやバリエーションでも大歓迎です!
11 sql-server  t-sql 

3
T-SQLのTheil-Sen推定関数
T-SQLで書かれたTheil-Sen回帰関数を持っている人はいますか? Perlで書かれたものを見つけましたが、SQLに再コードすることができません。

5
UNKNOWNを返すことができるブール式を反転します
例 テーブルがあります ID myField ------------ 1 someValue 2 NULL 3 someOtherValue そして、TRUE、FALSE、または(SQLの3値論理による)UNKNOWNに評価できるT-SQLブール式: SELECT * FROM myTable WHERE myField = 'someValue' -- yields record 1 他のすべてのレコードを取得する場合、式を単純に否定することはできません SELECT * FROM myTable WHERE NOT (myField = 'someValue') -- yields only record 3 なぜこれが発生するのか(3値論理)、この特定の問題を解決する方法を知っています。 私は使用できることを知ってmyField = 'someValue' AND NOT myField IS NULLおり、不明な結果を決してもたらさない「可逆」式を取得します。 SELECT * …

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