タグ付けされた質問 「sql-server」

Microsoft SQL Serverのすべてのバージョン(MySQL以外)。sql-server-2016のようなバージョン固有のタグも追加してください。これは、質問に関連することが多いためです。

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' …

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]( …

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 …

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 * …

3
高選択性フィールドと低選択性フィールドを持つ複合インデックス順のフィールド順
30億行を超えるSQL Serverテーブルがあります。クエリの1つに非常に長い時間がかかるため、最適化を検討しています。クエリは次のようになります。 SELECT [Enroll_Date] ,Count(*) AS [Record #] ,Count(Distinct UserID) AS [User #] FROM UserTable GROUP BY [Enroll_Date] [Enroll_Date]は選択可能な値が50未満の選択性の低い列ですが、UserID列は2億を超える個別の値を持つ選択性の高い列です。私の研究に基づいて、私はこれらの2つの列に非クラスター化複合インデックスを作成する必要があると考えています。理論的には、高選択性の列が最初の列である必要があります。しかし、私の場合、group by句で低選択性カラムを使用しているため、うまくいくかどうかはわかりません。 このテーブルにはクラスター化インデックスがありません。

1
インデックスシークが正しい行数を推定でき、ソート演算子が推定できないのはなぜですか?
次のような述語の関数を使用するクエリがあります。 commentType = 'EL' AND commentDateTime >= DATEADD(month,datediff(month,0,getdate()) - 13,0) 40000行のcommentTypeにフィルター処理されたインデックスがあり、クエリを実行すると、インデックスシークの推定行数は非常に正確(約11K)ですが、次のステップ(ソート演算子)では、統計を完全に無視し、フィルターされたインデックスの行の総数を推定するだけです。 なんでこんなことが起こっているの?私はsargabilityの基本を知っており、正気を期すために、dateaddを実際の日付(2014-01-01)と実際の日付で置き換えてテストしました...ソートは行数を正しく推測し始めました... なぜこれが起こっているのですか、どうすれば修正できますか?決まった日を渡すことはできません...

1
sp_AskBrentの出力をエクスポートする方法
CPUをランダムにスパイクするインスタンスがあります。CPUで90%を超えて起動し、実行するジョブを自動的に呼び出しsp_AskBrentて出力をメールで送信するアラートを作成します。ただし、テキストまたはHTML出力では、出力を読み取ることができません。それはExcelスプレッドシートにもうまく行きません。読みやすい形式で情報を取得するにはどうすればよいですか?

2
SELECT…WITH XLOCKを使用する理由は何ですか?
私はいくつかの再発するデッドロックに直面しています。そのうちの1つはキーロックであり、デッドロックの犠牲になるXLOCKヒントを含むSELECTクエリが含まれています。もう1つのステートメントは、最初のクエリのビューの一部であるテーブルの1つへのINSERTです。 見る: create view dbo.viewE as select * from dbo.E where myValue > 13000 クエリを選択: select * from dbo.viewE with (XLOCK) where A > GETUTCDATE() INSERTステートメント: INSERT INTO [dbo].[E] (myValue,A) VALUES (10,GetDate()) 基になるテーブルdbo.Eは、約20列に約300万行を保持しています。それらの一部はntextです。 クエリを取り出し、2つのトランザクションで手動でシミュレーションすると、動作は再現可能です。XLOCKが選択から削除されると、動作が変わります。 デッドロックグラフ: <deadlock-list> <deadlock victim="process222222221"> <process-list> <process id="process222222221" taskpriority="0" logused="0" waitresource="KEY: 5:72057604035644444 (ccdf51accc0c)" waittime="2522" ownerId="27202256401" transactionname="SELECT" lasttranstarted="2015-09-14T16:32:36.160" …

2
DATALENGTHの合計がsys.allocation_unitsのテーブルサイズと一致しません
DATALENGTH()テーブル内のすべてのレコードのすべてのフィールドを合計すると、テーブルの合計サイズが得られるという印象を受けました。私は間違っていますか? SELECT SUM(DATALENGTH(Field1)) + SUM(DATALENGTH(Field2)) + SUM(DATALENGTH(Field3)) TotalSizeInBytes FROM SomeTable WHERE X, Y, and Z are true 以下のクエリを使用して(オンラインから取得してテーブルサイズ、クラスター化インデックスのみを取得し、NCインデックスは含まない)、データベース内の特定のテーブルのサイズを取得しました。請求のために(部門に使用するスペースの量に応じて部門に請求します)、この表で各部門が使用したスペースの量を把握する必要があります。テーブル内の各グループを識別するクエリがあります。各グループがどれだけのスペースを使用しているかを知る必要があります。 1行あたりのスペースVARCHAR(MAX)は、テーブル内のフィールドが原因で大きく変動する可能性があるため、平均サイズ*部門の行の比率を取得することはできません。DATALENGTH()上記のアプローチを使用すると、以下のクエリで使用される合計スペースの85%しか取得できません。考え? SELECT s.Name AS SchemaName, t.NAME AS TableName, p.rows AS RowCounts, (SUM(a.total_pages) * 8)/1024 AS TotalSpaceMB, (SUM(a.used_pages) * 8)/1024 AS UsedSpaceMB, ((SUM(a.total_pages) - SUM(a.used_pages)) * 8)/1024 AS UnusedSpaceMB FROM sys.tables t with …

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