블로그 이미지
SQL Server VS. 석이 minsouk@hotmail.com MSSQL 쿼리성능 관련해 궁금한 사항이 있다면 언제나 누구나 TeamViewer + Line (네이버 japan 메신저) 에 minsouk1 추가 후 연락주세요~ 010-9967-0955 보미아빠

카테고리

보미아빠, 석이 (448)
밥벌이 (16)
싸이클 (1)
일상 (1)
Total216,192
Today9
Yesterday71

달력

« » 2018.08
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  

공지사항

'보미아빠, 석이'에 해당되는 글 448건

  1. 2018.07.10 telegram bot
  2. 2018.07.10 Task await
  3. 2018.05.29 function base n
  4. 2018.05.17 bmw ista+
  5. 2018.04.23 multikey dictionary
  6. 2017.12.30 1
  7. 2017.12.20 traceflag powershell 입력
  8. 2017.12.09 prepare in...
  9. 2017.11.23 mremoteng
  10. 2017.11.10 플랜 변경으로 인한 cpu 100% 를 막아보자

telegram bot

분류없음 / 2018.07.10 18:54

[bot 만들기]

텔레그램 안에서 BotFather 친구 맺음

/start

/newbot

yourbotname

yourbotname_bot



Use this token to access the HTTP API:

0000000:VVVhJhOKsTl_2Vppzc93OKsOd0PpLVcVZlM

For a description of the Bot API, see this page: https://core.telegram.org/bots/api


/token 

@yourbotname_bot





[그룹만들어 봇 초대하기]

인간 사용자가 그룹을 만들어

봇 사용자가 그룹을 찾아 들어감 Add to Group






[봇이 들어간 group 내 사용자 리스트 구하기]

https://api.telegram.org/bot00000000:fdsafdsafda_dsafdsafdas/getUpdates


id 양수는 개인

id 음수는 그룹




-- 이제 코딩 

https://github.com/TelegramBots/Telegram.Bot.Examples/blob/master/Telegram.Bot.Examples.Echo/Program.cs







using System;

using System.Collections.Generic;

using System.Diagnostics;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using Telegram.Bot;

using Telegram.Bot.Args;

using Telegram.Bot.Types.Enums;

using Telegram.Bot.Types.InlineQueryResults;

using Telegram.Bot.Types.ReplyMarkups;



namespace telegramtest2

{

    class Program

    {

        private static readonly TelegramBotClient Bot = new Telegram.Bot.TelegramBotClient("botid");

        //private static readonly TelegramBotClient Bot = new Telegram.Bot.TelegramBotClient("botid");

        static void Main(string[] args)

        {

            Bot.OnMessage += Bot_OnMessage;

            var me = Bot.GetMeAsync().Result;


            Console.Title = me.Username;

            //SendMsg(5646546464565, "메롱2");


            /// Recv Start

            Bot.StartReceiving();

            Console.ReadLine();

            /// Recv Stop

            Bot.StopReceiving();


            

            Console.ReadKey();

        }




        private static async void SendMsg(long chatId, string message)

        {

            await Bot.SendTextMessageAsync(chatId, message);

        }


        private static async void Bot_OnMessage(object sender, Telegram.Bot.Args.MessageEventArgs messageEventArgs)

        {

            var message = messageEventArgs.Message;


            if (message.Text.StartsWith("/cmd"))

            {

                Console.WriteLine(message.Chat.Id);

                Debug.WriteLine(message.Chat.Id);

                await Bot.SendTextMessageAsync(message.Chat.Id, "나한테 일시키기 마라");

            }

        }

    }


    

}

Posted by 보미아빠

Task await

분류없음 / 2018.07.10 15:18

    class Program

    {

        static void Main(string[] args)

        {

            List<Task<string>> lists = new List<Task<string>>();

            Program p = new Program();


            lists.Add(p.Run2());

            lists.Add(p.Run());


            foreach (var a in lists)

                a.Wait();  // 모두 기다리고 출력 


            foreach (var a in lists)

                Console.WriteLine(a.Result);  // 5초 응답 

                    

        }


        async Task<string> Run()

        {

            var a = Task.Delay(1000);

            var b = Task.Delay(1000);

            var c = Task.Delay(1000);

            var d = Task.Delay(1000);

            var e = Task.Delay(1000);


            await a;

            await b;

            await c;

            await d;

            await e;

            Thread.Sleep(3000);   // 전체 처리시간 4초 

            return DateTime.Now.ToString();


        }


        async Task<string> Run2()

        {

            await Task.Delay(1000);

            await Task.Delay(1000);

            await Task.Delay(1000);

            await Task.Delay(1000);

            await Task.Delay(1000);  // 전체 처리시간 5초

            

            return DateTime.Now.ToString();

        }

        

    }

Posted by 보미아빠

function base n

분류없음 / 2018.05.29 18:07

/****** Object:  UserDefinedFunction [dbo].[F_NUMERIC_TO_BASE_N]    Script Date: 5/29/2018 6:07:05 PM ******/

SET ANSI_NULLS ON

GO


SET QUOTED_IDENTIFIER ON

GO


create function [dbo].[F_NUMERIC_TO_BASE_N]

(

@Number numeric(32,0),

@Base int

)

returns varchar(110)

as


/*

Function: F_NUMERIC_TO_BASE_N


Function F_NUMERIC_TO_BASE_N converts a numeric(32,0) value, @Number,

to a string of digits in number base @Base,

where @Base is between 2 and 36.


Output digits greater than 9 are represented by

uppercase letters A through Z, where A = 10 through Z = 35.

 

If input parameter @Number is negative, the output string

will have a minus sign in the leftmost position.


Any non-null numeric(32,0) value for parameter @Number is valid:

-99999999999999999999999999999999 through

99999999999999999999999999999999.


If input parameters @Number or @Base are null,

or @Base is not between 2 and 36,

then the function returns a null value.

*/


begin


declare @Work_Number numeric(38,0)

declare @Modulus int

declare @Digits varchar(36)

declare @Output_String varchar(110)


if @Number is null or @Base is null or @Base < 2 or @Base > 36 

begin

return null

end


set @Digits = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'

set @Output_String = ''

set @Work_Number = @Number


while 1=1  

begin


Set @Modulus = convert(int,abs(@Work_Number-(round(@Work_Number/@Base,0,1)*@Base)))


set @Output_String = substring(@Digits,@Modulus+1,1) + @Output_String


set @Work_Number = round(@Work_Number/@Base,0,1)


if @Work_Number = 0 break

end -- end while


if @Number < 0 set @Output_String = '-'+@Output_String


return @Output_String


end

GO










declare @times bigint = 1

declare @top_count bigint = 1000


select  dbo.[F_NUMERIC_TO_BASE_N](@times * 100000000 + rn * 1000 , 32)

from 

(

select top (@top_count) row_number() over (order by (select 1)) rn 

from sysobjects a 

cross join sysobjects b 

cross join sysobjects c

) a



Posted by 보미아빠

bmw ista+

분류없음 / 2018.05.17 20:16

https://m.blog.naver.com/PostView.nhn?blogId=lauf1&logNo=220781453020&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F



ista-d torrent


Posted by 보미아빠

multikey dictionary

분류없음 / 2018.04.23 20:35

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;


namespace mtest2

{

    class Config

    {

        public class Item : IEquatable<Item>

        {

            private readonly string _X;

            private readonly string _Y;


            public Item(string x, string y)

            {

                _X = x;

                _Y = y;

            }


            public string X

            {

                get { return _X; }

            }


            public string Y

            {

                get { return _Y; }

            }


            public override int GetHashCode()

            {

                return _X.GetHashCode() ^ _Y.GetHashCode();

            }



            public bool Equals(Item other)

            {

                if (_X != other._X)

                    return false;


                return _Y == other._Y;

            }            


        }

    }

}




using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace mtest2
{
    class Program
    {
        static void Main(string[] args)
        {
            Dictionary<Config.Item, string> dicReloadedItems = new Dictionary<Config.Item, string>();
            Dictionary<Config.Item, string> dicCurrentItems = new Dictionary<Config.Item, string>();
            dicReloadedItems.Add(new Config.Item("1key", "1value"), "dic.1value");
            dicReloadedItems.Add(new Config.Item("2key", "2value"), "dic.2value");
            dicReloadedItems.Add(new Config.Item("3key", "3value"), "dic.3value");

            dicCurrentItems.Add(new Config.Item("3key", "3value"), "dic.3value");
            dicCurrentItems.Add(new Config.Item("4key", "4value"), "dic.4value");

            foreach (var dicReloadedItem in dicReloadedItems)
            {
                if (!dicCurrentItems.ContainsKey(dicReloadedItem.Key))
                {
                    Console.WriteLine(string.Format("a{0}, {1}", dicReloadedItem.Key.X, dicReloadedItem.Key.Y));
                }
            }
            Console.ReadKey();
        }
    }
}






//-----------------------------------------------------------------------------------------

// tuple 이용하기 .net 4.0 이상 조오타~~~

//-----------------------------------------------------------------------------------------


using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;


namespace mtest2

{

    class Program

    {

        static void Main(string[] args)

        {

            Dictionary<Tuple<string, string>, string> dicReloadedItems = new Dictionary<Tuple<string, string>, string>();

            Dictionary<Tuple<string, string>, string> dicCurrentItems = new Dictionary<Tuple<string, string>, string>();

            dicReloadedItems.Add(new Tuple<string, string>("1key", "1value"), "dic.1value");

            dicReloadedItems.Add(new Tuple<string, string>("2key", "2value"), "dic.2value");

            dicReloadedItems.Add(new Tuple<string, string>("3key", "3value"), "dic.3value");


            dicCurrentItems.Add(new Tuple<string, string>("3key", "3value"), "dic.3value");

            dicCurrentItems.Add(new Tuple<string, string>("4key", "4value"), "dic.4value");


            foreach (var dicReloadedItem in dicReloadedItems)

            {

                if (!dicCurrentItems.ContainsKey(dicReloadedItem.Key))

                {

                    Console.WriteLine(string.Format("a{0}, {1}", dicReloadedItem.Key.Item1, dicReloadedItem.Key.Item2));

                }

            }

            Console.ReadKey();

        }

    }

}



Posted by 보미아빠

1

분류없음 / 2017.12.30 02:03

https://youtu.be/FK2k1JSrRE0

Posted by 보미아빠

디폴트 인스턴스에 모든 traceflag 를 다 지우고 변수에 있는것들만 추가해준다. 


#Get SQL Server Instance Path:

$TraceFlags = "-T1117 -T1118"

$SQLService = "SQL Server (MSSQLSERVER)"; 

$SQLInstancePath = "";

$SQLServiceName = ((Get-Service | WHERE { $_.DisplayName -eq $SQLService }).Name).Trim();

If ($SQLServiceName.contains("`$")) { $SQLServiceName = $SQLServiceName.SubString($SQLServiceName.IndexOf("`$")+1,$SQLServiceName.Length-$SQLServiceName.IndexOf("`$")-1) }

foreach ($i in (get-itemproperty "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server").InstalledInstances)

{

  If ( ((Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL").$i).contains($SQLServiceName) ) 

  { $SQLInstancePath = "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\"+`

  (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL").$i}

$SQLInstancePath


#Delete All Param

$ParamCount = (Get-ItemProperty "$SQLInstancePath\MSSQLServer\Parameters" | Select SQLArg*  | Format-List | Out-String ).Split(":").Count -8

for ($i=0; $i -le $ParamCount; $i++)

{

    $ParamNumber = $i + 3

    Remove-ItemProperty -Path "$SQLInstancePath\MSSQLServer\Parameters" -Name ("SQLArg$ParamNumber") 

}


#Add New Param 

$ParamNumber = 3

$TraceFlags.Split(" ") | ForEach {

    $ParamValue = "$_"

    New-ItemProperty -Path "$SQLInstancePath\MSSQLServer\Parameters" -Name ("SQLArg$ParamNumber") -Value $ParamValue -PropertyType String -Force | Out-Null

    $ParamNumber++

}

(Get-ItemProperty "$SQLInstancePath\MSSQLServer\Parameters" | Select SQLArg*  | Format-List | Out-String ).trim() -replace "SQLArg","`tSQLArg"


Posted by 보미아빠

prepare in...

분류없음 / 2017.12.09 11:00
PreparedStatement statement = connection.prepareStatement("Select * from test where field in (?)");
Array array = statement.getConnection().createArrayOf("VARCHAR", new Object[]{"A1", "B2","C3"});
statement.setArray(1, array);
ResultSet rs = statement.executeQuery();


Posted by 보미아빠

mremoteng

분류없음 / 2017.11.23 10:23

https://github.com/mRemoteNG/mRemoteNG/wiki/Common-External-Tool-Configurations

Posted by 보미아빠

oltp 서버에서는 traceflag 4136을 추천한다. 

그러면, 최소한 가만히 있던 서버가 플랜이 바뀌어 cpu 를 100% 사용하는 일은 없어질것이다. 



-- ------------------------------------

-- 데이터 생성 시작 

-- ------------------------------------

use master

go


if db_id('plan_test') is not null

begin

alter database plan_test set single_user with rollback immediate 

drop database plan_test  

end 


create database plan_test

go


use plan_test 

go


if object_id('t_product') is not null

drop table t_product 

go


-- 샵2개 상품 각 10만개 , 샵 100만개 넣어도 됨 하고 싶으면...

with temp as

(

select 

top 200000 cast(row_number() over (order by (select 1)) as int) idx

, cast('contents other column' as char(400)) contentOtherCol

from sys.objects a1

cross join sys.objects a2

cross join sys.objects a3

cross join sys.objects a4

cross join sys.objects a5

)

select 

idx

, cast(abs(checksum(newid())) % 2 as int) shopid

, cast(abs(checksum(newid())) % 100000 as int) productid

, contentOtherCol

into t_product

from temp

go


create clustered index cl_t_product on t_product (shopid, productid) 

go


if object_id('t_img') is not null

drop table t_img 

go


-- 샵과 상품으로 연결되는 이미지 1만개 type 은 모두 1, 다른거 100만개 넣어도 됨. 하고 싶으면 ...

with temp as

(

select 

top 10000 cast(row_number() over (order by (select 1)) as int) idx

, cast('img other column' as char(400)) imgOtherCol

from sys.objects a1

cross join sys.objects a2

cross join sys.objects a3

cross join sys.objects a4

cross join sys.objects a5

)

select 

idx

, cast(abs(checksum(newid())) % 2 as int) shopid

, cast(abs(checksum(newid())) % 100000 as int) productid

, 1 as imgType

, imgOtherCol

into t_img

from temp

go


create clustered index cl_t_img on t_img (imgType, shopid, productid) 

go


-- ------------------------------------

-- 데이터 생성 끝 

-- ------------------------------------



-- ------------------------------------

-- 생성된 데이터 보기 시작 

-- ------------------------------------

dbcc show_statistics (t_product, cl_t_product)

dbcc show_statistics (t_img, cl_t_img)

select top 10 * from t_product 

select top 10 * from t_img 


-- ------------------------------------

-- 생성된 데이터 보기 끝

-- ------------------------------------


if object_id('a') is null

exec ('create proc a as select 1')

go


alter proc a

  @shopid int

, @productid int

as 

select top 1 *

from 

(

select top 1 shopid, productid

from t_img 

where 

shopid = @shopid 

and productid < @productid 

and imgType = 1 

order by productid desc 

) a

left join t_product b

on a.shopid = b.shopid 

and a.productid = b.productid 

go


-- ------------------------------------

-- 테스트 스크립트 시작 

-- ------------------------------------

set statistics io on 

-- 정상적인 경우 

exec a 1, 10000 -- 1번 shop 은 물건이 많고 상대적으로 많은 쿼리가 들어오고 있음 그러므로 첫 번째 컴파일 될 확율이 높음

exec a 3, 1 -- 이렇게 컴파일된 쿼리는 통계에 없는 변수가 들어와도 충분히 쓸만한 플랜임 


-- 첫 변수를 통계에 없는 shopid 를 넣어 컴파일 한 경우, 성능에 심각한 오류가 생김 

dbcc freeproccache 

exec a 3, 1 -- 3번 샵은 신규 샵으로 상품이 적음 3번 샵과 1번으로 쿼리가 들어오면 아주 좋은 플랜임 

exec a 1, 10000 -- 그러나 상품이 많은 1번 샵을 처리하기에는 부적합한 플랜임 

                -- 플랜 리뷰 및 설명 

-- ------------------------------------

-- 테스트 스크립트 끝

-- ------------------------------------


-- ------------------------------------

-- work around 1  (뷰 안의 변수가 쿼리 외부로 나오지 못하게 강제로 막음)

-- ------------------------------------

go

alter proc a

  @shopid int

, @productid int

as 

select top 1 *

from 

(

select top 1 shopid, productid % productid + productid as productid2 -- join 될 컬럼은 가공해 마지막 값만 = 비교가 일어날 수 있도록 바꾸어줌 

from t_img 

where 

shopid = @shopid 

and productid < @productid 

and imgType = 1 

order by productid desc -- sort 는 내부 컬럼을 그대로 이용해 인덱스를 이용한 소트를 사용 가능하게 만들어줌 

) a

left join t_product b

on a.shopid = b.shopid 

and a.productid2 = b.productid 

go


-- ------------------------------------

-- work around 2 (optimize for unknown 으로 histogram 을 보지 못하게 쿼리 하도록 함)

-- ------------------------------------

go

alter proc a

  @shopid int

, @productid int

as 

select top 1 *

from 

(

select top 1 shopid, productid

from t_img 

where 

shopid = @shopid 

and productid < @productid 

and imgType = 1 

order by productid desc 

) a

left outer join t_product b

on a.shopid = b.shopid 

and a.productid = b.productid 

option (OPTIMIZE FOR unknown)

go


-- ------------------------------------

-- work around 3 (querytraceon 4136을 이용해 ontimize for unknown 과 같은 효과를 query, instance 내 공통 적용 가능하게 만들 수 있음)

                 (database level 로 적용할 경우 2016부터... ALTER DATABASE SCOPED CONFIGURATION SET PARAMETER_SNIFFING = OFF;)

(요즘 추세가 azure 가 나오면서 database level 로 옵션을 변경할 수 있게 바뀌고 있음) 

(https://www.mssqltips.com/sqlservertip/4245/sql-server-2016-database-scoped-configuration-options/)

-- ------------------------------------


alter proc a

  @shopid int

, @productid int

as 

select top 1 *

from 

(

select top 1 shopid, productid

from t_img 

where 

shopid = @shopid 

and productid < @productid 

and imgType = 1 

order by productid desc 

) a

left outer join t_product b

on a.shopid = b.shopid 

and a.productid = b.productid 

option (querytraceon 4136)

go


-- ------------------------------------

-- 다른 시나리오 

-- ------------------------------------


drop index t_product.cl_t_product 

create nonclustered index nc_t_product_01 on t_product (shopid) 



if object_id('c') is null

exec ('create proc c as select 1')

go


alter proc c

@shopid int

as 

declare @c varchar(max) =N''

select @c = contentOtherCol

from t_product                                                                                                                                                                                                                                                                                                                

where shopid = @shopid

select @c

go



alter proc c

@shopid int

as 

declare @c varchar(max) =N''

select @c = contentOtherCol

from t_product                                                                                                                                                                                                                                                                                                                

where shopid = @shopid

option (OPTIMIZE FOR unknown)

select @c

go


-- ------------------------------------

-- 테스트 스크립트 시작 

-- ------------------------------------


-- 문제없는 컴파일 순서 

exec c 1

exec c 3


-- 성능이 나빠지는 컴파일 순서 

-- 그러나 변수 3에 대해서는 플랜이 좋음 이 모든건 histogram 을 보고 컴파일하는 parameter sniffing 문제임 

exec c 3

exec c 1


-- ------------------------------------

-- 테스트 스크립트 끝

-- ------------------------------------



-- ------------------------------------

-- 다른 시나리오 

-- ------------------------------------

create nonclustered index nc_t_product_01 on t_product (productid) 

go


if object_id('b') is null

exec ('create proc b as select 1')

go


alter proc b

@productid int

as 

declare @c varchar(max) =N''

select @c = contentOtherCol

from t_product 

where productid < @productid 

select @c 

go


dbcc freeproccache 

set statistics io on 

set statistics time on 

set statistics profile off

go



alter proc b

@productid int

as 

declare @c varchar(max) =N''


select @c = contentOtherCol

from t_product 

where productid < @productid 

option (OPTIMIZE FOR unknown)

select @c 

go



exec b 1

exec b 100000

go



Posted by 보미아빠

최근에 달린 댓글

최근에 받은 트랙백

글 보관함